2 * PROJECT: ReactOS api tests
3 * LICENSE: GPLv2+ - See COPYING in the top level directory
4 * PURPOSE: Test for the RegQueryValueW API
5 * PROGRAMMER: Victor Martinez Calvo <victor.martinez@reactos.org>
10 static DWORD
delete_key(HKEY hkey
)
15 while (!(ret
= RegEnumKeyW(hkey
, 0, name
, _countof(name
))))
18 if (!(ret
= RegOpenKeyExW(hkey
, name
, 0, KEY_ENUMERATE_SUB_KEYS
, &tmp
)))
20 ret
= delete_key(tmp
);
25 if (ret
== ERROR_NO_MORE_ITEMS
)
27 RegDeleteKeyW(hkey
, L
"");
34 START_TEST(RegQueryValueExW
)
38 DWORD type
, size
, ret
, reserved
;
39 const WCHAR string1W
[] = L
"1";
40 const WCHAR string22W
[] = L
"Thisstringhas22letters";
46 /* If the tree key already exist, delete it to ensure proper testing*/
47 if (RegOpenKeyExW(HKEY_CURRENT_USER
, L
"Software\\ReactOS\\advapi32_apitest", 0, KEY_ALL_ACCESS
, &hkey_main
) == ERROR_SUCCESS
)
48 delete_key(hkey_main
);
50 /* Ready to recreate it */
51 SetLastError(0xdeadbeef);
52 ret
= RegCreateKeyExW(HKEY_CURRENT_USER
, L
"Software\\ReactOS\\advapi32_apitest", 0, NULL
, 0, KEY_ALL_ACCESS
, NULL
, &hkey_main
, NULL
);
53 ok(ret
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %lu\n", ret
);
54 ok(GetLastError(), "RegCreateKeyExW failed: %lx\n", GetLastError());
55 if(ret
!= ERROR_SUCCESS
)
57 trace("Unable to create test key, aborting!\n");
61 SetLastError(0xdeadbeef);
62 ret
= RegCreateKeyExW(hkey_main
, L
"subkey", 0, L
"subkey class", 0, KEY_ALL_ACCESS
, NULL
, &subkey
, NULL
);
63 ok(ret
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %lu\n", ret
);
64 ok(GetLastError(), "RegCreateKeyExW failed: %lx\n", GetLastError());
67 SetLastError(0xdeadbeef);
68 ret
= RegQueryValueExW(NULL
, NULL
, NULL
, NULL
, NULL
, NULL
);
69 ok(ret
== ERROR_INVALID_HANDLE
, "RegQueryValueExW returned: %lx\n", ret
);
70 ok(GetLastError() == 0xdeadbeef, "RegQueryValueExW returned: %lx\n", GetLastError());
72 /* All NULL. Reserved not NULL */
76 SetLastError(0xdeadbeef);
77 ret
= RegQueryValueExW(NULL
, NULL
, &reserved
, NULL
, NULL
, NULL
);
78 ok(ret
== ERROR_INVALID_PARAMETER
, "RegQueryValueExW returned: %lx\n", ret
);
79 ok(GetLastError() == 0xdeadbeef, "RegQueryValueExW returned: %lx\n", GetLastError());
80 ok(reserved
== 3, "Expected reserved=3, reserved is: %ld \n", reserved
);
82 /* NULL handle. NULL value. Reserved not NULL */
86 SetLastError(0xdeadbeef);
87 ret
= RegQueryValueExW(NULL
, NULL
, &reserved
, &type
, NULL
, &size
);
88 ok(ret
== ERROR_INVALID_PARAMETER
, "RegQueryValueExW returned: %lx\n", ret
);
89 ok(GetLastError() == 0xdeadbeef, "RegQueryValueExW returned: %lx\n", GetLastError());
90 ok(type
== 666, "Expected untouched, Type was set with: %ld\n", type
);
91 ok(size
== 666, "Expected untouched, Size was set with: %ld \n", size
);
92 ok(reserved
== 3, "Expected reserved = 3, reserved is: %ld \n", reserved
);
94 /* NULL handle. NULL value */
97 SetLastError(0xdeadbeef);
98 ret
= RegQueryValueExW(NULL
, NULL
, NULL
, &type
, NULL
, &size
);
99 ok(ret
== ERROR_INVALID_HANDLE
, "RegQueryValueExW returned: %lx\n", ret
);
100 ok(GetLastError() == 0xdeadbeef, "RegQueryValueExW returned: %lx\n", GetLastError());
101 ok(type
== 666, "Expected untouched, Type was set with: %ld\n", type
);
102 ok(size
== 666, "Expected untouched, Size was set with: %ld \n", size
);
104 /* NULL handle . Inexistent value. Reserved not NULL */
108 SetLastError(0xdeadbeef);
109 ret
= RegQueryValueExW(NULL
, L
"MSITESTVAR11", &reserved
, &type
, NULL
, &size
);
110 ok(ret
== ERROR_INVALID_PARAMETER
, "RegQueryValueExW returned: %lx\n", ret
);
111 ok(GetLastError() == 0xdeadbeef, "RegQueryValueExW returned: %lx\n", GetLastError());
112 ok(type
== 666, "Expected untouched, Type was set with: %ld\n", type
);
113 ok(size
== 666, "Expected untouched, Size was set with: %ld \n", size
);
114 ok(reserved
== 3, "Expected reserved = 3, reserved is: %ld \n", reserved
);
116 /* NULL handle . Inexistent value. */
119 SetLastError(0xdeadbeef);
120 ret
= RegQueryValueExW(NULL
, L
"MSITESTVAR11", NULL
, &type
, NULL
, &size
);
121 ok(ret
== ERROR_INVALID_HANDLE
, "RegQueryValueExW returned: %lx\n", ret
);
122 ok(GetLastError() == 0xdeadbeef, "RegQueryValueExW returned: %lx\n", GetLastError());
123 ok(type
== 666, "Expected untouched, Type was set with: %ld\n", type
);
124 ok(size
== 666, "Expected untouched, Size was set with: %ld \n", size
);
129 SetLastError(0xdeadbeef);
130 ret
= RegQueryValueExW(NULL
, L
"MSITESTVAR11", NULL
, &type
, NULL
, &size
);
131 ok(ret
== ERROR_INVALID_HANDLE
, "RegQueryValueExW returned: %lx\n", ret
);
132 ok(GetLastError() == 0xdeadbeef, "RegQueryValueExW returned: %lx\n", GetLastError());
133 ok(type
== 666, "Expected untouched, Type was set with: %ld\n", type
);
134 ok(size
== 666, "Expected untouched, Size was set with: %ld \n", size
);
136 /* INVALID handle. NULL value. Reserved not NULL */
140 SetLastError(0xdeadbeef);
141 ret
= RegQueryValueExW((HKEY
)-4, NULL
, &reserved
, &type
, NULL
, &size
);
142 ok(ret
== ERROR_INVALID_PARAMETER
, "RegQueryValueExW returned: %lx\n", ret
);
143 ok(GetLastError() == 0xdeadbeef, "RegQueryValueExW returned: %lx\n", GetLastError());
144 ok(type
== 666, "Expected untouched, Type was set with: %ld\n", type
);
145 ok(size
== 666, "Expected untouched, Size was set with: %ld \n", size
);
146 ok(reserved
== 3, "Expected reserved = 3, reserved is: %ld \n", reserved
);
148 /* INVALID handle. NULL value.*/
151 SetLastError(0xdeadbeef);
152 ret
= RegQueryValueExW((HKEY
)-4, NULL
, NULL
, &type
, NULL
, &size
);
153 ok(ret
== ERROR_INVALID_HANDLE
, "RegQueryValueExW returned: %lx\n", ret
);
154 ok(GetLastError() == 0xdeadbeef, "RegQueryValueExW returned: %lx\n", GetLastError());
155 ok(type
== REG_NONE
, "Expected REG_NONE, Type is: %ld\n", type
);
156 ok(size
== 0, "Expected size = 0, size is: %ld\n", size
);
157 ok(reserved
== 3, "Expected reserved = 3, reserved is: %ld \n", reserved
);
159 /* INVALID handle. Non-existent value. Reserved not NULL*/
163 SetLastError(0xdeadbeef);
164 ret
= RegQueryValueExW((HKEY
)-4, L
"MSITESTVAR11", &reserved
, &type
, NULL
, &size
);
165 ok(ret
== ERROR_INVALID_PARAMETER
, "RegQueryValueExW returned: %lx\n", ret
);
166 ok(GetLastError() == 0xdeadbeef, "RegQueryValueExW returned: %lx\n", GetLastError());
167 ok(type
== 666, "Expected untouched, Type was set with: %ld\n", type
);
168 ok(size
== 666, "Expected untouched, Size was set with: %ld \n", size
);
169 ok(reserved
== 3, "Expected reserved = 3, reserved is: %ld \n", reserved
);
171 /* INVALID handle. Non-existent value. */
174 SetLastError(0xdeadbeef);
175 ret
= RegQueryValueExW((HKEY
)-4, L
"MSITESTVAR11", NULL
, &type
, NULL
, &size
);
176 ok(ret
== ERROR_INVALID_HANDLE
, "RegQueryValueExW returned: %lx\n", ret
);
177 ok(GetLastError() == 0xdeadbeef, "RegQueryValueExW returned: %lx\n", GetLastError());
178 ok(type
== REG_NONE
, "Expected REG_NONE, Type is: %ld\n", type
);
179 ok(size
== 0, "Expected size = 0, size is: %ld\n", size
);
181 /* VALID handle, Non-existent value, Reserved not NULL */
185 SetLastError(0xdeadbeef);
186 ret
= RegQueryValueExW(hkey_main
, L
"MSITESTVAR11", &reserved
, &type
, NULL
, &size
);
187 ok(ret
== ERROR_INVALID_PARAMETER
, "RegQueryValueExW returned: %lx\n", ret
);
188 ok(GetLastError() == 0xdeadbeef, "RegQueryValueExW returned: %lx\n", GetLastError());
189 ok(type
== 666, "Expected untouched, Type was set with: %ld\n", type
);
190 ok(size
== 666, "Expected untouched, Size was set with: %ld \n", size
);
191 ok(reserved
== 3, "Expected reserved = 3, reserved is: %ld\n", reserved
);
193 /* VALID handle, Non-existent value */
196 SetLastError(0xdeadbeef);
197 ret
= RegQueryValueExW(hkey_main
, L
"MSITESTVAR11", NULL
, &type
, NULL
, &size
);
198 ok(ret
== ERROR_FILE_NOT_FOUND
, "RegQueryValueExW returned: %lx\n", ret
);
199 ok(GetLastError() == 0xdeadbeef, "RegQueryValueExW returned: %lx\n", GetLastError());
200 ok(type
== REG_NONE
, "Expected REG_NONE, Type is: %ld\n", type
);
201 ok(size
== 0, "Expected size = 0, size is: %ld\n", size
);
203 /* VALID handle, NULL value */
206 SetLastError(0xdeadbeef);
207 ret
= RegQueryValueExW(hkey_main
, NULL
, NULL
, &type
, NULL
, &size
);
208 ok(ret
== ERROR_FILE_NOT_FOUND
, "RegQueryValueExW returned: %lx\n", ret
);
209 ok(GetLastError() == 0xdeadbeef, "RegQueryValueExW returned: %lx\n", GetLastError());
210 ok(type
== REG_NONE
, "Expected REG_NONE, Type is: %ld\n", type
);
211 ok(size
== 0, "Expected size = 0, size is: %ld\n", size
);
213 /* Create the value */
214 SetLastError(0xdeadbeef);
215 if ((ret
= RegSetValueExW(hkey_main
, L
"MSITESTVAR11", 0, REG_NONE
, (const BYTE
*)string1W
, 4)) != ERROR_SUCCESS
)
217 ok(1, "RegSetValueExW failed: %lx, %lx\n", ret
, GetLastError());
219 if ((ret
= RegSetValueExW(hkey_main
, L
"LONGSTRING", 0, REG_SZ
, (const BYTE
*)string22W
, (lstrlenW(string22W
)+1) * sizeof(WCHAR
))) != ERROR_SUCCESS
)
221 ok(1, "RegSetValueExW failed: %lx, %lx\n", ret
, GetLastError());
224 /* Existent value. Reserved not NULL */
225 SetLastError(0xdeadbeef);
229 ret
= RegQueryValueExW(hkey_main
, L
"MSITESTVAR11", &reserved
, &type
, NULL
, &size
);
230 ok(ret
== ERROR_INVALID_PARAMETER
, "RegQueryValueExW returned: %lx\n", ret
);
231 ok(GetLastError() == 0xdeadbeef, "RegQueryValueExW returned: %lx\n", GetLastError());
232 ok(type
== 666, "Expected untouched, Type was set with: %ld\n", type
);
233 ok(size
== 666, "Expected untouched, Size was set with: %ld \n", size
);
234 ok(reserved
== 3, "Expected reserved = 3, reserved is: %ld \n", reserved
);
237 SetLastError(0xdeadbeef);
240 ret
= RegQueryValueExW(hkey_main
, L
"MSITESTVAR11", NULL
, &type
, NULL
, &size
);
241 ok(ret
== ERROR_SUCCESS
, "RegQueryValueExW returned: %lx\n", ret
);
242 ok(GetLastError() == 0xdeadbeef, "RegQueryValueExW returned: %lx\n", GetLastError());
243 ok(type
== REG_NONE
, "Expected REG_NONE, Type is: %ld\n", type
);
244 ok(size
== 4, "Expected size = 4, size is: %ld\n", size
);
247 /* Buffer one wchar smaller than needed */
248 SetLastError(0xdeadbeef);
249 size
= sizeof(data22
);
251 ret
= RegQueryValueExW(hkey_main
, L
"LONGSTRING", NULL
, &type
, (LPBYTE
)data22
, &size
);
252 ok(ret
== ERROR_MORE_DATA
, "RegQueryValueExW returned: %lx\n", ret
);
253 ok(GetLastError() == 0xdeadbeef, "RegQueryValueExW returned: %lx\n", GetLastError());
254 ok(type
== REG_SZ
, "Expected REG_SZ, Type is: %ld\n", type
);
255 ok(size
== 46, "Expected size = 46, size is: %ld\n", size
);
256 ok(wcscmp(data22
, string22W
), "Expected being different!");
258 /* Buffer has perfect size */
259 SetLastError(0xdeadbeef);
260 size
= sizeof(data23
);
262 ret
= RegQueryValueExW(hkey_main
, L
"LONGSTRING", NULL
, &type
, (LPBYTE
)data23
, &size
);
263 ok(ret
== ERROR_SUCCESS
, "RegQueryValueExW returned: %lx\n", ret
);
264 ok(GetLastError() == 0xdeadbeef, "RegQueryValueExW returned: %lx\n", GetLastError());
265 ok(type
== REG_SZ
, "Expected REG_SZ, Type is: %ld\n", type
);
266 ok(size
== 46, "Expected size = 46, size is: %ld", size
);
267 ok(!wcscmp(data23
,string22W
), "Expected same string! data23: %S, string22W: %S", data23
, string22W
);
269 /* Buffer one wchar bigger than needed */
270 SetLastError(0xdeadbeef);
271 size
= sizeof(data24
);
273 ret
= RegQueryValueExW(hkey_main
, L
"LONGSTRING", NULL
, &type
, (LPBYTE
)data24
, &size
);
274 ok(ret
== ERROR_SUCCESS
, "RegQueryValueExW returned: %lx\n", ret
);
275 ok(GetLastError() == 0xdeadbeef, "RegQueryValueExW returned: %lx\n", GetLastError());
276 ok(type
== REG_SZ
, "Expected REG_SZ, Type is: %ld\n", type
);
277 ok(size
== 46, "Expected size = 46, size is: %ld\n", size
);
278 ok(!wcscmp(data24
, string22W
), "Expected same string! data24: %S, string22W: %S\n", data24
, string22W
);
280 /* Buffer has perfect size. Size wrong: 1 WCHAR less */
281 SetLastError(0xdeadbeef);
282 memset(data23
, 0, sizeof(data23
));
283 size
= sizeof(data23
) - 2;
285 ret
= RegQueryValueExW(hkey_main
, L
"LONGSTRING", NULL
, &type
, (LPBYTE
)data23
, &size
);
286 ok(ret
== ERROR_MORE_DATA
, "RegQueryValueExW returned: %lx\n", ret
);
287 ok(GetLastError() == 0xdeadbeef, "RegQueryValueExW returned: %lx\n", GetLastError());
288 ok(type
== REG_SZ
, "Expected REG_SZ, Type is: %ld\n", type
);
289 ok(size
== 46, "Expected size = 46, size is: %ld", size
);
290 ok(wcscmp(data23
, string22W
), "Expected different string!\n");
292 /* Buffer has perfect size. Size wrong: 1 WCHAR more */
293 SetLastError(0xdeadbeef);
294 memset(data23
, 0, sizeof(data23
));
295 size
= sizeof(data23
) + 2;
297 ret
= RegQueryValueExW(hkey_main
, L
"LONGSTRING", NULL
, &type
, (LPBYTE
)data23
, &size
);
298 ok(ret
== ERROR_SUCCESS
, "RegQueryValueExW returned: %lx\n", ret
);
299 ok(GetLastError() == 0xdeadbeef, "RegQueryValueExW returned: %lx\n", GetLastError());
300 ok(type
== REG_SZ
, "Expected REG_SZ, Type is: %ld\n", type
);
301 ok(size
== 46, "Expected size = 46, size is: %ld", size
);
302 ok(!wcscmp(data23
, string22W
), "Expected same string! data23: %S, string22W: %S", data23
, string22W
);
304 /* Ask for a var that doesnt exist. */
305 SetLastError(0xdeadbeef);
306 size
= sizeof(data23
);
307 memset(data23
, 0, sizeof(data23
));
309 ret
= RegQueryValueExW(hkey_main
, L
"XXXXXYYYYYZZZZZZ", NULL
, &type
, (LPBYTE
)data23
, &size
);
310 ok(ret
== ERROR_FILE_NOT_FOUND
, "RegQueryValueExW returned: %lx\n", ret
);
311 ok(GetLastError() == 0xdeadbeef, "RegQueryValueExW returned: %lx\n", GetLastError());
312 /* 2k3 leaves garbage */
313 ok(type
== REG_NONE
|| broken(type
!= REG_NONE
&& type
!= 666), "Expected REG_NONE, Type is: %ld\n", type
);
314 ok(size
== 46, "Expected size = 46, size is: %ld", size
);
315 ok(!wcscmp(data23
,L
""), "Expected same string! data23: %S, ''", data23
);
318 RegCloseKey(hkey_main
);
321 /* Delete the whole test key */
322 RegOpenKeyW(HKEY_CURRENT_USER
, L
"Software\\ReactOS\\advapi32_apitest", &hkey_main
);
323 delete_key(hkey_main
);