ReactOS 0.4.16-dev-1260-g901af6a
regtreeoptions.cpp
Go to the documentation of this file.
1/*
2 * PROJECT: browseui
3 * LICENSE: LGPL-2.1+ (https://spdx.org/licenses/LGPL-2.1+)
4 * PURPOSE: Common registry based settings editor
5 * COPYRIGHT: Copyright 2024 Whindmar Saksit <whindsaks@proton.me>
6 */
7
8#include "precomp.h"
9
10#define HKEY_GRAYED HKEY_REGTREEOPTION_GRAYED
11#define MAXVALUEDATA 100 // Max size for CheckedValue/UncheckedValue/DefaultValue
12
13enum {
24};
25
27
29{
30 BITMAPINFO bi;
31 PVOID pvBits;
32
33 ZeroMemory(&bi, sizeof(bi));
34 bi.bmiHeader.biSize = sizeof(bi.bmiHeader);
35 bi.bmiHeader.biWidth = cx;
37 bi.bmiHeader.biPlanes = 1;
40 return CreateDIBSection(hDC, &bi, DIB_RGB_COLORS, &pvBits, NULL, 0);
41}
42
44{
45 enum { bpp = 32 };
47 HIMAGELIST hIL = ImageList_Create(ImageSize, ImageSize, ILC_MASK | bpp, 8, 0);
48 if (!hIL)
49 return hIL;
50
51 INT BorderSize = max(1, min(ImageSize / 16, 4));
52 RECT Rect;
54
55 HBITMAP hbmMask = CreateBitmap(ImageSize, ImageSize, 1, 1, NULL);
56 Failed |= hbmMask == NULL;
57
58 HBITMAP hbmData = CreatDibBitmap(hDC, ImageSize, ImageSize, bpp);
59 Failed |= hbmData == NULL;
60
61 const HGDIOBJ hbmOld = SelectObject(hDC, hbmMask);
62 Failed |= hbmOld == NULL;
63
64 // Create the check images
65 SetRect(&Rect, 0, 0, ImageSize, ImageSize);
67 InflateRect(&Rect, -BorderSize, -BorderSize);
69
70 SelectObject(hDC, hbmData);
73 Failed |= ImageList_Add(hIL, hbmData, hbmMask) < 0;
75 Failed |= ImageList_Add(hIL, hbmData, hbmMask) < 0;
77 Failed |= ImageList_Add(hIL, hbmData, hbmMask) < 0;
79 Failed |= ImageList_Add(hIL, hbmData, hbmMask) < 0;
80
81 // Create the radio images
82 SelectObject(hDC, hbmMask);
83 SetRect(&Rect, 0, 0, ImageSize, ImageSize);
85 InflateRect(&Rect, -BorderSize, -BorderSize);
87
88 SelectObject(hDC, hbmData);
91 Failed |= ImageList_Add(hIL, hbmData, hbmMask) < 0;
93 Failed |= ImageList_Add(hIL, hbmData, hbmMask) < 0;
95 Failed |= ImageList_Add(hIL, hbmData, hbmMask) < 0;
97 Failed |= ImageList_Add(hIL, hbmData, hbmMask) < 0;
98
99 SelectObject(hDC, hbmOld);
100 DeleteObject(hbmMask);
101 DeleteObject(hbmData);
102 DeleteDC(hDC);
103 if (Failed)
104 {
106 hIL = NULL;
107 }
108 return hIL;
109}
110
112{
113 switch (Type)
114 {
115 case REG_EXPAND_SZ: return REG_SZ;
116 case REG_DWORD: return REG_BINARY;
117 default: return Type;
118 }
119}
120
122{
123 DWORD Size = sizeof(*Data);
125}
126
128{
129 DWORD Data = Default, Size = sizeof(Data);
131 return Err ? Default : Data;
132}
133
135{
136 DWORD Size = cchBuffer * sizeof(*Buffer);
138 return Err ? HRESULT_FROM_WIN32(Err) : Size / sizeof(*Buffer);
139}
140
142{
143 WCHAR Path[MAX_PATH + 42];
144 if (GetRegString(hKey, Name, Path, _countof(Path)) > 0) // Will %expand% for us
145 {
147 HICON hIcon = NULL;
148 if (ExtractIconExW(Path, idx * -1, NULL, &hIcon, 1)) // Note: Index/Id is opposite of DefaultIcon style
149 {
152 if (idx != -1)
153 return idx;
154 }
155 }
156 return I_IMAGENONE;
157}
158
160{
161 DWORD Err = SHRegGetValueW(hKey, NULL, L"DefaultValue", SRRF_RT_ANY, &Type, Data, &Size);
162 return HRESULT_FROM_WIN32(Err);
163}
164
166{
167 HRESULT hr;
168 UINT SysParam = GetRegDWORD(hKey, Set ? L"SPIActionSet" : L"SPIActionGet", DWORD(0));
169 if (SysParam)
170 {
171 Size = sizeof(BOOL);
172 Type = REG_DWORD;
174 return S_OK;
175 }
176
177#if 0 // TODO
178 // learn.microsoft.com/en-us/windows/win32/api/shobjidl_core/nn-shobjidl_core-iregtreeitem
179 CLSID clsid;
180 if (SUCCEEDED(GetRegString(hKey, "CLSID", Temp, _countof(Temp))) && ..(Temp, &clsid))
181 {
182 IRegTreeItem *pRTI;
183 if (SUCCEEDED(hr = IUnknown_QueryService(m_pUnkSite, clsid, IID_PPV_ARG(IRegTreeItem, &pti))) ||
184 SUCCEEDED(hr = SHCoCreateInstance(NULL, &clsid, NULL, IID_PPV_ARG(IRegTreeItem, &pRTI))))
185 {
186 BOOL *boolptr = (BOOL*)Data;
187 Size = sizeof(BOOL);
188 Type = REG_DWORD;
189 hr = Set ? pRTI->SetCheckState(*boolptr) : pRTI->GetCheckState(boolptr);
190 pRTI->Release();
191 }
192 return hr;
193 }
194#endif
195
196 DWORD Mask = ~DWORD(0), Offset = 0;
197 BOOL HasMask = GetRegDWORD(hKey, L"Mask", &Mask) == ERROR_SUCCESS;
198 BOOL HasOffset = GetRegDWORD(hKey, L"Offset", &Offset) == ERROR_SUCCESS;
199
201 WCHAR SubKey[MAX_PATH], Name[100];
202 hr = GetRegString(hKey, L"RegPath", SubKey, _countof(SubKey));
203 if (FAILED(hr))
204 return hr;
205 hr = GetRegString(hKey, L"ValueName", Name, _countof(Name));
206 if (FAILED(hr))
207 return hr;
208 DWORD Err, cb;
209 if (Set)
210 Err = RegCreateKeyExW(hValueKey, SubKey, 0, NULL, 0, KEY_READ | KEY_SET_VALUE, NULL, &hValueKey, NULL);
211 else
212 Err = RegOpenKeyExW(hValueKey, SubKey, 0, KEY_READ, &hValueKey);
213 if (Err)
214 return HRESULT_FROM_WIN32(Err);
215
216 if (Set && (HasMask || HasOffset))
217 {
218 Err = SHRegGetValueW(hValueKey, NULL, Name, SRRF_RT_ANY, NULL, NULL, &cb);
219 hr = HRESULT_FROM_WIN32(Err);
220 if (Err == ERROR_FILE_NOT_FOUND)
221 {
222 DWORD DefaultData = 0;
223 cb = sizeof(DefaultData);
224 hr = GetDefaultValue(hKey, Type, &DefaultData, cb);
225 if (SUCCEEDED(hr))
226 {
227 Err = SHSetValueW(hValueKey, NULL, Name, Type, &DefaultData, cb);
228 hr = HRESULT_FROM_WIN32(Err);
229 }
230 }
231
232 if (SUCCEEDED(hr))
233 {
234 Err = ERROR_OUTOFMEMORY;
235 cb = max(cb, (Offset + 1) * sizeof(DWORD));
236 if (PDWORD pBigData = (PDWORD)LocalAlloc(LPTR, cb)) // LPTR to zero extended data
237 {
238 Err = SHRegGetValueW(hValueKey, NULL, Name, SRRF_RT_ANY, &Type, pBigData, &cb);
239 Size = cb;
240 if (Err == ERROR_SUCCESS)
241 {
242 pBigData[Offset] &= ~Mask;
243 pBigData[Offset] |= *((PDWORD)Data);
244 Err = SHSetValueW(hValueKey, NULL, Name, Type, pBigData, cb);
245 }
246 LocalFree(pBigData);
247 }
248 hr = HRESULT_FROM_WIN32(Err);
249 }
250 }
251 else if (Set)
252 {
253 Err = SHSetValueW(hValueKey, NULL, Name, Type, Data, Size);
254 hr = HRESULT_FROM_WIN32(Err);
255 }
256 else
257 {
258 if (Offset && HasOffset)
259 {
260 Size = sizeof(DWORD);
261 Err = SHRegGetValueW(hValueKey, NULL, Name, SRRF_RT_ANY, NULL, NULL, &cb);
262 if (Err == ERROR_SUCCESS)
263 {
264 Err = ERROR_OUTOFMEMORY;
265 if (PDWORD pBigData = (PDWORD)LocalAlloc(LPTR, cb))
266 {
267 Err = SHRegGetValueW(hValueKey, NULL, Name, SRRF_RT_ANY, &Type, pBigData, &cb);
268 if (Offset < cb / sizeof(DWORD) && Err == ERROR_SUCCESS)
269 *((PDWORD)Data) = pBigData[Offset];
270 else
271 *((PDWORD)Data) = 0; // Value not present or offset too large
272 LocalFree(pBigData);
273 }
274 }
275 }
276 else
277 {
278 Err = SHRegGetValueW(hValueKey, NULL, Name, SRRF_RT_ANY, &Type, Data, &Size);
279 }
280
281 hr = HRESULT_FROM_WIN32(Err);
282 if (HasMask && SUCCEEDED(hr))
283 *((PDWORD)Data) &= Mask;
284 }
285 RegCloseKey(hValueKey);
286 return hr;
287}
288
290{
291 BYTE CurrData[MAXVALUEDATA], CheckData[MAXVALUEDATA];
292 DWORD CurrType, CheckType, CurrSize, CheckSize, Err, Checked;
293
294 if (hKey == HKEY_GRAYED)
296
297 CheckSize = sizeof(CheckData);
298 Err = SHRegGetValueW(hKey, NULL, L"CheckedValue", SRRF_RT_ANY, &CheckType, CheckData, &CheckSize);
299 if (Err)
300 return HRESULT_FROM_WIN32(Err);
301
302 HRESULT hr = E_FAIL;
303 if (!UseDefault)
304 {
305 CurrSize = sizeof(CurrData);
306 hr = GetSetState(hKey, CurrType, CurrData, CurrSize, FALSE);
307 }
308 if (FAILED(hr))
309 {
310 CurrSize = sizeof(CurrData);
311 hr = GetDefaultValue(hKey, CurrType, CurrData, CurrSize);
312 }
313 if (FAILED(hr))
314 {
315 return hr;
316 }
317
318 CurrType = NormalizeRegType(CurrType);
319 CheckType = NormalizeRegType(CheckType);
320 if (CurrType != CheckType)
321 {
323 }
324 else if (CheckType == REG_SZ)
325 {
326 *(LPWSTR)(&CheckData[sizeof(CheckData) - sizeof(WCHAR)]) = UNICODE_NULL;
327 if (CheckSize <= sizeof(CheckData) - sizeof(WCHAR))
328 *(LPWSTR)(&CheckData[CheckSize]) = UNICODE_NULL;
329 Checked = !lstrcmpiW((LPWSTR)CheckData, (LPWSTR)CurrData);
330 }
331 else if (CheckType == REG_BINARY)
332 {
333 Checked = CheckSize == CurrSize && !memcmp(CheckData, CurrData, CurrSize);
334 }
335 else
336 {
338 }
339 return Checked ? S_OK : S_FALSE;
340}
341
343{
345 DWORD Type = REG_DWORD, Size = sizeof(Data);
346 *((PDWORD)Data) = Checked;
347 LPCWSTR Name = Checked ? L"CheckedValue" : L"UncheckedValue";
349 if (Err == ERROR_FILE_NOT_FOUND)
350 Err = ERROR_SUCCESS;
351 return Err ? HRESULT_FROM_WIN32(Err) : GetSetState(hKey, Type, Data, Size, TRUE);
352}
353
355{
356 for (HTREEITEM hChildTI = TreeView_GetChild(hTree, hTI); hChildTI;)
357 {
358 WalkTree(Command, hTree, hChildTI);
359 hChildTI = TreeView_GetNextSibling(hTree, hChildTI);
360 }
361
362 TVITEM tvi;
364 tvi.hItem = hTI;
365 if (!TreeView_GetItem(hTree, &tvi))
366 return;
367
368 HKEY hKey = (HKEY)tvi.lParam;
369 UINT State = tvi.iImage;
371 {
372 case WALK_TREE_SAVE:
375 else if (State == STATE_CHECKOFF)
377 break;
378
380 if (hKey && hKey != HKEY_GRAYED)
381 {
383 tvi.lParam = 0;
384 tvi.mask = TVIF_PARAM;
385 TreeView_SetItem(hTree, &tvi);
386 }
387 break;
388
391 if (State < STATE_GROUP)
392 {
394 if (SUCCEEDED(hr))
395 {
396 tvi.iImage = tvi.iSelectedImage = (tvi.iImage & ~1) | (hr == S_OK);
397 TreeView_SetItem(hTree, &tvi);
398 }
399 }
400 break;
401 }
402}
403
405{
406 m_hTree = NULL;
407 m_hIL = NULL;
408}
409
411{
412 if (m_hIL && m_hTree)
414}
415
417{
418 for (DWORD Index = 0, cchName;;)
419 {
420 WCHAR Name[MAX_PATH], Temp[MAX_PATH];
423 break;
424
425 HKEY hItemKey, hCloseKey = NULL;
426 if (RegOpenKeyExW(hKey, Name, 0, KEY_READ, &hItemKey) != ERROR_SUCCESS)
427 continue;
428
429 TVINSERTSTRUCT tvis;
430 TVITEM &tvi = tvis.item;
432 tvi.lParam = (LPARAM)hItemKey;
434 if (GetRegString(hItemKey, L"Type", Temp, _countof(Temp)) > 0)
435 {
436 if (!lstrcmpi(Temp, L"checkbox"))
438 if (!lstrcmpi(Temp, L"radio"))
440 if (!lstrcmpi(Temp, L"group"))
442 }
443 BOOL Valid = Type != TYPE_INVALID;
444
445 if (Type == TYPE_GROUP)
446 {
447 tvi.lParam = 0;
448 hCloseKey = hItemKey;
449 tvi.iImage = AddIconFromRegistry(m_hIL, hItemKey, L"Bitmap");
450 }
451 else if (Valid)
452 {
453 HRESULT hr = GetCheckState(hItemKey);
454 Valid = SUCCEEDED(hr);
455 tvi.iImage = (Type * STATEIMAGESPERTYPE) | (hr == S_OK);
456 }
457
458 if (Valid)
459 {
460 if (SUCCEEDED(SHLoadRegUIStringW(hItemKey, L"Text", Temp, _countof(Temp))))
461 tvi.pszText = Temp;
462 else
463 tvi.pszText = Name;
464#ifdef __REACTOS__ // Grayed is a ROS extension
465 DWORD grayed = GetRegDWORD(hItemKey, L"Grayed", DWORD(FALSE));
466 if (grayed)
467 {
468 tvi.lParam = (LPARAM)HKEY_GRAYED;
469 hCloseKey = hItemKey;
470 tvi.iImage += 2; // Use disabled state image
471 if (grayed & 4)
472 tvi.iImage = (tvi.iImage & ~1) | ((grayed & 2) != 0); // Force a specific state
473 }
474#endif
475 tvi.iSelectedImage = tvi.iImage;
476 tvis.hParent = hParent;
477 tvis.hInsertAfter = hInsertAfter;
478 Valid = (tvi.hItem = TreeView_InsertItem(m_hTree, &tvis)) != NULL;
479 }
480
481 if (Valid && Type == TYPE_GROUP)
482 {
483 AddItemsFromRegistry(hItemKey, tvi.hItem, TVI_FIRST);
485 }
486 if (!Valid)
487 RegCloseKey(hItemKey);
488 if (hCloseKey && hItemKey != hCloseKey)
489 RegCloseKey(hCloseKey);
490 }
492}
493
495{
497 m_hTree = hTV;
498
501 if (hIL)
503
507 {
510 }
511
513 return E_NOTIMPL;
514}
515
517{
518 for (HTREEITEM hTI = TreeView_GetRoot(m_hTree); hTI;)
519 {
522 }
523 return S_OK;
524}
525
527{
528 TVITEM tvi;
530 tvi.hItem = hTI;
531 if (!tvi.hItem || !TreeView_GetItem(m_hTree, &tvi))
532 return E_INVALIDARG;
533
534 if (tvi.iImage >= STATE_GROUP || (HKEY)tvi.lParam == HKEY_GRAYED)
535 return S_FALSE;
536
537 if (tvi.iImage <= max(STATE_CHECKOFF, STATE_CHECKON))
538 {
539 tvi.iImage ^= 1;
540 }
541 else
542 {
544 while (hRadio) // Turn off everyone in this group
545 {
546 tvi.hItem = hRadio;
547 tvi.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE;
548 if (TreeView_GetItem(m_hTree, &tvi) && tvi.iImage == STATE_RADIOON && hRadio != hTI)
549 {
550 tvi.iImage ^= 1;
551 tvi.iSelectedImage = tvi.iImage;
553 }
554 hRadio = TreeView_GetNextSibling(m_hTree, hRadio);
555 }
556 tvi.iImage = STATE_RADIOON;
557 }
558
559 tvi.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE;
560 tvi.hItem = hTI;
561 tvi.iSelectedImage = tvi.iImage;
563 return S_OK;
564}
565
567{
568 return E_NOTIMPL;
569}
static HDC hDC
Definition: 3dtext.c:33
VOID CheckSize(ULONG_PTR Base, SIZE_T InSize, SIZE_T ExpectedSize)
PRTL_UNICODE_STRING_BUFFER Path
Type
Definition: Type.h:7
int memcmp(void *Buffer1, void *Buffer2, ACPI_SIZE Count)
Definition: utclib.c:112
LPCWSTR GetRegString(CRegKey &Key, LPCWSTR Name, CStringW &Value)
Definition: misc.cpp:464
#define HandleToLong(h)
Definition: basetsd.h:80
#define LongToHandle(h)
Definition: basetsd.h:82
#define STDMETHODCALLTYPE
Definition: bdasup.h:9
HANDLE HKEY
Definition: registry.h:26
#define RegCloseKey(hKey)
Definition: registry.h:49
Definition: bufpool.h:45
STDMETHOD() ShowHelp(HTREEITEM hTI, unsigned long Unknown) override
STDMETHOD() ToggleItem(HTREEITEM hTI) override
HIMAGELIST m_hIL
STDMETHOD() WalkTree(WALK_TREE_CMD Command) override
STDMETHOD() InitTree(HWND hTV, HKEY hKey, LPCSTR SubKey, char const *pUnknown) override
void AddItemsFromRegistry(HKEY hKey, HTREEITEM hParent, HTREEITEM hInsertAfter)
#define E_INVALIDARG
Definition: ddrawi.h:101
#define E_NOTIMPL
Definition: ddrawi.h:99
#define E_FAIL
Definition: ddrawi.h:102
#define ERROR_OUTOFMEMORY
Definition: deptool.c:13
#define ERROR_SUCCESS
Definition: deptool.c:10
LPWSTR Name
Definition: desk.c:124
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
DWORD bpp
Definition: surface.c:185
unsigned int idx
Definition: utils.c:41
LONG WINAPI RegCreateKeyExW(_In_ HKEY hKey, _In_ LPCWSTR lpSubKey, _In_ DWORD Reserved, _In_opt_ LPWSTR lpClass, _In_ DWORD dwOptions, _In_ REGSAM samDesired, _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes, _Out_ PHKEY phkResult, _Out_opt_ LPDWORD lpdwDisposition)
Definition: reg.c:1096
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
Definition: reg.c:3333
LONG WINAPI RegEnumKeyExW(_In_ HKEY hKey, _In_ DWORD dwIndex, _Out_ LPWSTR lpName, _Inout_ LPDWORD lpcbName, _Reserved_ LPDWORD lpReserved, _Out_opt_ LPWSTR lpClass, _Inout_opt_ LPDWORD lpcbClass, _Out_opt_ PFILETIME lpftLastWriteTime)
Definition: reg.c:2504
INT WINAPI ImageList_Add(HIMAGELIST himl, HBITMAP hbmImage, HBITMAP hbmMask)
Definition: imagelist.c:458
BOOL WINAPI ImageList_Destroy(HIMAGELIST himl)
Definition: imagelist.c:941
HIMAGELIST WINAPI ImageList_Create(INT cx, INT cy, UINT flags, INT cInitial, INT cGrow)
Definition: imagelist.c:814
#define MAX_PATH
Definition: compat.h:34
#define ERROR_ACCESS_DENIED
Definition: compat.h:97
static DWORD cchBuffer
Definition: fusion.c:85
int WINAPI lstrcmpiW(LPCWSTR str1, LPCWSTR str2)
Definition: locale.c:4262
int WINAPI PathParseIconLocationW(WCHAR *path)
Definition: path.c:2587
HRESULT WINAPI SHCoCreateInstance(LPCWSTR aclsid, const CLSID *clsid, LPUNKNOWN pUnkOuter, REFIID refiid, LPVOID *ppv)
Definition: shellole.c:105
HRESULT WINAPI SHLoadRegUIStringW(HKEY hkey, LPCWSTR value, LPWSTR buf, DWORD size)
Definition: ordinal.c:4277
HRESULT WINAPI IUnknown_QueryService(IUnknown *, REFGUID, REFIID, LPVOID *)
Definition: ordinal.c:1501
DWORD WINAPI SHSetValueW(HKEY hKey, LPCWSTR lpszSubKey, LPCWSTR lpszValue, DWORD dwType, LPCVOID pvData, DWORD cbData)
Definition: reg.c:1306
DWORD WINAPI SHAnsiToUnicode(LPCSTR lpSrcStr, LPWSTR lpDstStr, int iLen)
Definition: string.c:2673
#define BI_RGB
Definition: precomp.h:56
switch(r->id)
Definition: btrfs.c:3046
_In_ PUNKNOWN pUnknown
Definition: drmk.h:76
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
unsigned int Mask
Definition: fpcontrol.c:82
FxAutoRegKey hKey
pKey DeleteObject()
HLOCAL NTAPI LocalAlloc(UINT uFlags, SIZE_T dwBytes)
Definition: heapmem.c:1390
HLOCAL NTAPI LocalFree(HLOCAL hMem)
Definition: heapmem.c:1594
@ Unknown
Definition: i8042prt.h:114
UINT WINAPI ExtractIconExW(LPCWSTR lpszFile, INT nIconIndex, HICON *phiconLarge, HICON *phiconSmall, UINT nIcons)
Definition: iconcache.cpp:855
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
#define REG_SZ
Definition: layer.c:22
#define ERROR_FILE_NOT_FOUND
Definition: disk.h:79
static HBITMAP
Definition: button.c:44
static HDC
Definition: imagelist.c:88
static HICON
Definition: imagelist.c:80
static HMODULE MODULEINFO DWORD cb
Definition: module.c:33
#define min(a, b)
Definition: monoChain.cc:55
HICON hIcon
Definition: msconfig.c:44
REFCLSID clsid
Definition: msctf.c:82
unsigned int UINT
Definition: ndis.h:50
#define BOOL
Definition: nt_native.h:43
#define REG_BINARY
Definition: nt_native.h:1496
#define KEY_READ
Definition: nt_native.h:1023
#define KEY_ENUMERATE_SUB_KEYS
Definition: nt_native.h:1019
#define DWORD
Definition: nt_native.h:44
#define REG_EXPAND_SZ
Definition: nt_native.h:1494
#define KEY_SET_VALUE
Definition: nt_native.h:1017
#define UNICODE_NULL
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:329
_In_ ULONG _In_ ULONG Offset
Definition: ntddpcm.h:101
#define L(x)
Definition: ntvdm.h:50
static BOOL Set
Definition: pageheap.c:10
DWORD * PDWORD
Definition: pedump.c:68
#define TVITEM
Definition: commctrl.h:3370
_Out_opt_ int _Out_opt_ int * cy
Definition: commctrl.h:586
#define TVIF_TEXT
Definition: commctrl.h:3271
#define TreeView_Expand(hwnd, hitem, code)
Definition: commctrl.h:3425
#define TreeView_GetChild(hwnd, hitem)
Definition: commctrl.h:3471
#define TVINSERTSTRUCT
Definition: commctrl.h:3407
#define TVIF_IMAGE
Definition: commctrl.h:3272
#define TVSIL_NORMAL
Definition: commctrl.h:3448
#define TreeView_EnsureVisible(hwnd, hitem)
Definition: commctrl.h:3550
_Out_opt_ int * cx
Definition: commctrl.h:585
#define TVI_FIRST
Definition: commctrl.h:3374
#define TreeView_GetParent(hwnd, hitem)
Definition: commctrl.h:3474
#define TreeView_GetItem(hwnd, pitem)
Definition: commctrl.h:3495
#define TVE_EXPAND
Definition: commctrl.h:3428
#define TVI_ROOT
Definition: commctrl.h:3373
#define TVM_SORTCHILDREN
Definition: commctrl.h:3546
#define TreeView_GetRoot(hwnd)
Definition: commctrl.h:3480
#define TreeView_GetNextSibling(hwnd, hitem)
Definition: commctrl.h:3472
#define ImageList_AddIcon(himl, hicon)
Definition: commctrl.h:415
#define ILC_MASK
Definition: commctrl.h:351
#define TVIF_PARAM
Definition: commctrl.h:3273
#define TreeView_SetImageList(hwnd, himl, iImage)
Definition: commctrl.h:3452
#define TreeView_InsertItem(hwnd, lpis)
Definition: commctrl.h:3417
#define I_IMAGENONE
Definition: commctrl.h:2391
#define TVIF_SELECTEDIMAGE
Definition: commctrl.h:3276
#define TreeView_SetItem(hwnd, pitem)
Definition: commctrl.h:3502
static int AddIconFromRegistry(HIMAGELIST hIL, HKEY hKey, LPCWSTR Name)
static HRESULT GetRegString(HKEY hKey, LPCWSTR Name, LPWSTR Buffer, DWORD cchBuffer)
@ TYPE_RADIO
@ TYPE_CHECK
@ STATEIMAGESPERTYPE
@ STATE_CHECKON
@ STATE_RADIOON
@ STATE_CHECKOFF
@ STATE_RADIOOFF
@ STATE_GROUP
@ TYPE_GROUP
@ TYPE_INVALID
static void WalkTree(WALK_TREE_CMD Command, HWND hTree, HTREEITEM hTI)
#define HKEY_GRAYED
static HRESULT SaveCheckState(HKEY hKey, BOOL Checked)
static HRESULT GetCheckState(HKEY hKey, BOOL UseDefault=FALSE)
static HIMAGELIST CreateStateImages(UINT ImageSize)
C_ASSERT((STATE_CHECKON &1) &&(STATE_RADIOON &1) &&STATE_RADIOON< STATE_GROUP)
#define MAXVALUEDATA
static DWORD GetRegDWORD(HKEY hKey, LPCWSTR Name, PDWORD Data)
static HRESULT GetSetState(HKEY hKey, DWORD &Type, LPBYTE Data, DWORD &Size, BOOL Set)
static DWORD NormalizeRegType(DWORD Type)
static HRESULT GetDefaultValue(HKEY hKey, DWORD &Type, LPVOID Data, DWORD &Size)
static HBITMAP CreatDibBitmap(HDC hDC, UINT cx, UINT cy, UINT bpp)
#define REG_DWORD
Definition: sdbapi.c:596
@ Failed
Definition: arc.h:79
HRESULT hr
Definition: shlfolder.c:183
@ WALK_TREE_REFRESH
Definition: shlobj_undoc.h:459
@ WALK_TREE_DESTROY
Definition: shlobj_undoc.h:457
@ WALK_TREE_DEFAULT
Definition: shlobj_undoc.h:458
@ WALK_TREE_SAVE
Definition: shlobj_undoc.h:456
enum tagWALK_TREE_CMD WALK_TREE_CMD
LSTATUS WINAPI SHRegGetValueW(_In_ HKEY hkey, _In_opt_ LPCWSTR pszSubKey, _In_opt_ LPCWSTR pszValue, _In_ SRRF srrfFlags, _Out_opt_ LPDWORD pdwType, _Out_writes_bytes_to_opt_(*pcbData, *pcbData) LPVOID pvData, _Inout_opt_ LPDWORD pcbData)
#define SRRF_RT_REG_SZ
Definition: shlwapi.h:251
#define SRRF_RT_ANY
Definition: shlwapi.h:260
#define SRRF_RT_DWORD
Definition: shlwapi.h:258
EXTERN_C BOOL WINAPI SHBoolSystemParametersInfo(UINT uiAction, PVOID pvParam)
#define _countof(array)
Definition: sndvol32.h:70
Definition: shell.h:41
int iSelectedImage
Definition: treeview.c:148
USHORT biBitCount
Definition: precomp.h:46
ULONG biCompression
Definition: precomp.h:47
BITMAPINFOHEADER bmiHeader
Definition: wingdi.h:1476
#define max(a, b)
Definition: svc.c:63
static HWND hTree
Definition: systempage.cpp:52
unsigned char * LPBYTE
Definition: typedefs.h:53
int32_t INT
Definition: typedefs.h:58
_In_ WDFCOLLECTION _In_ ULONG Index
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
Definition: wdfdevice.h:4533
HBITMAP WINAPI CreateDIBSection(HDC hDC, CONST BITMAPINFO *BitmapInfo, UINT Usage, VOID **Bits, HANDLE hSection, DWORD dwOffset)
Definition: bitmap.c:245
#define ZeroMemory
Definition: winbase.h:1753
#define LPTR
Definition: winbase.h:414
#define lstrcmpi
Definition: winbase.h:3914
_In_ PSID _Out_writes_to_opt_ cchName LPSTR _Inout_ LPDWORD cchName
Definition: winbase.h:2808
LONG_PTR LPARAM
Definition: windef.h:208
#define S_FALSE
Definition: winerror.h:2357
#define ERROR_BAD_FORMAT
Definition: winerror.h:114
#define HRESULT_FROM_WIN32(x)
Definition: winerror.h:92
#define DIB_RGB_COLORS
Definition: wingdi.h:367
HGDIOBJ WINAPI GetStockObject(_In_ int)
HBITMAP WINAPI CreateBitmap(_In_ INT cx, _In_ INT cy, _In_ UINT cPlanes, _In_ UINT cBitsPerPel, _In_opt_ const VOID *pvBits)
HGDIOBJ WINAPI SelectObject(_In_ HDC, _In_ HGDIOBJ)
Definition: dc.c:1546
HDC WINAPI CreateCompatibleDC(_In_opt_ HDC hdc)
#define WHITE_BRUSH
Definition: wingdi.h:902
#define BLACK_BRUSH
Definition: wingdi.h:896
int WINAPI FillRect(HDC, LPCRECT, HBRUSH)
BOOL WINAPI DeleteDC(_In_ HDC)
#define HKEY_CURRENT_USER
Definition: winreg.h:11
BOOL WINAPI DrawFrameControl(_In_ HDC, _Inout_ LPRECT, _In_ UINT, _In_ UINT)
#define DFCS_FLAT
Definition: winuser.h:510
#define DFCS_BUTTONCHECK
Definition: winuser.h:496
#define DFCS_INACTIVE
Definition: winuser.h:502
#define DFC_BUTTON
Definition: winuser.h:476
#define DFCS_MONO
Definition: winuser.h:511
#define SM_CXSMICON
Definition: winuser.h:1023
#define DFCS_BUTTONRADIOMASK
Definition: winuser.h:498
#define SendMessage
Definition: winuser.h:5928
#define DFCS_BUTTONRADIOIMAGE
Definition: winuser.h:497
#define DFCS_CHECKED
Definition: winuser.h:504
BOOL WINAPI InflateRect(_Inout_ LPRECT, _In_ int, _In_ int)
int WINAPI GetSystemMetrics(_In_ int)
BOOL WINAPI SetRect(_Out_ LPRECT, _In_ int, _In_ int, _In_ int, _In_ int)
BOOL WINAPI DestroyIcon(_In_ HICON)
Definition: cursoricon.c:2390
#define IID_PPV_ARG(Itype, ppType)
const char * LPCSTR
Definition: xmlstorage.h:183
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
unsigned char BYTE
Definition: xxhash.c:193