Reactos
1////////////////////////////////////////////////////////////////////
2// Copyright (C) Alexander Telyatnikov, Ivan Keliukh, Yegor Anchishkin, SKIF Software, 1999-2013. Kiev, Ukraine
3// All rights reserved
4// This file was released under the GPLv2 on June 2015.
5////////////////////////////////////////////////////////////////////
6
7#include "regtools.h"
8
9#ifndef WIN_32_MODE
10
11NTSTATUS
12RegTGetKeyHandle(
13 IN HKEY hRootKey,
14 IN PCWSTR KeyName,
15 OUT HKEY* hKey
16 )
17{
18 OBJECT_ATTRIBUTES ObjectAttributes;
19 UNICODE_STRING NameString;
20 NTSTATUS status;
21
22 //UDFPrint(("RegTGetKeyHandle: h=%x, %S\n", hRootKey, KeyName));
23
24 RtlInitUnicodeString(&NameString, KeyName);
25
26 InitializeObjectAttributes(
27 &ObjectAttributes,
28 &NameString,
29 OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
30 hRootKey,
31 NULL
32 );
33
34 status = ZwOpenKey(
35 hKey,
36 KEY_WRITE | KEY_READ,
37 &ObjectAttributes
38 );
39
40 if(!NT_SUCCESS(status)) {
41 //UDFPrint((" status %x\n", status));
42 *hKey = NULL;
43 }
44
45 return status;
46} // end RegTGetKeyHandle()
47
48VOID
49RegTCloseKeyHandle(
50 IN HKEY hKey
51)
52{
53 ZwClose(hKey);
54} // end RegTCloseKeyHandle()
55
56#else //WIN_32_MODE
57
58NTSTATUS
59RegTGetKeyHandle(
60 IN HKEY hRootKey,
61 IN PWCHAR KeyName,
62 OUT HKEY* hKey
63 )
64{
65 LONG status;
66
67 if(!hRootKey)
68 hRootKey = HKEY_LOCAL_MACHINE;
69
70 status = RegOpenKeyExW(
71 hRootKey,
72 KeyName,
73 0,
74 KEY_WRITE | KEY_READ,
75 hKey
76 );
77
78 if(status != ERROR_SUCCESS) {
79 *hKey = NULL;
80 }
81
82 return status;
83} // end RegTGetKeyHandle()
84
85VOID
86RegTCloseKeyHandle(
87 IN HKEY hKey
88)
89{
90 if(!hKey) {
91 return;
92 }
93 RegCloseKey(hKey);
94} // end RegTCloseKeyHandle()
95
96#endif //WIN_32_MODE
97
98BOOLEAN
99RegTGetDwordValue(
100 IN HKEY hRootKey,
101 IN PCWSTR RegistryPath,
102 IN PCWSTR Name,
103 IN PULONG pUlong
104 )
105{
106#ifndef WIN_32_MODE
107 UNICODE_STRING NameString;
108 PKEY_VALUE_PARTIAL_INFORMATION ValInfo;
109#endif //WIN_32_MODE
110 ULONG len;
111 NTSTATUS status;
112 HKEY hKey;
113 BOOLEAN retval = FALSE;
114 BOOLEAN free_h = FALSE;
115
116#ifdef WIN_32_MODE
117 if(!hRootKey)
118 hRootKey = HKEY_LOCAL_MACHINE;
119#endif //WIN_32_MODE
120
121 if(RegistryPath && RegistryPath[0]) {
122 status = RegTGetKeyHandle(hRootKey, RegistryPath, &hKey);
123#ifdef WIN_32_MODE
124 if(status != ERROR_SUCCESS)
125#else //WIN_32_MODE
126 if(!NT_SUCCESS(status))
127#endif //WIN_32_MODE
128 return FALSE;
129 free_h = TRUE;
130 } else {
131 hKey = hRootKey;
132 }
133 if(!hKey)
134 return FALSE;
135
136#ifndef WIN_32_MODE
137/*
138 UDFPrint(("h=%x|%S, %S (%x)\n",
139 hRootKey, RegistryPath, Name, *pUlong));
140*/
141 len = sizeof(KEY_VALUE_PARTIAL_INFORMATION) + sizeof(ULONG) + 0x20;
142 ValInfo = (PKEY_VALUE_PARTIAL_INFORMATION)
143 MyAllocatePool__(NonPagedPool, len);
144 if(!ValInfo) {
145 if(free_h) {
146 RegTCloseKeyHandle(hKey);
147 }
148 return FALSE;
149 }
150
151 RtlInitUnicodeString(&NameString, Name);
152
153 status = ZwQueryValueKey(hKey,
154 &NameString,
155 KeyValuePartialInformation,
156 ValInfo,
157 len,
158 &len);
159 if(NT_SUCCESS(status) &&
160 ValInfo->DataLength == sizeof(ULONG)) {
161 RtlCopyMemory(pUlong, ValInfo->Data, sizeof(ULONG));
162 retval = TRUE;
163 //UDFPrint((" -> %x\n",*pUlong));
164 } else {
165 //UDFPrint((" err %x\n",status));
166 }
167
168 MyFreePool__(ValInfo);
169#else //WIN_32_MODE
170 len = sizeof(ULONG);
171 if (ERROR_SUCCESS == RegQueryValueExW(
172 hKey, // handle of key to query
173 Name, // address of name of value to query
174 0, // reserved
175 NULL, // address of buffer for value type
176 (BYTE *)pUlong, // address of data buffer
177 &len // address of data buffer size
178 ) && len == sizeof(ULONG)) {
179 retval = TRUE;
180 }
181#endif //WIN_32_MODE
182 if(free_h) {
183 RegTCloseKeyHandle(hKey);
184 }
185 return retval;
186} // end RegTGetDwordValue()
187
188BOOLEAN
189RegTGetStringValue(
190 IN HKEY hRootKey,
191 IN PCWSTR RegistryPath,
192 IN PCWSTR Name,
193 IN PWCHAR pStr,
194 IN ULONG MaxLen
195 )
196{
197#ifndef WIN_32_MODE
198 UNICODE_STRING NameString;
199 PKEY_VALUE_PARTIAL_INFORMATION ValInfo;
200#endif //USER_MODE
201 ULONG len;
202 NTSTATUS status;
203 HKEY hKey;
204 BOOLEAN retval = FALSE;
205 BOOLEAN free_h = FALSE;
206
207#ifdef WIN_32_MODE
208 if(!hRootKey)
209 hRootKey = HKEY_LOCAL_MACHINE;
210#endif //WIN_32_MODE
211
212 if(RegistryPath && RegistryPath[0]) {
213 status = RegTGetKeyHandle(hRootKey, RegistryPath, &hKey);
214#ifdef WIN_32_MODE
215 if(status != ERROR_SUCCESS)
216#else //WIN_32_MODE
217 if(!NT_SUCCESS(status))
218#endif //WIN_32_MODE
219 return FALSE;
220 free_h = TRUE;
221 } else {
222 hKey = hRootKey;
223 }
224 if(!hKey)
225 return FALSE;
226
227 pStr[0] = 0;
228#ifndef WIN_32_MODE
229 len = sizeof(KEY_VALUE_PARTIAL_INFORMATION) + MaxLen + 0x20;
230 ValInfo = (PKEY_VALUE_PARTIAL_INFORMATION)
231 MyAllocatePool__(NonPagedPool, len);
232 if(!ValInfo) {
233 if(free_h) {
234 RegTCloseKeyHandle(hKey);
235 }
236 return FALSE;
237 }
238
239 RtlInitUnicodeString(&NameString, Name);
240
241 status = ZwQueryValueKey(hKey,
242 &NameString,
243 KeyValuePartialInformation,
244 ValInfo,
245 len,
246 &len);
247 if(NT_SUCCESS(status) &&
248 ValInfo->DataLength) {
249 RtlCopyMemory(pStr, ValInfo->Data, min(ValInfo->DataLength, MaxLen) );
250 if(pStr[(ValInfo->DataLength)/sizeof(WCHAR)-1]) {
251 pStr[(ValInfo->DataLength)/sizeof(WCHAR)-1] = 0;
252 }
253 retval = TRUE;
254 }
255
256 MyFreePool__(ValInfo);
257#else //WIN_32_MODE
258 len = MaxLen;
259 if (ERROR_SUCCESS == RegQueryValueExW(
260 hKey, // handle of key to query
261 Name, // address of name of value to query
262 0, // reserved
263 NULL, // address of buffer for value type
264 (BYTE *)pStr, // address of data buffer
265 &len // address of data buffer size
266 ) && len) {
267 if(pStr[len-1]) {
268 pStr[len-1] = 0;
269 }
270 retval = TRUE;
271 }
272#endif //WIN_32_MODE
273
274 if(free_h) {
275 RegTCloseKeyHandle(hKey);
276 }
277 return retval;
278} // end RegTGetStringValue()