[GFLAGS] Move common code to a shared location.
[reactos.git] / modules / rosapps / applications / cmdutils / gflags / gflags.c
1 /*
2 * PROJECT: Global Flags utility
3 * LICENSE: GPL-2.0 (https://spdx.org/licenses/GPL-2.0)
4 * PURPOSE: Global Flags utility entrypoint
5 * COPYRIGHT: Copyright 2017 Pierre Schweitzer (pierre@reactos.org)
6 * Copyright 2018 Mark Jansen (mark.jansen@reactos.org)
7 */
8
9 #include "gflags.h"
10
11 static BOOL UsePageHeap = FALSE;
12
13 const WCHAR ImageExecOptionsString[] = L"Software\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options";
14
15 BOOL OpenImageFileExecOptions(IN REGSAM SamDesired, IN OPTIONAL PCWSTR ImageName, OUT HKEY* Key)
16 {
17 LONG Ret;
18 HKEY HandleKey, HandleSubKey;
19
20 Ret = RegOpenKeyExW(HKEY_LOCAL_MACHINE, ImageExecOptionsString, 0, KEY_WRITE | KEY_READ, &HandleKey);
21 if (Ret != ERROR_SUCCESS)
22 {
23 wprintf(L"OpenIFEO: RegOpenKeyEx failed (%d)\n", Ret);
24 return FALSE;
25 }
26
27 if (ImageName == NULL)
28 {
29 *Key = HandleKey;
30 return TRUE;
31 }
32
33 Ret = RegCreateKeyExW(HandleKey, ImageName, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE | KEY_READ, NULL, &HandleSubKey, NULL);
34 CloseHandle(HandleKey);
35
36 if (Ret != ERROR_SUCCESS)
37 {
38 wprintf(L"OpenIFEO: RegCreateKeyEx failed (%d)\n", Ret);
39 return FALSE;
40 }
41 *Key = HandleSubKey;
42 return TRUE;
43 }
44
45
46 DWORD ReadSZFlagsFromRegistry(HKEY SubKey, PWSTR Value)
47 {
48 WCHAR Buffer[20] = { 0 };
49 DWORD Len, Flags, Type;
50
51 Len = sizeof(Buffer) - sizeof(WCHAR);
52 Flags = 0;
53 if (RegQueryValueExW(SubKey, Value, NULL, &Type, (BYTE*)Buffer, &Len) == ERROR_SUCCESS && Type == REG_SZ)
54 {
55 Flags = wcstoul(Buffer, NULL, 16);
56 }
57
58 return Flags;
59 }
60
61 static BOOL ParseCmdline(int argc, LPWSTR argv[])
62 {
63 INT i;
64
65 if (argc < 2)
66 {
67 wprintf(L"Not enough args!\n");
68 return FALSE;
69 }
70
71 for (i = 1; i < argc; i++)
72 {
73 if (argv[i][0] == L'/')
74 {
75 if (argv[i][1] == L'p' && argv[i][2] == UNICODE_NULL)
76 {
77 UsePageHeap = TRUE;
78 return PageHeap_ParseCmdline(i + 1, argc, argv);
79 }
80 }
81 else
82 {
83 wprintf(L"Invalid option: %s\n", argv[i]);
84 return FALSE;
85 }
86 }
87
88 if (!UsePageHeap)
89 {
90 wprintf(L"Only page heap flags are supported\n");
91 return FALSE;
92 }
93
94 return TRUE;
95 }
96
97
98 int wmain(int argc, LPWSTR argv[])
99 {
100 if (!ParseCmdline(argc, argv))
101 {
102 wprintf(L"Usage: gflags /p [image.exe] [/enable|/disable [/full]]\n"
103 L" image.exe: Image you want to deal with\n"
104 L" /enable: enable page heap for the image\n"
105 L" /disable: disable page heap for the image\n"
106 L" /full: activate full debug page heap\n");
107 return 1;
108 }
109
110 if (UsePageHeap)
111 {
112 return PageHeap_Execute();
113 }
114 return 2;
115 }