2 * PROJECT: Global Flags utility
3 * LICENSE: GPL-2.0 (https://spdx.org/licenses/GPL-2.0)
4 * PURPOSE: Global Flags utility page heap options
5 * COPYRIGHT: Copyright 2017 Pierre Schweitzer (pierre@reactos.org)
10 static BOOL Set
= FALSE
;
11 static BOOL Unset
= FALSE
;
12 static BOOL Full
= FALSE
;
13 static PWSTR Image
= NULL
;
16 static VOID
ModifyStatus(VOID
)
23 if (!OpenImageFileExecOptions(KEY_WRITE
| KEY_READ
, Image
, &IFEOKey
))
28 GlobalFlags
= ReadSZFlagsFromRegistry(IFEOKey
, L
"GlobalFlag");
31 GlobalFlags
|= FLG_HEAP_PAGE_ALLOCS
;
35 GlobalFlags
&= ~FLG_HEAP_PAGE_ALLOCS
;
40 wsprintf(Buffer
, L
"0x%08x", GlobalFlags
);
41 Ret
= RegSetValueExW(IFEOKey
, L
"GlobalFlag", 0, REG_SZ
, (BYTE
*)Buffer
, (wcslen(Buffer
) + 1) * sizeof(WCHAR
));
42 if (Ret
!= ERROR_SUCCESS
)
44 wprintf(L
"MS: RegSetValueEx failed (%d)\n", Ret
);
49 Ret
= RegDeleteValueW(IFEOKey
, L
"GlobalFlag");
50 if (Ret
!= ERROR_SUCCESS
)
52 wprintf(L
"MS: RegDeleteValue failed (%d)\n", Ret
);
58 Ret
= RegDeleteValueW(IFEOKey
, L
"PageHeapFlags");
59 if (Ret
!= ERROR_SUCCESS
)
61 wprintf(L
"MS: RegDeleteValue failed (%d)\n", Ret
);
68 PageHeapFlags
= ReadSZFlagsFromRegistry(IFEOKey
, L
"PageHeapFlags");
77 wsprintf(Buffer
, L
"0x%x", PageHeapFlags
);
78 Ret
= RegSetValueExW(IFEOKey
, L
"PageHeapFlags", 0, REG_SZ
, (BYTE
*)Buffer
, (wcslen(Buffer
) + 1) * sizeof(WCHAR
));
79 if (Ret
!= ERROR_SUCCESS
)
81 wprintf(L
"MS: RegSetValueEx failed (%d)\n", Ret
);
87 DWORD Type
, VerifierFlags
, Len
;
91 if (RegQueryValueExW(IFEOKey
, L
"VerifierFlags", NULL
, &Type
, (BYTE
*)&VerifierFlags
, &Len
) == ERROR_SUCCESS
&&
92 Type
== REG_DWORD
&& Len
== sizeof(DWORD
))
94 VerifierFlags
&= ~0x8001; /* RTL_VRF_FLG_FAST_FILL_HEAP | RTL_VRF_FLG_FULL_PAGE_HEAP */
103 VerifierFlags
|= 1; /* RTL_VRF_FLG_FULL_PAGE_HEAP */
107 VerifierFlags
|= 0x8000; /* RTL_VRF_FLG_FAST_FILL_HEAP */
110 Ret
= RegSetValueExW(IFEOKey
, L
"VerifierFlags", 0, REG_DWORD
, (const BYTE
*)&VerifierFlags
, sizeof(DWORD
));
111 if (Ret
!= ERROR_SUCCESS
)
113 wprintf(L
"MS: RegSetValueEx failed (%d)\n", Ret
);
117 wprintf(L
"path: %s\n", ImageExecOptionsString
);
118 wprintf(L
"\t%s: page heap %s\n", Image
, (Set
? L
"enabled" : L
"disabled"));
120 HeapFree(GetProcessHeap(), 0, Buffer
);
121 RegCloseKey(IFEOKey
);
124 static BOOL
DisplayImageInfo(HKEY HandleKey
, PWSTR SubKey
, PBOOL Header
)
131 Ret
= RegOpenKeyExW(HandleKey
, SubKey
, 0, KEY_READ
, &HandleSubKey
);
132 if (Ret
!= ERROR_SUCCESS
)
134 wprintf(L
"DII: RegOpenKeyEx failed (%d)\n", Ret
);
139 GlobalFlags
= ReadSZFlagsFromRegistry(HandleSubKey
, L
"GlobalFlag");
140 if (GlobalFlags
& FLG_HEAP_PAGE_ALLOCS
)
148 wprintf(L
"path: %s\n", ImageExecOptionsString
);
151 wprintf(L
"\t%s: page heap enabled with flags (", SubKey
);
155 wprintf(L
"Page heap is enabled for %s with flags (", SubKey
);
158 PageHeapFlags
= ReadSZFlagsFromRegistry(HandleSubKey
, L
"PageHeapFlags");
159 if (PageHeapFlags
& 0x1)
164 if (PageHeapFlags
& 0x2)
174 RegCloseKey(HandleSubKey
);
179 static VOID
DisplayStatus(VOID
)
183 DWORD Index
, MaxLen
, Handled
;
187 if (!OpenImageFileExecOptions(KEY_READ
, NULL
, &HandleKey
))
192 Ret
= RegQueryInfoKeyW(HandleKey
, NULL
, NULL
, NULL
, NULL
, &MaxLen
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
);
193 if (Ret
!= ERROR_SUCCESS
)
195 wprintf(L
"DS: RegQueryInfoKey failed (%d)\n", Ret
);
196 RegCloseKey(HandleKey
);
200 ++MaxLen
; // NULL-char
201 SubKey
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, MaxLen
* sizeof(WCHAR
));
204 wprintf(L
"DS: HeapAlloc failed\n");
205 RegCloseKey(HandleKey
);
214 Ret
= RegEnumKeyW(HandleKey
, Index
, SubKey
, MaxLen
);
215 if (Ret
!= ERROR_NO_MORE_ITEMS
)
217 if (Image
== NULL
|| wcscmp(SubKey
, Image
) == 0)
219 if (DisplayImageInfo(HandleKey
, SubKey
, &Header
))
227 } while (Ret
!= ERROR_NO_MORE_ITEMS
);
233 wprintf(L
"No application has page heap enabled.\n");
237 wprintf(L
"Page heap is not enabled for %s\n", Image
);
241 HeapFree(GetProcessHeap(), 0, SubKey
);
242 RegCloseKey(HandleKey
);
245 BOOL
PageHeap_ParseCmdline(INT i
, int argc
, LPWSTR argv
[])
247 for (; i
< argc
; i
++)
249 if (argv
[i
][0] == L
'/')
251 if (wcscmp(argv
[i
], L
"/enable") == 0)
255 else if (wcscmp(argv
[i
], L
"/disable") == 0)
259 else if (wcscmp(argv
[i
], L
"/full") == 0)
264 else if (Image
== NULL
)
270 wprintf(L
"Invalid option: %s\n", argv
[i
]);
277 wprintf(L
"ENABLE and DISABLED cannot be set together\n");
281 if (Image
== NULL
&& (Set
|| Unset
|| Full
))
283 wprintf(L
"Can't ENABLE or DISABLE with no image\n");
287 if (!Set
&& !Unset
&& Full
)
289 wprintf(L
"Cannot deal with full traces with no other indication\n");
296 INT
PageHeap_Execute()