ReactOS 0.4.15-dev-7788-g1ad9096
devinst.c
Go to the documentation of this file.
1/*
2 * Devinst tests
3 *
4 * Copyright 2006 Christian Gmeiner
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19 */
20
21#include <stdarg.h>
22#include <stdio.h>
23
24#include "windef.h"
25#include "winbase.h"
26#include "wingdi.h"
27#include "winuser.h"
28#include "winreg.h"
29#include "guiddef.h"
30#include "setupapi.h"
31#include "cfgmgr32.h"
32
33#include "wine/heap.h"
34#include "wine/test.h"
35
36#ifdef __REACTOS__
37DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0);
38#endif
39
40/* This is a unique guid for testing purposes */
41static GUID guid = {0x6a55b5a4, 0x3f65, 0x11db, {0xb7,0x04,0x00,0x11,0x95,0x5c,0x2b,0xdb}};
42static GUID guid2 = {0x6a55b5a5, 0x3f65, 0x11db, {0xb7,0x04,0x00,0x11,0x95,0x5c,0x2b,0xdb}};
43
45{
46 LONG ret;
47 DWORD dwMaxSubkeyLen, dwMaxValueLen;
48 DWORD dwMaxLen, dwSize;
49 WCHAR szNameBuf[MAX_PATH], *lpszName = szNameBuf;
50 HKEY hSubKey = hKey;
51
52 if(lpszSubKey)
53 {
54 ret = RegOpenKeyExW(hKey, lpszSubKey, 0, KEY_READ, &hSubKey);
55 if (ret) return ret;
56 }
57
58 /* Get highest length for keys, values */
59 ret = RegQueryInfoKeyW(hSubKey, NULL, NULL, NULL, NULL,
60 &dwMaxSubkeyLen, NULL, NULL, &dwMaxValueLen, NULL, NULL, NULL);
61 if (ret) goto cleanup;
62
63 dwMaxSubkeyLen++;
64 dwMaxValueLen++;
65 dwMaxLen = max(dwMaxSubkeyLen, dwMaxValueLen);
66 if (dwMaxLen > ARRAY_SIZE(szNameBuf))
67 {
68 /* Name too big: alloc a buffer for it */
69 if (!(lpszName = HeapAlloc( GetProcessHeap(), 0, dwMaxLen*sizeof(WCHAR))))
70 {
72 goto cleanup;
73 }
74 }
75
76
77 /* Recursively delete all the subkeys */
78 while (TRUE)
79 {
80 dwSize = dwMaxLen;
81 if (RegEnumKeyExW(hSubKey, 0, lpszName, &dwSize, NULL,
82 NULL, NULL, NULL)) break;
83
84 ret = devinst_RegDeleteTreeW(hSubKey, lpszName);
85 if (ret) goto cleanup;
86 }
87
88 if (lpszSubKey)
89 ret = RegDeleteKeyW(hKey, lpszSubKey);
90 else
91 while (TRUE)
92 {
93 dwSize = dwMaxLen;
94 if (RegEnumValueW(hKey, 0, lpszName, &dwSize,
95 NULL, NULL, NULL, NULL)) break;
96
97 ret = RegDeleteValueW(hKey, lpszName);
98 if (ret) goto cleanup;
99 }
100
101cleanup:
102 /* Free buffer if allocated */
103 if (lpszName != szNameBuf)
104 HeapFree( GetProcessHeap(), 0, lpszName);
105 if(lpszSubKey)
106 RegCloseKey(hSubKey);
107 return ret;
108}
109
111{
112 static const WCHAR machine[] = { 'd','u','m','m','y',0 };
113 static const WCHAR empty[] = { 0 };
114 static char notnull[] = "NotNull";
116 BOOL ret;
117
118 SetLastError(0xdeadbeef);
120 ok(set == INVALID_HANDLE_VALUE, "Expected failure.\n");
121 ok(GetLastError() == ERROR_INVALID_PARAMETER, "Got unexpected error %#x.\n", GetLastError());
122
123 SetLastError(0xdeadbeef);
125 ok(set == INVALID_HANDLE_VALUE, "Expected failure.\n");
129 "Got unexpected error %#x.\n", GetLastError());
130
132 ok(set != INVALID_HANDLE_VALUE, "Failed to create device list, error %#x.", GetLastError());
133
135 ok(ret, "Failed to destroy device list, error %#x.\n", GetLastError());
136
138 ok(set != INVALID_HANDLE_VALUE, "Failed to create device list, error %#x.", GetLastError());
139
141 ok(ret, "Failed to destroy device list, error %#x.\n", GetLastError());
142}
143
144static void test_open_class_key(void)
145{
146 static const char guidstr[] = "{6a55b5a4-3f65-11db-b704-0011955c2bdb}";
147 HKEY root_key, class_key;
148 LONG res;
149
150 SetLastError(0xdeadbeef);
152 ok(class_key == INVALID_HANDLE_VALUE, "Expected failure.\n");
154 ok(GetLastError() == ERROR_INVALID_CLASS, "Got unexpected error %#x.\n", GetLastError());
155
157 ok(root_key != INVALID_HANDLE_VALUE, "Failed to open root key, error %#x.\n", GetLastError());
158
159 res = RegCreateKeyA(root_key, guidstr, &class_key);
160 ok(!res, "Failed to create class key, error %#x.\n", GetLastError());
161 RegCloseKey(class_key);
162
163 SetLastError(0xdeadbeef);
165 ok(class_key != INVALID_HANDLE_VALUE, "Failed to open class key, error %#x.\n", GetLastError());
166 RegCloseKey(class_key);
167
168 RegDeleteKeyA(root_key, guidstr);
169 RegCloseKey(root_key);
170}
171
173{
174 DWORD dwNumberOfBytesWritten;
177
178 static const char data[] =
179 "[Version]\n"
180 "Signature=\"$Chicago$\"\n"
181 "Class=Bogus\n"
182 "ClassGUID={6a55b5a4-3f65-11db-b704-0011955c2bdb}\n"
183 "[ClassInstall32]\n"
184 "AddReg=BogusClass.NT.AddReg\n"
185 "[BogusClass.NT.AddReg]\n"
186 "HKR,,,,\"Wine test devices\"\n";
187
188 WriteFile(hf, data, sizeof(data) - 1, &dwNumberOfBytesWritten, NULL);
189 CloseHandle(hf);
190}
191
193{
194 static char curr[MAX_PATH] = { 0 };
195 char temp[MAX_PATH];
196 LPSTR ptr;
197
198 if (!*curr)
200 GetTempFileNameA(curr, "set", 0, temp);
201 ptr = strrchr(temp, '\\');
202
203 lstrcpyA(path, ptr + 1);
204}
205
206static void test_install_class(void)
207{
208 static const WCHAR classKey[] = {'S','y','s','t','e','m','\\',
209 'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\',
210 'C','o','n','t','r','o','l','\\','C','l','a','s','s','\\',
211 '{','6','a','5','5','b','5','a','4','-','3','f','6','5','-',
212 '1','1','d','b','-','b','7','0','4','-',
213 '0','0','1','1','9','5','5','c','2','b','d','b','}',0};
214 char tmpfile[MAX_PATH];
215 BOOL ret;
216
217 tmpfile[0] = '.';
218 tmpfile[1] = '\\';
221
223 ok(!ret, "Expected failure.\n");
224 ok(GetLastError() == ERROR_INVALID_PARAMETER, "Got unexpected error %#x.\n", GetLastError());
225
227 ok(!ret, "Expected failure.\n");
228 ok(GetLastError() == ERROR_INVALID_PARAMETER, "Got unexpected error %#x.\n", GetLastError());
229
231 ok(!ret, "Expected failure.\n");
232 ok(GetLastError() == ERROR_INVALID_PARAMETER, "Got unexpected error %#x.\n", GetLastError());
233
235 ok(!ret, "Expected failure.\n");
236 ok(GetLastError() == ERROR_FILE_NOT_FOUND, "Got unexpected error %#x.\n", GetLastError());
237
238 /* The next call will succeed. Information is put into the registry but the
239 * location(s) is/are depending on the Windows version.
240 */
242 ok(ret, "Failed to install class, error %#x.\n", GetLastError());
243
244 ok(!RegDeleteKeyW(HKEY_LOCAL_MACHINE, classKey), "Failed to delete class key, error %u.\n", GetLastError());
246}
247
248static void check_device_info_(int line, HDEVINFO set, int index, const GUID *class, const char *expect_id)
249{
250 SP_DEVINFO_DATA device = {sizeof(device)};
251 char id[50];
252 BOOL ret;
253
254 SetLastError(0xdeadbeef);
256 if (expect_id)
257 {
258 ok_(__FILE__, line)(ret, "Got unexpected error %#x.\n", GetLastError());
259 ok_(__FILE__, line)(IsEqualGUID(&device.ClassGuid, class),
260 "Got unexpected class %s.\n", wine_dbgstr_guid(&device.ClassGuid));
261 ret = SetupDiGetDeviceInstanceIdA(set, &device, id, sizeof(id), NULL);
262 ok_(__FILE__, line)(ret, "Got unexpected error %#x.\n", GetLastError());
263 ok_(__FILE__, line)(!strcasecmp(id, expect_id), "Got unexpected id %s.\n", id);
264 }
265 else
266 {
267 ok_(__FILE__, line)(!ret, "Expected failure.\n");
269 "Got unexpected error %#x.\n", GetLastError());
270 }
271}
272#define check_device_info(a,b,c,d) check_device_info_(__LINE__,a,b,c,d)
273
274static void test_device_info(void)
275{
276 static const GUID deadbeef = {0xdeadbeef,0xdead,0xbeef,{0xde,0xad,0xbe,0xef,0xde,0xad,0xbe,0xef}};
277 SP_DEVINFO_DATA device = {0}, ret_device = {sizeof(ret_device)};
278 char id[MAX_DEVICE_ID_LEN + 2];
280 BOOL ret;
281
282 SetLastError(0xdeadbeef);
284 ok(!ret, "Expected failure.\n");
285 ok(GetLastError() == ERROR_INVALID_DEVINST_NAME, "Got unexpected error %#x.\n", GetLastError());
286
287 SetLastError(0xdeadbeef);
288 ret = SetupDiCreateDeviceInfoA(NULL, "Root\\LEGACY_BOGUS\\0000", NULL, NULL, NULL, 0, NULL);
289 ok(!ret, "Expected failure.\n");
290 ok(GetLastError() == ERROR_INVALID_HANDLE, "Got unexpected error %#x.\n", GetLastError());
291
293 ok(set != INVALID_HANDLE_VALUE, "Failed to create device info, error %#x.\n", GetLastError());
294
295 SetLastError(0xdeadbeef);
296 ret = SetupDiCreateDeviceInfoA(set, "Root\\LEGACY_BOGUS\\0000", NULL, NULL, NULL, 0, NULL);
297 ok(!ret, "Expected failure.\n");
298 ok(GetLastError() == ERROR_INVALID_PARAMETER, "Got unexpected error %#x.\n", GetLastError());
299
300 SetLastError(0xdeadbeef);
301 ret = SetupDiCreateDeviceInfoA(set, "Root\\LEGACY_BOGUS\\0000", &deadbeef, NULL, NULL, 0, NULL);
302 ok(!ret, "Expected failure.\n");
303 ok(GetLastError() == ERROR_CLASS_MISMATCH, "Got unexpected error %#x.\n", GetLastError());
304
305 SetLastError(0xdeadbeef);
306 ret = SetupDiCreateDeviceInfoA(set, "Root\\LEGACY_BOGUS\\0000", &GUID_NULL, NULL, NULL, 0, NULL);
307 ok(!ret, "Expected failure.\n");
308 ok(GetLastError() == ERROR_CLASS_MISMATCH, "Got unexpected error %#x.\n", GetLastError());
309
310 ret = SetupDiCreateDeviceInfoA(set, "Root\\LEGACY_BOGUS\\0000", &guid, NULL, NULL, 0, NULL);
311 ok(ret, "Failed to create device, error %#x.\n", GetLastError());
312
313 check_device_info(set, 0, &guid, "ROOT\\LEGACY_BOGUS\\0000");
315
316 SetLastError(0xdeadbeef);
317 ret = SetupDiCreateDeviceInfoA(set, "Root\\LEGACY_BOGUS\\0000", &guid, NULL, NULL, 0, &device);
318 ok(!ret, "Expected failure.\n");
319 ok(GetLastError() == ERROR_DEVINST_ALREADY_EXISTS, "Got unexpected error %#x.\n", GetLastError());
320
321 SetLastError(0xdeadbeef);
322 ret = SetupDiCreateDeviceInfoA(set, "Root\\LEGACY_BOGUS\\0001", &guid, NULL, NULL, 0, &device);
323 ok(!ret, "Expected failure.\n");
324 ok(GetLastError() == ERROR_INVALID_USER_BUFFER, "Got unexpected error %#x.\n", GetLastError());
325
326 check_device_info(set, 0, &guid, "ROOT\\LEGACY_BOGUS\\0000");
327 check_device_info(set, 1, &guid, "ROOT\\LEGACY_BOGUS\\0001");
329
330 device.cbSize = sizeof(device);
331 ret = SetupDiCreateDeviceInfoA(set, "Root\\LEGACY_BOGUS\\0002", &guid, NULL, NULL, 0, &device);
332 ok(ret, "Got unexpected error %#x.\n", GetLastError());
333 ok(IsEqualGUID(&device.ClassGuid, &guid), "Got unexpected class %s.\n",
334 wine_dbgstr_guid(&device.ClassGuid));
335 ret = SetupDiGetDeviceInstanceIdA(set, &device, id, sizeof(id), NULL);
336 ok(ret, "Got unexpected error %#x.\n", GetLastError());
337 ok(!strcmp(id, "ROOT\\LEGACY_BOGUS\\0002"), "Got unexpected id %s.\n", id);
338
339 check_device_info(set, 0, &guid, "ROOT\\LEGACY_BOGUS\\0000");
340 check_device_info(set, 1, &guid, "ROOT\\LEGACY_BOGUS\\0001");
341 check_device_info(set, 2, &guid, "ROOT\\LEGACY_BOGUS\\0002");
343
344 ret = SetupDiEnumDeviceInfo(set, 0, &ret_device);
345 ok(ret, "Failed to enumerate devices, error %#x.\n", GetLastError());
346 ret = SetupDiDeleteDeviceInfo(set, &ret_device);
347 ok(ret, "Failed to delete device, error %#x.\n", GetLastError());
348
349 check_device_info(set, 0, &guid, "ROOT\\LEGACY_BOGUS\\0001");
350 check_device_info(set, 1, &guid, "ROOT\\LEGACY_BOGUS\\0002");
352
354 ok(ret, "Got unexpected error %#x.\n", GetLastError());
355
356 check_device_info(set, 0, &guid, "ROOT\\LEGACY_BOGUS\\0001");
357
358 ret = SetupDiEnumDeviceInfo(set, 1, &ret_device);
359 ok(ret, "Got unexpected error %#x.\n", GetLastError());
360 ok(IsEqualGUID(&ret_device.ClassGuid, &guid), "Got unexpected class %s.\n",
361 wine_dbgstr_guid(&ret_device.ClassGuid));
362 ret = SetupDiGetDeviceInstanceIdA(set, &ret_device, id, sizeof(id), NULL);
363 ok(!ret, "Expected failure.\n");
364 ok(GetLastError() == ERROR_NO_SUCH_DEVINST, "Got unexpected error %#x.\n", GetLastError());
365 ok(ret_device.DevInst == device.DevInst, "Expected device node %#x, got %#x.\n",
366 device.DevInst, ret_device.DevInst);
367
369
371
373 ok(set != INVALID_HANDLE_VALUE, "Failed to create device info, error %#x.\n", GetLastError());
374
375 SetLastError(0xdeadbeef);
376 ret = SetupDiCreateDeviceInfoA(set, "Root\\LEGACY_BOGUS\\0000", NULL, NULL, NULL, 0, NULL);
377 ok(!ret, "Expected failure.\n");
378 ok(GetLastError() == ERROR_INVALID_PARAMETER, "Got unexpected error %#x.\n", GetLastError());
379
380 ret = SetupDiCreateDeviceInfoA(set, "Root\\LEGACY_BOGUS\\deadbeef", &deadbeef, NULL, NULL, 0, NULL);
381 ok(ret, "Failed to create device, error %#x.\n", GetLastError());
382
383 ret = SetupDiCreateDeviceInfoA(set, "Root\\LEGACY_BOGUS\\null", &GUID_NULL, NULL, NULL, 0, NULL);
384 ok(ret, "Failed to create device, error %#x.\n", GetLastError());
385
386 ret = SetupDiCreateDeviceInfoA(set, "Root\\LEGACY_BOGUS\\testguid", &guid, NULL, NULL, 0, NULL);
387 ok(ret, "Failed to create device, error %#x.\n", GetLastError());
388
389 check_device_info(set, 0, &deadbeef, "ROOT\\LEGACY_BOGUS\\deadbeef");
390 check_device_info(set, 1, &GUID_NULL, "ROOT\\LEGACY_BOGUS\\null");
391 check_device_info(set, 2, &guid, "ROOT\\LEGACY_BOGUS\\testguid");
393
394 memset(id, 'x', sizeof(id));
395 memcpy(id, "Root\\LEGACY_BOGUS\\", strlen("Root\\LEGACY_BOGUS\\"));
396 id[MAX_DEVICE_ID_LEN + 1] = 0;
397 SetLastError(0xdeadbeef);
399 ok(!ret, "Expected failure.\n");
400 ok(GetLastError() == ERROR_INVALID_DEVINST_NAME, "Got unexpected error %#x.\n", GetLastError());
401
402 id[MAX_DEVICE_ID_LEN] = 0;
403 SetLastError(0xdeadbeef);
405 ok(!ret, "Expected failure.\n");
406 ok(GetLastError() == ERROR_INVALID_DEVINST_NAME, "Got unexpected error %#x.\n", GetLastError());
407
408 id[MAX_DEVICE_ID_LEN - 1] = 0;
410 ok(ret, "Failed to create device, error %#x.\n", GetLastError());
411
413}
414
416{
417 BOOL ret;
420 char id[200];
421 DWORD size;
422
423 SetLastError(0xdeadbeef);
425 ok(!ret, "Expected failure.\n");
426 ok(GetLastError() == ERROR_INVALID_HANDLE, "Got unexpected error %#x.\n", GetLastError());
427
428 SetLastError(0xdeadbeef);
430 ok(!ret, "Expected failure.\n");
431 ok(GetLastError() == ERROR_INVALID_HANDLE, "Got unexpected error %#x.\n", GetLastError());
432
434 ok(set != INVALID_HANDLE_VALUE, "Failed to create device list, error %#x.\n", GetLastError());
435
436 SetLastError(0xdeadbeef);
438 ok(!ret, "Expected failure.\n");
439 ok(GetLastError() == ERROR_INVALID_PARAMETER, "Got unexpected error %#x.\n", GetLastError());
440
441 SetLastError(0xdeadbeef);
443 ok(!ret, "Expected failure.\n");
444 ok(GetLastError() == ERROR_INVALID_PARAMETER, "Got unexpected error %#x.\n", GetLastError());
445
446 SetLastError(0xdeadbeef);
448 ok(!ret, "Expected failure.\n");
449 ok(GetLastError() == ERROR_INVALID_PARAMETER, "Got unexpected error %#x.\n", GetLastError());
450
451 device.cbSize = sizeof(device);
452 SetLastError(0xdeadbeef);
454 ok(!ret, "Expected failure.\n");
455 ok(GetLastError() == ERROR_INVALID_PARAMETER, "Got unexpected error %#x.\n", GetLastError());
456
457 ret = SetupDiCreateDeviceInfoA(set, "Root\\LEGACY_BOGUS\\0000", &guid, NULL, NULL, 0, &device);
458 ok(ret, "Failed to create device, error %#x.\n", GetLastError());
459
460 SetLastError(0xdeadbeef);
462 ok(!ret, "Expected failure.\n");
463 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Got unexpected error %#x.\n", GetLastError());
464
465 ret = SetupDiGetDeviceInstanceIdA(set, &device, id, sizeof(id), NULL);
466 ok(ret, "Failed to get device id, error %#x.\n", GetLastError());
467 ok(!strcmp(id, "ROOT\\LEGACY_BOGUS\\0000"), "Got unexpected id %s.\n", id);
468
470 ok(ret, "SetupDiCreateDeviceInfoA failed: %08x\n", GetLastError());
471
472 ret = SetupDiGetDeviceInstanceIdA(set, &device, id, sizeof(id), NULL);
473 ok(ret, "Failed to get device id, error %#x.\n", GetLastError());
474 ok(!strcmp(id, "ROOT\\LEGACY_BOGUS\\0001"), "Got unexpected id %s.\n", id);
475
477}
478
480{
482 BOOL ret;
484 int i = 0;
485
486 SetLastError(0xdeadbeef);
488 ok(!ret, "Expected failure.\n");
489 ok(GetLastError() == ERROR_INVALID_HANDLE, "Got unexpected error %#x.\n", GetLastError());
490
492 ok(set != INVALID_HANDLE_VALUE, "Failed to create device list, error %#x.\n", GetLastError());
493
494 SetLastError(0xdeadbeef);
496 ok(!ret, "Expected failure.\n");
497 ok(GetLastError() == ERROR_INVALID_PARAMETER, "Got unexpected error %#x.\n", GetLastError());
498
499 SetLastError(0xdeadbeef);
501 ok(!ret, "Expected failure.\n");
502 ok(GetLastError() == ERROR_INVALID_PARAMETER, "Got unexpected error %#x.\n", GetLastError());
503
504 device.cbSize = sizeof(device);
505 SetLastError(0xdeadbeef);
507 ok(!ret, "Expected failure.\n");
508 ok(GetLastError() == ERROR_INVALID_PARAMETER, "Got unexpected error %#x.\n", GetLastError());
509
510 ret = SetupDiCreateDeviceInfoA(set, "Root\\LEGACY_BOGUS\\0000", &guid, NULL, NULL, 0, &device);
511 ok(ret, "Failed to create device, error %#x.\n", GetLastError());
513 ok(ret, "Failed to register device, error %#x.\n", GetLastError());
514
515 ret = SetupDiCreateDeviceInfoA(set, "Root\\LEGACY_BOGUS\\0001", &guid, NULL, NULL, 0, &device);
516 ok(ret, "Failed to create device, error %#x.\n", GetLastError());
518 ok(ret, "Failed to register device, error %#x.\n", GetLastError());
520 ok(ret, "Failed to remove device, error %#x.\n", GetLastError());
521
522 ret = SetupDiCreateDeviceInfoA(set, "Root\\LEGACY_BOGUS\\0002", &guid, NULL, NULL, 0, &device);
523 ok(ret, "Failed to create device, error %#x.\n", GetLastError());
525 ok(ret, "Failed to register device, error %#x.\n", GetLastError());
527 ok(ret, "Failed to remove device, error %#x.\n", GetLastError());
528
529 ret = SetupDiCreateDeviceInfoA(set, "Root\\LEGACY_BOGUS\\0003", &guid, NULL, NULL, 0, &device);
530 ok(ret, "Failed to create device, error %#x.\n", GetLastError());
531
533
535 ok(set != INVALID_HANDLE_VALUE, "Failed to create device list, error %#x.\n", GetLastError());
536
537 check_device_info(set, 0, &guid, "Root\\LEGACY_BOGUS\\0000");
538 check_device_info(set, 1, &guid, "Root\\LEGACY_BOGUS\\0002");
540
541 while (SetupDiEnumDeviceInfo(set, i++, &device))
542 {
544 ok(ret, "Failed to remove device, error %#x.\n", GetLastError());
545 }
546
548}
549
551 const GUID *class, int index, DWORD flags, const char *path)
552{
553 char buffer[200];
555 SP_DEVICE_INTERFACE_DATA iface = {sizeof(iface)};
556 BOOL ret;
557
558 detail->cbSize = sizeof(*detail);
559
560 SetLastError(0xdeadbeef);
561 ret = SetupDiEnumDeviceInterfaces(set, device, class, index, &iface);
562 if (path)
563 {
564 ok_(__FILE__, line)(ret, "Failed to enumerate interfaces, error %#x.\n", GetLastError());
565 ok_(__FILE__, line)(IsEqualGUID(&iface.InterfaceClassGuid, class),
566 "Got unexpected class %s.\n", wine_dbgstr_guid(&iface.InterfaceClassGuid));
567 ok_(__FILE__, line)(iface.Flags == flags, "Got unexpected flags %#x.\n", iface.Flags);
568 ret = SetupDiGetDeviceInterfaceDetailA(set, &iface, detail, sizeof(buffer), NULL, NULL);
569 ok_(__FILE__, line)(ret, "Failed to get interface detail, error %#x.\n", GetLastError());
570 ok_(__FILE__, line)(!strcasecmp(detail->DevicePath, path), "Got unexpected path %s.\n", detail->DevicePath);
571 }
572 else
573 {
574 ok_(__FILE__, line)(!ret, "Expected failure.\n");
576 "Got unexpected error %#x.\n", GetLastError());
577 }
578}
579#define check_device_iface(a,b,c,d,e,f) check_device_iface_(__LINE__,a,b,c,d,e,f)
580
581static void test_device_iface(void)
582{
583 char buffer[200];
585 SP_DEVICE_INTERFACE_DATA iface = {sizeof(iface)};
587 BOOL ret;
589
590 detail->cbSize = sizeof(*detail);
591
592 SetLastError(0xdeadbeef);
594 ok(!ret, "Expected failure.\n");
595 ok(GetLastError() == ERROR_INVALID_HANDLE, "Got unexpected error %#x.\n", GetLastError());
596
597 SetLastError(0xdeadbeef);
599 ok(!ret, "Expected failure.\n");
600 ok(GetLastError() == ERROR_INVALID_HANDLE, "Got unexpected error %#x.\n", GetLastError());
601
603 ok(set != INVALID_HANDLE_VALUE, "Failed to create device list, error %#x.\n", GetLastError());
604
605 SetLastError(0xdeadbeef);
607 ok(!ret, "Expected failure.\n");
608 ok(GetLastError() == ERROR_INVALID_PARAMETER, "Got unexpected error %#x.\n", GetLastError());
609
610 SetLastError(0xdeadbeef);
612 ok(!ret, "Expected failure.\n");
613 ok(GetLastError() == ERROR_INVALID_PARAMETER, "Got unexpected error %#x.\n", GetLastError());
614
615 device.cbSize = sizeof(device);
616 ret = SetupDiCreateDeviceInfoA(set, "ROOT\\LEGACY_BOGUS\\0000", &guid, NULL, NULL, 0, &device);
617 ok(ret, "Failed to create device, error %#x.\n", GetLastError());
618
620
621 SetLastError(0xdeadbeef);
623 ok(!ret, "Expected failure.\n");
624 ok(GetLastError() == ERROR_INVALID_USER_BUFFER, "Got unexpected error %#x.\n", GetLastError());
625
627 ok(ret, "Failed to create interface, error %#x.\n", GetLastError());
628
629 check_device_iface(set, &device, &guid, 0, 0, "\\\\?\\ROOT#LEGACY_BOGUS#0000#{6A55B5A4-3F65-11DB-B704-0011955C2BDB}");
631
632 /* Creating the same interface a second time succeeds */
634 ok(ret, "Failed to create interface, error %#x.\n", GetLastError());
635
636 check_device_iface(set, &device, &guid, 0, 0, "\\\\?\\ROOT#LEGACY_BOGUS#0000#{6A55B5A4-3F65-11DB-B704-0011955C2BDB}");
638
640 ok(ret, "Failed to create interface, error %#x.\n", GetLastError());
641
642 check_device_iface(set, &device, &guid, 0, 0, "\\\\?\\ROOT#LEGACY_BOGUS#0000#{6A55B5A4-3F65-11DB-B704-0011955C2BDB}");
643 check_device_iface(set, &device, &guid, 1, 0, "\\\\?\\ROOT#LEGACY_BOGUS#0000#{6A55B5A4-3F65-11DB-B704-0011955C2BDB}\\Oogah");
645
646 ret = SetupDiCreateDeviceInterfaceA(set, &device, &guid, "test", 0, &iface);
647 ok(ret, "Failed to create interface, error %#x.\n", GetLastError());
648 ok(IsEqualGUID(&iface.InterfaceClassGuid, &guid), "Got unexpected class %s.\n",
650 ok(iface.Flags == 0, "Got unexpected flags %#x.\n", iface.Flags);
651 ret = SetupDiGetDeviceInterfaceDetailA(set, &iface, detail, sizeof(buffer), NULL, NULL);
652 ok(ret, "Failed to get interface detail, error %#x.\n", GetLastError());
653 ok(!strcasecmp(detail->DevicePath, "\\\\?\\ROOT#LEGACY_BOGUS#0000#{6A55B5A4-3F65-11DB-B704-0011955C2BDB}\\test"),
654 "Got unexpected path %s.\n", detail->DevicePath);
655
656 check_device_iface(set, &device, &guid, 0, 0, "\\\\?\\ROOT#LEGACY_BOGUS#0000#{6A55B5A4-3F65-11DB-B704-0011955C2BDB}");
657 check_device_iface(set, &device, &guid, 1, 0, "\\\\?\\ROOT#LEGACY_BOGUS#0000#{6A55B5A4-3F65-11DB-B704-0011955C2BDB}\\Oogah");
658 check_device_iface(set, &device, &guid, 2, 0, "\\\\?\\ROOT#LEGACY_BOGUS#0000#{6A55B5A4-3F65-11DB-B704-0011955C2BDB}\\test");
660
662 ok(ret, "Failed to create interface, error %#x.\n", GetLastError());
663
664 check_device_iface(set, &device, &guid2, 0, 0, "\\\\?\\ROOT#LEGACY_BOGUS#0000#{6A55B5A5-3F65-11DB-B704-0011955C2BDB}");
666
668 ok(ret, "Failed to enumerate interfaces, error %#x.\n", GetLastError());
670 ok(ret, "Failed to remove interface, error %#x.\n", GetLastError());
671
672 check_device_iface(set, &device, &guid2, 0, SPINT_REMOVED, "\\\\?\\ROOT#LEGACY_BOGUS#0000#{6A55B5A5-3F65-11DB-B704-0011955C2BDB}");
674
676 ok(ret, "Failed to enumerate interfaces, error %#x.\n", GetLastError());
678 ok(ret, "Failed to delete interface, error %#x.\n", GetLastError());
679
680 check_device_iface(set, &device, &guid, 0, 0, "\\\\?\\ROOT#LEGACY_BOGUS#0000#{6A55B5A4-3F65-11DB-B704-0011955C2BDB}\\Oogah");
681 check_device_iface(set, &device, &guid, 1, 0, "\\\\?\\ROOT#LEGACY_BOGUS#0000#{6A55B5A4-3F65-11DB-B704-0011955C2BDB}\\test");
683
685 ok(ret, "Failed to destroy device list, error %#x.\n", GetLastError());
686}
687
689{
690 static const char path[] = "\\\\?\\root#legacy_bogus#0000#{6a55b5a4-3f65-11db-b704-0011955c2bdb}";
692 SP_DEVICE_INTERFACE_DATA iface = {sizeof(iface)};
693 SP_DEVINFO_DATA device = {sizeof(device)};
694 DWORD size = 0, expectedsize;
696 BOOL ret;
697
698 SetLastError(0xdeadbeef);
700 ok(!ret, "Expected failure.\n");
701 ok(GetLastError() == ERROR_INVALID_HANDLE, "Got unexpected error %#x.\n", GetLastError());
702
704 ok(set != INVALID_HANDLE_VALUE, "Failed to create device list, error %#x.\n", GetLastError());
705
706 SetLastError(0xdeadbeef);
708 ok(!ret, "Expected failure.\n");
709 ok(GetLastError() == ERROR_INVALID_PARAMETER, "Got unexpected error %#x.\n", GetLastError());
710
711 ret = SetupDiCreateDeviceInfoA(set, "ROOT\\LEGACY_BOGUS\\0000", &guid, NULL, NULL, 0, &device);
712 ok(ret, "Failed to create device, error %#x.\n", GetLastError());
713
714 SetLastError(0xdeadbeef);
716 ok(ret, "Failed to create interface, error %#x.\n", GetLastError());
717
718 SetLastError(0xdeadbeef);
720 ok(!ret, "Expected failure.\n");
721 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Got unexpected error %#x.\n", GetLastError());
722
723 SetLastError(0xdeadbeef);
725 ok(!ret, "Expected failure.\n");
726 ok(GetLastError() == ERROR_INVALID_USER_BUFFER, "Got unexpected error %#x.\n", GetLastError());
727
728 SetLastError(0xdeadbeef);
730 ok(!ret, "Expected failure.\n");
731 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Got unexpected error %#x.\n", GetLastError());
732
733 detail = heap_alloc(size);
734 expectedsize = FIELD_OFFSET(SP_DEVICE_INTERFACE_DETAIL_DATA_W, DevicePath[strlen(path) + 1]);
735
736 detail->cbSize = 0;
737 SetLastError(0xdeadbeef);
738 ret = SetupDiGetDeviceInterfaceDetailA(set, &iface, detail, size, &size, NULL);
739 ok(!ret, "Expected failure.\n");
740 ok(GetLastError() == ERROR_INVALID_USER_BUFFER, "Got unexpected error %#x.\n", GetLastError());
741
742 detail->cbSize = size;
743 SetLastError(0xdeadbeef);
744 ret = SetupDiGetDeviceInterfaceDetailA(set, &iface, detail, size, &size, NULL);
745 ok(!ret, "Expected failure.\n");
746 ok(GetLastError() == ERROR_INVALID_USER_BUFFER, "Got unexpected error %#x.\n", GetLastError());
747
749 SetLastError(0xdeadbeef);
750 ret = SetupDiGetDeviceInterfaceDetailA(set, &iface, detail, size, &size, NULL);
751 ok(ret, "Failed to get interface detail, error %#x.\n", GetLastError());
752 ok(!strcasecmp(path, detail->DevicePath), "Got unexpected path %s.\n", detail->DevicePath);
753
755 ok(!ret, "Expected failure.\n");
756 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Got unexpected error %#x.\n", GetLastError());
757 ok(size == expectedsize, "Got unexpected size %d.\n", size);
758
759 memset(&device, 0, sizeof(device));
760 device.cbSize = sizeof(device);
762 ok(!ret, "Expected failure.\n");
763 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Got unexpected error %#x.\n", GetLastError());
764 ok(IsEqualGUID(&device.ClassGuid, &guid), "Got unexpected class %s.\n", wine_dbgstr_guid(&device.ClassGuid));
765
766 heap_free(detail);
768}
769
770static void test_device_key(void)
771{
772 static const WCHAR classKey[] = {'S','y','s','t','e','m','\\',
773 'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\',
774 'C','o','n','t','r','o','l','\\','C','l','a','s','s','\\',
775 '{','6','a','5','5','b','5','a','4','-','3','f','6','5','-',
776 '1','1','d','b','-','b','7','0','4','-',
777 '0','0','1','1','9','5','5','c','2','b','d','b','}',0};
778 static const WCHAR bogus[] = {'S','y','s','t','e','m','\\',
779 'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\',
780 'E','n','u','m','\\','R','o','o','t','\\',
781 'L','E','G','A','C','Y','_','B','O','G','U','S',0};
782 SP_DEVINFO_DATA device = {sizeof(device)};
783 BOOL ret;
785 HKEY key = NULL;
786 LONG res;
787
788 SetLastError(0xdeadbeef);
790 ok(key == INVALID_HANDLE_VALUE, "Expected failure.\n");
791 ok(GetLastError() == ERROR_INVALID_HANDLE, "Got unexpected error %#x.\n", GetLastError());
792
794 ok(set != INVALID_HANDLE_VALUE, "Failed to create device list, error %#x.\n", GetLastError());
795
797 ok(res != ERROR_SUCCESS, "Key should not exist.\n");
799
800 ret = SetupDiCreateDeviceInfoA(set, "ROOT\\LEGACY_BOGUS\\0000", &guid, NULL, NULL, 0, &device);
801 ok(ret, "Failed to create device, error %#x.\n", GetLastError());
802 ok(!RegOpenKeyW(HKEY_LOCAL_MACHINE, bogus, &key), "Key should exist.\n");
804
805 SetLastError(0xdeadbeef);
806 key = SetupDiOpenDevRegKey(NULL, NULL, 0, 0, 0, 0);
807 ok(key == INVALID_HANDLE_VALUE, "Expected failure.\n");
808 ok(GetLastError() == ERROR_INVALID_HANDLE, "Got unexpected error %#x.\n", GetLastError());
809
810 SetLastError(0xdeadbeef);
811 key = SetupDiOpenDevRegKey(set, NULL, 0, 0, 0, 0);
812 ok(key == INVALID_HANDLE_VALUE, "Expected failure.\n");
813 ok(GetLastError() == ERROR_INVALID_PARAMETER, "Got unexpected error %#x.\n", GetLastError());
814
815 SetLastError(0xdeadbeef);
816 key = SetupDiOpenDevRegKey(set, &device, 0, 0, 0, 0);
817 ok(key == INVALID_HANDLE_VALUE, "Expected failure.\n");
818 ok(GetLastError() == ERROR_INVALID_FLAGS, "Got unexpected error %#x.\n", GetLastError());
819
820 SetLastError(0xdeadbeef);
822 ok(key == INVALID_HANDLE_VALUE, "Expected failure.\n");
823 ok(GetLastError() == ERROR_INVALID_FLAGS, "Got unexpected error %#x.\n", GetLastError());
824
825 SetLastError(0xdeadbeef);
827 ok(key == INVALID_HANDLE_VALUE, "Expected failure.\n");
828 ok(GetLastError() == ERROR_INVALID_FLAGS, "Got unexpected error %#x.\n", GetLastError());
829
830 SetLastError(0xdeadbeef);
832 ok(key == INVALID_HANDLE_VALUE, "Expected failure.\n");
833 ok(GetLastError() == ERROR_DEVINFO_NOT_REGISTERED, "Got unexpected error %#x.\n", GetLastError());
834
836 ok(ret, "Failed to register device, error %#x.\n", GetLastError());
837
838 SetLastError(0xdeadbeef);
840 ok(key == INVALID_HANDLE_VALUE, "Expected failure.\n");
841 ok(GetLastError() == ERROR_KEY_DOES_NOT_EXIST, "Got unexpected error %#x.\n", GetLastError());
842
843 SetLastError(0xdeadbeef);
844 res = RegOpenKeyW(HKEY_LOCAL_MACHINE, classKey, &key);
846 ok(res == ERROR_FILE_NOT_FOUND, "Key should not exist.\n");
848
851 "Failed to create device key, error %#x.\n", GetLastError());
853 {
855
856 ok(!RegOpenKeyW(HKEY_LOCAL_MACHINE, classKey, &key), "Key should exist.\n");
858
859 SetLastError(0xdeadbeef);
861todo_wine {
862 ok(key == INVALID_HANDLE_VALUE, "Expected failure.\n");
864 "Got unexpected error %#x.\n", GetLastError());
865}
866
868 ok(key != INVALID_HANDLE_VALUE, "Failed to open device key, error %#x.\n", GetLastError());
870 }
871
873 ok(ret, "Failed to remove device, error %#x.\n", GetLastError());
875
876 /* remove once Wine is fixed */
878}
879
881{
882 static const WCHAR bogus[] = {'S','y','s','t','e','m','\\',
883 'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\',
884 'E','n','u','m','\\','R','o','o','t','\\',
885 'L','E','G','A','C','Y','_','B','O','G','U','S',0};
886 SP_DEVICE_INTERFACE_DATA iface = {sizeof(iface)}, ret_iface = {sizeof(ret_iface)};
887 SP_DEVINFO_DATA device = {sizeof(device)};
888 HDEVINFO set, set2;
889 BOOL ret;
890 HKEY key;
891 LONG res;
892
894 ok(set != INVALID_HANDLE_VALUE, "Failed to create device list, error %#x.\n", GetLastError());
895
897 ok(res == ERROR_FILE_NOT_FOUND, "Key should not exist.\n");
898
899 ret = SetupDiCreateDeviceInfoA(set, "Root\\LEGACY_BOGUS\\0000", &guid, NULL, NULL, 0, &device);
900 ok(ret, "Failed to create device, error %#x.\n", GetLastError());
902 ok(ret, "Failed to create interface, error %#x.\n", GetLastError());
903 ret = SetupDiCreateDeviceInterfaceA(set, &device, &guid, "removed", 0, &iface);
904 ok(ret, "Failed to create interface, error %#x.\n", GetLastError());
905 ret = SetupDiCreateDeviceInterfaceA(set, &device, &guid, "deleted", 0, &iface);
906 ok(ret, "Failed to create interface, error %#x.\n", GetLastError());
908 ok(ret, "Failed to register device, error %#x.\n", GetLastError());
909
911 ok(ret, "Failed to enumerate interfaces, error %#x.\n", GetLastError());
913 ok(ret, "Failed to delete interface, error %#x.\n", GetLastError());
915 ok(ret, "Failed to enumerate interfaces, error %#x.\n", GetLastError());
917 ok(ret, "Failed to delete interface, error %#x.\n", GetLastError());
918
920 ok(set2 != INVALID_HANDLE_VALUE, "Failed to create device list, error %#x.\n", GetLastError());
921
922 check_device_iface(set2, NULL, &guid, 0, 0, "\\\\?\\root#legacy_bogus#0000#{6a55b5a4-3f65-11db-b704-0011955c2bdb}");
923 check_device_iface(set2, NULL, &guid, 1, 0, "\\\\?\\root#legacy_bogus#0000#{6a55b5a4-3f65-11db-b704-0011955c2bdb}\\deleted");
924 check_device_iface(set2, NULL, &guid, 2, 0, NULL);
925
927 ok(ret, "Failed to remove device, error %#x.\n", GetLastError());
928
931}
932
934{
935 static const CHAR bogus[] = "System\\CurrentControlSet\\Enum\\Root\\LEGACY_BOGUS";
936 SP_DEVINFO_DATA device = {sizeof(device)};
937 CHAR buf[6] = "";
938 DWORD size, type;
940 BOOL ret;
941 LONG res;
942 HKEY key;
943
945 ok(set != INVALID_HANDLE_VALUE, "Failed to get device list, error %#x.\n", GetLastError());
946
948 ok(ret, "Failed to create device, error %#x.\n", GetLastError());
949
950 SetLastError(0xdeadbeef);
952 ok(!ret, "Expected failure.\n");
953 ok(GetLastError() == ERROR_INVALID_HANDLE, "Got unexpected error %#x.\n", GetLastError());
954
955 SetLastError(0xdeadbeef);
957 ok(!ret, "Expected failure.\n");
958 ok(GetLastError() == ERROR_INVALID_PARAMETER, "Got unexpected error %#x.\n", GetLastError());
959
960 SetLastError(0xdeadbeef);
962 ok(!ret, "Expected failure.\n");
964 ok(GetLastError() == ERROR_INVALID_REG_PROPERTY, "Got unexpected error %#x.\n", GetLastError());
965
968 ok(!ret, "Expected failure.\n");
969 /* GetLastError() returns nonsense in win2k3 */
970
971 SetLastError(0xdeadbeef);
972 ret = SetupDiSetDeviceRegistryPropertyA(set, &device, SPDRP_FRIENDLYNAME, (BYTE *)"Bogus", sizeof("Bogus"));
973 ok(ret, "Failed to set property, error %#x.\n", GetLastError());
974
975 SetLastError(0xdeadbeef);
977 ok(!ret, "Expected failure.\n");
978 ok(GetLastError() == ERROR_INVALID_HANDLE, "Got unexpected error %#x.\n", GetLastError());
979
980 SetLastError(0xdeadbeef);
982 ok(!ret, "Expected failure.\n");
983 ok(GetLastError() == ERROR_INVALID_PARAMETER, "Got unexpected error %#x.\n", GetLastError());
984
985 SetLastError(0xdeadbeef);
987 ok(!ret, "Expected failure.\n");
989 ok(GetLastError() == ERROR_INVALID_REG_PROPERTY, "Got unexpected error %#x.\n", GetLastError());
990
992 ok(!ret, "Expected failure, got %d\n", ret);
993 /* GetLastError() returns nonsense in win2k3 */
994
995 SetLastError(0xdeadbeef);
997 ok(!ret, "Expected failure.\n");
998 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Got unexpected error %#x.\n", GetLastError());
999 ok(size == sizeof("Bogus"), "Got unexpected size %d.\n", size);
1000
1001 SetLastError(0xdeadbeef);
1003 ok(ret, "Failed to get property, error %#x.\n", GetLastError());
1004 ok(!strcmp(buf, "Bogus"), "Got unexpected property %s.\n", buf);
1005
1006 SetLastError(0xdeadbeef);
1008 ok(ret, "Failed to get property, error %#x.\n", GetLastError());
1009 ok(!strcmp(buf, "Bogus"), "Got unexpected property %s.\n", buf);
1010 ok(type == REG_SZ, "Got unexpected type %d.\n", type);
1011
1012 SetLastError(0xdeadbeef);
1014 ok(ret, "Failed to set property, error %#x.\n", GetLastError());
1015
1016 SetLastError(0xdeadbeef);
1018todo_wine {
1019 ok(!ret, "Expected failure.\n");
1020 ok(GetLastError() == ERROR_INVALID_DATA, "Got unexpected error %#x.\n", GetLastError());
1021}
1022
1024 ok(!ret, "Expected failure.\n");
1025 ok(GetLastError() == ERROR_INVALID_DATA, "Got unexpected error %#x.\n", GetLastError());
1026
1028
1030 ok(res == ERROR_FILE_NOT_FOUND, "Key should not exist.\n");
1031}
1032
1034{
1035 WCHAR friendly_name[] = {'B','o','g','u','s',0};
1036 SP_DEVINFO_DATA device = {sizeof(device)};
1037 WCHAR buf[6] = {0};
1038 DWORD size, type;
1039 HDEVINFO set;
1040 BOOL ret;
1041 LONG res;
1042 HKEY key;
1043 static const WCHAR bogus[] = {'S','y','s','t','e','m','\\',
1044 'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\',
1045 'E','n','u','m','\\','R','o','o','t','\\',
1046 'L','E','G','A','C','Y','_','B','O','G','U','S',0};
1047
1049 ok(set != INVALID_HANDLE_VALUE, "Failed to get device list, error %#x.\n", GetLastError());
1050
1052 ok(ret, "Failed to create device, error %#x.\n", GetLastError());
1053
1054 SetLastError(0xdeadbeef);
1056 ok(!ret, "Expected failure.\n");
1057 ok(GetLastError() == ERROR_INVALID_HANDLE, "Got unexpected error %#x.\n", GetLastError());
1058
1059 SetLastError(0xdeadbeef);
1061 ok(!ret, "Expected failure.\n");
1062 ok(GetLastError() == ERROR_INVALID_PARAMETER, "Got unexpected error %#x.\n", GetLastError());
1063
1064 SetLastError(0xdeadbeef);
1066 ok(!ret, "Expected failure.\n");
1068 ok(GetLastError() == ERROR_INVALID_REG_PROPERTY, "Got unexpected error %#x.\n", GetLastError());
1069
1071 todo_wine
1072 ok(!ret, "Expected failure.\n");
1073 /* GetLastError() returns nonsense in win2k3 */
1074
1075 SetLastError(0xdeadbeef);
1077 ok(ret, "Failed to set property, error %#x.\n", GetLastError());
1078
1079 SetLastError(0xdeadbeef);
1081 ok(!ret, "Expected failure.\n");
1082 ok(GetLastError() == ERROR_INVALID_HANDLE, "Got unexpected error %#x.\n", GetLastError());
1083
1084 SetLastError(0xdeadbeef);
1086 ok(!ret, "Expected failure.\n");
1087 ok(GetLastError() == ERROR_INVALID_PARAMETER, "Got unexpected error %#x.\n", GetLastError());
1088
1089 SetLastError(0xdeadbeef);
1091 ok(!ret, "Expected failure.\n");
1093 ok(GetLastError() == ERROR_INVALID_REG_PROPERTY, "Got unexpected error %#x.\n", GetLastError());
1094
1096 ok(!ret, "Expected failure.\n");
1097 /* GetLastError() returns nonsense in win2k3 */
1098
1099 SetLastError(0xdeadbeef);
1101 ok(!ret, "Expected failure.\n");
1102 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Got unexpected error %#x.\n", GetLastError());
1103 ok(size == sizeof(friendly_name), "Got unexpected size %d.\n", size);
1104
1105 SetLastError(0xdeadbeef);
1107 ok(ret, "Failed to get property, error %#x.\n", GetLastError());
1108 ok(!lstrcmpW(buf, friendly_name), "Got unexpected property %s.\n", wine_dbgstr_w(buf));
1109
1110 SetLastError(0xdeadbeef);
1112 ok(ret, "Failed to get property, error %#x.\n", GetLastError());
1113 ok(!lstrcmpW(buf, friendly_name), "Got unexpected property %s.\n", wine_dbgstr_w(buf));
1114 ok(type == REG_SZ, "Got unexpected type %d.\n", type);
1115
1116 SetLastError(0xdeadbeef);
1118 ok(ret, "Failed to set property, error %#x.\n", GetLastError());
1119
1120 SetLastError(0xdeadbeef);
1122todo_wine {
1123 ok(!ret, "Expected failure.\n");
1124 ok(GetLastError() == ERROR_INVALID_DATA, "Got unexpected error %#x.\n", GetLastError());
1125}
1126
1128 ok(!ret, "Expected failure.\n");
1129 ok(GetLastError() == ERROR_INVALID_DATA, "Got unexpected error %#x.\n", GetLastError());
1130
1132
1134 ok(res == ERROR_FILE_NOT_FOUND, "Key should not exist.\n");
1135}
1136
1137static void test_get_inf_class(void)
1138{
1139 static const char inffile[] = "winetest.inf";
1140 static const char content[] = "[Version]\r\n\r\n";
1141 static const char* signatures[] = {"\"$CHICAGO$\"", "\"$Windows NT$\""};
1142
1143 char cn[MAX_PATH];
1144 char filename[MAX_PATH];
1145 DWORD count;
1146 BOOL retval;
1147 GUID guid;
1148 HANDLE h;
1149 int i;
1150
1154
1155 /* not existing file */
1156 SetLastError(0xdeadbeef);
1158 ok(!retval, "expected SetupDiGetINFClassA to fail!\n");
1160 "expected error ERROR_FILE_NOT_FOUND, got %u\n", GetLastError());
1161
1162 /* missing file wins against other invalid parameter */
1163 SetLastError(0xdeadbeef);
1165 ok(!retval, "expected SetupDiGetINFClassA to fail!\n");
1167 "expected error ERROR_FILE_NOT_FOUND, got %u\n", GetLastError());
1168
1169 SetLastError(0xdeadbeef);
1171 ok(!retval, "expected SetupDiGetINFClassA to fail!\n");
1173 "expected error ERROR_FILE_NOT_FOUND, got %u\n", GetLastError());
1174
1175 SetLastError(0xdeadbeef);
1176 retval = SetupDiGetINFClassA(filename, &guid, cn, 0, &count);
1177 ok(!retval, "expected SetupDiGetINFClassA to fail!\n");
1179 "expected error ERROR_FILE_NOT_FOUND, got %u\n", GetLastError());
1180
1181 SetLastError(0xdeadbeef);
1183 ok(!retval, "expected SetupDiGetINFClassA to fail!\n");
1185 "expected error ERROR_FILE_NOT_FOUND, got %u\n", GetLastError());
1186
1187 /* test file content */
1190 ok(h != INVALID_HANDLE_VALUE, "Failed to create file, error %#x.\n", GetLastError());
1191 CloseHandle(h);
1192
1194 ok(!retval, "expected SetupDiGetINFClassA to fail!\n");
1195
1196 for(i=0; i < ARRAY_SIZE(signatures); i++)
1197 {
1198 trace("testing signature %s\n", signatures[i]);
1201 ok(h != INVALID_HANDLE_VALUE, "Failed to create file, error %#x.\n", GetLastError());
1202 WriteFile(h, content, sizeof(content), &count, NULL);
1203 CloseHandle(h);
1204
1206 ok(!retval, "expected SetupDiGetINFClassA to fail!\n");
1207
1208 WritePrivateProfileStringA("Version", "Signature", signatures[i], filename);
1209
1211 ok(!retval, "expected SetupDiGetINFClassA to fail!\n");
1212
1213 WritePrivateProfileStringA("Version", "Class", "WINE", filename);
1214
1215 count = 0xdeadbeef;
1217 ok(retval, "expected SetupDiGetINFClassA to succeed! error %u\n", GetLastError());
1218 ok(count == 5, "expected count==5, got %u\n", count);
1219
1220 count = 0xdeadbeef;
1221 retval = SetupDiGetINFClassA(filename, &guid, cn, 5, &count);
1222 ok(retval, "expected SetupDiGetINFClassA to succeed! error %u\n", GetLastError());
1223 ok(count == 5, "expected count==5, got %u\n", count);
1224
1225 count = 0xdeadbeef;
1226 SetLastError(0xdeadbeef);
1227 retval = SetupDiGetINFClassA(filename, &guid, cn, 4, &count);
1228 ok(!retval, "expected SetupDiGetINFClassA to fail!\n");
1230 "expected error ERROR_INSUFFICIENT_BUFFER, got %u\n", GetLastError());
1231 ok(count == 5, "expected count==5, got %u\n", count);
1232
1233 /* invalid parameter */
1234 SetLastError(0xdeadbeef);
1235 retval = SetupDiGetINFClassA(NULL, &guid, cn, MAX_PATH, &count);
1236 ok(!retval, "expected SetupDiGetINFClassA to fail!\n");
1238 "expected error ERROR_INVALID_PARAMETER, got %u\n", GetLastError());
1239
1240 SetLastError(0xdeadbeef);
1242 ok(!retval, "expected SetupDiGetINFClassA to fail!\n");
1244 "expected error ERROR_INVALID_PARAMETER, got %u\n", GetLastError());
1245
1246 SetLastError(0xdeadbeef);
1248 ok(!retval, "expected SetupDiGetINFClassA to fail!\n");
1250 "expected error ERROR_INVALID_PARAMETER, got %u\n", GetLastError());
1251
1252 SetLastError(0xdeadbeef);
1253 retval = SetupDiGetINFClassA(filename, &guid, cn, 0, &count);
1254 ok(!retval, "expected SetupDiGetINFClassA to fail!\n");
1256 "Got unexpected error %#x.\n", GetLastError());
1257
1259
1260 WritePrivateProfileStringA("Version", "Signature", signatures[i], filename);
1261 WritePrivateProfileStringA("Version", "ClassGUID", "WINE", filename);
1262
1263 SetLastError(0xdeadbeef);
1265 ok(!retval, "expected SetupDiGetINFClassA to fail!\n");
1267 "Got unexpected error %#x.\n", GetLastError());
1268
1269 /* network adapter guid */
1270 WritePrivateProfileStringA("Version", "ClassGUID",
1271 "{4d36e972-e325-11ce-bfc1-08002be10318}", filename);
1272
1273 /* this test succeeds only if the guid is known to the system */
1274 count = 0xdeadbeef;
1276 ok(retval, "expected SetupDiGetINFClassA to succeed! error %u\n", GetLastError());
1277 todo_wine
1278 ok(count == 4, "expected count==4, got %u(%s)\n", count, cn);
1279
1281 }
1282}
1283
1284static void test_devnode(void)
1285{
1286 HDEVINFO set;
1288 char buffer[50];
1289 DWORD ret;
1290
1292 ok(set != INVALID_HANDLE_VALUE, "SetupDiGetClassDevs failed: %#x\n", GetLastError());
1293 ret = SetupDiCreateDeviceInfoA(set, "Root\\LEGACY_BOGUS\\0000", &guid, NULL,
1294 NULL, 0, &device);
1295 ok(ret, "SetupDiCreateDeviceInfo failed: %#x\n", GetLastError());
1296
1297 ret = CM_Get_Device_IDA(device.DevInst, buffer, sizeof(buffer), 0);
1298 ok(!ret, "got %#x\n", ret);
1299 ok(!strcmp(buffer, "ROOT\\LEGACY_BOGUS\\0000"), "got %s\n", buffer);
1300
1302}
1303
1305{
1306 const char keypath[] = "System\\CurrentControlSet\\Control\\DeviceClasses\\"
1307 "{6a55b5a4-3f65-11db-b704-0011955c2bdb}\\"
1308 "##?#ROOT#LEGACY_BOGUS#0001#{6a55b5a4-3f65-11db-b704-0011955c2bdb}";
1309 SP_DEVICE_INTERFACE_DATA iface = { sizeof(iface) };
1310 SP_DEVINFO_DATA devinfo = { sizeof(devinfo) };
1311 HKEY parent, key, dikey;
1312 char buffer[5];
1313 HDEVINFO set;
1314 LONG sz, ret;
1315
1317 ok(set != INVALID_HANDLE_VALUE, "SetupDiGetClassDevs failed: %#x\n", GetLastError());
1318
1319 ret = SetupDiCreateDeviceInfoA(set, "ROOT\\LEGACY_BOGUS\\0001", &guid, NULL, NULL, 0, &devinfo);
1320 ok(ret, "SetupDiCreateDeviceInfo failed: %#x\n", GetLastError());
1321
1322 ret = SetupDiCreateDeviceInterfaceA(set, &devinfo, &guid, NULL, 0, &iface);
1323 ok(ret, "SetupDiCreateDeviceInterface failed: %#x\n", GetLastError());
1324
1326 ok(!ret, "failed to open device parent key: %u\n", ret);
1327
1328 ret = RegOpenKeyA(parent, "#\\Device Parameters", &key);
1329 ok(ret == ERROR_FILE_NOT_FOUND, "key shouldn't exist\n");
1330
1332 ok(dikey != INVALID_HANDLE_VALUE, "got error %u\n", GetLastError());
1333
1334 ret = RegOpenKeyA(parent, "#\\Device Parameters", &key);
1335 ok(!ret, "key should exist: %u\n", ret);
1336
1337 ret = RegSetValueA(key, NULL, REG_SZ, "test", 5);
1338 sz = sizeof(buffer);
1339 ret = RegQueryValueA(dikey, NULL, buffer, &sz);
1340 ok(!ret, "RegQueryValue failed: %u\n", ret);
1341 ok(!strcmp(buffer, "test"), "got wrong data %s\n", buffer);
1342
1343 RegCloseKey(dikey);
1345
1347 ok(ret, "got error %u\n", GetLastError());
1348
1349 ret = RegOpenKeyA(parent, "#\\Device Parameters", &key);
1350 ok(ret == ERROR_FILE_NOT_FOUND, "key shouldn't exist\n");
1351
1354 SetupDiRemoveDevice(set, &devinfo);
1356}
1357
1359{
1360 static GUID displayguid = {0x4d36e968, 0xe325, 0x11ce, {0xbf,0xc1,0x08,0x00,0x2b,0xe1,0x03,0x18}};
1361 SP_DEVINFO_DATA devinfo;
1362 DISPLAY_DEVICEA disp;
1363 HDEVINFO set;
1364 BOOL ret;
1365
1366 disp.cb = sizeof(disp);
1367 ok(EnumDisplayDevicesA(NULL, 0, &disp, 0), "EnumDisplayDevices failed: %08x\n", GetLastError());
1368
1369 SetLastError(0xdeadbeef);
1370 set = SetupDiGetClassDevsA(&displayguid, disp.DeviceID, 0, 0);
1371 ok(set != INVALID_HANDLE_VALUE, "SetupDiGetClassDevsA failed: %08x\n", GetLastError());
1372
1373 devinfo.cbSize = sizeof(devinfo);
1374 ret = SetupDiEnumDeviceInfo(set, 0, &devinfo);
1375 ok(ret, "SetupDiEnumDeviceInfo failed: %08x\n", GetLastError());
1376
1378}
1379
1381{
1382 HKEY hkey;
1383
1385 {
1386 skip("needs admin rights\n");
1387 return;
1388 }
1389 RegCloseKey(hkey);
1390
1405 test_devnode();
1407}
static const char inffile[]
char * strcat(char *DstString, const char *SrcString)
Definition: utclib.c:568
int strcmp(const char *String1, const char *String2)
Definition: utclib.c:469
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
static void * heap_alloc(size_t len)
Definition: appwiz.h:66
static BOOL heap_free(void *mem)
Definition: appwiz.h:76
#define trace
Definition: atltest.h:70
#define ok(value,...)
Definition: atltest.h:57
#define skip(...)
Definition: atltest.h:64
#define START_TEST(x)
Definition: atltest.h:75
#define ok_(x1, x2)
Definition: atltest.h:61
#define ARRAY_SIZE(A)
Definition: main.h:33
#define RegCloseKey(hKey)
Definition: registry.h:49
CONFIGRET WINAPI CM_Get_Device_IDA(_In_ DEVINST dnDevInst, _Out_writes_(BufferLen) PCHAR Buffer, _In_ ULONG BufferLen, _In_ ULONG ulFlags)
Definition: cfgmgr.c:3658
Definition: _set.h:50
#define ERROR_NOT_ENOUGH_MEMORY
Definition: dderror.h:7
#define ERROR_INSUFFICIENT_BUFFER
Definition: dderror.h:10
#define ERROR_SUCCESS
Definition: deptool.c:10
#define MAX_DEVICE_ID_LEN
Definition: devaction.c:40
static LSTATUS(WINAPI *pRegDeleteTreeW)(HKEY
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
LONG WINAPI RegCreateKeyA(HKEY hKey, LPCSTR lpSubKey, PHKEY phkResult)
Definition: reg.c:1179
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
Definition: reg.c:3362
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:2533
LONG WINAPI RegOpenKeyA(HKEY hKey, LPCSTR lpSubKey, PHKEY phkResult)
Definition: reg.c:3263
LONG WINAPI RegSetValueA(HKEY hKeyOriginal, LPCSTR lpSubKey, DWORD dwType, LPCSTR lpData, DWORD cbData)
Definition: reg.c:4983
LONG WINAPI RegOpenKeyW(HKEY hKey, LPCWSTR lpSubKey, PHKEY phkResult)
Definition: reg.c:3297
LSTATUS WINAPI RegQueryValueA(HKEY hkey, LPCSTR name, LPSTR data, LPLONG count)
Definition: reg.c:4241
LONG WINAPI RegDeleteKeyW(_In_ HKEY hKey, _In_ LPCWSTR lpSubKey)
Definition: reg.c:1239
LONG WINAPI RegDeleteValueW(HKEY hKey, LPCWSTR lpValueName)
Definition: reg.c:2361
LONG WINAPI RegEnumValueW(_In_ HKEY hKey, _In_ DWORD index, _Out_ LPWSTR value, _Inout_ PDWORD val_count, _Reserved_ PDWORD reserved, _Out_opt_ PDWORD type, _Out_opt_ LPBYTE data, _Inout_opt_ PDWORD count)
Definition: reg.c:2859
LONG WINAPI RegQueryInfoKeyW(HKEY hKey, LPWSTR lpClass, LPDWORD lpcClass, LPDWORD lpReserved, LPDWORD lpcSubKeys, LPDWORD lpcMaxSubKeyLen, LPDWORD lpcMaxClassLen, LPDWORD lpcValues, LPDWORD lpcMaxValueNameLen, LPDWORD lpcMaxValueLen, LPDWORD lpcbSecurityDescriptor, PFILETIME lpftLastWriteTime)
Definition: reg.c:3691
LONG WINAPI RegDeleteKeyA(_In_ HKEY hKey, _In_ LPCSTR lpSubKey)
Definition: reg.c:1224
content
Definition: atl_ax.c:994
static const WCHAR empty[]
Definition: main.c:47
#define CloseHandle
Definition: compat.h:739
#define GetProcessHeap()
Definition: compat.h:736
#define ERROR_CALL_NOT_IMPLEMENTED
Definition: compat.h:102
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
#define SetLastError(x)
Definition: compat.h:752
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
#define HeapAlloc
Definition: compat.h:733
#define CreateFileA(a, b, c, d, e, f, g)
Definition: compat.h:740
#define ERROR_NO_MORE_ITEMS
Definition: compat.h:105
#define MAX_PATH
Definition: compat.h:34
#define HeapFree(x, y, z)
Definition: compat.h:735
#define ERROR_INVALID_HANDLE
Definition: compat.h:98
#define FILE_ATTRIBUTE_NORMAL
Definition: compat.h:137
#define ERROR_ACCESS_DENIED
Definition: compat.h:97
static void cleanup(void)
Definition: main.c:1335
BOOL WINAPI DeleteFileA(IN LPCSTR lpFileName)
Definition: delete.c:24
BOOL WINAPI WriteFile(IN HANDLE hFile, IN LPCVOID lpBuffer, IN DWORD nNumberOfBytesToWrite OPTIONAL, OUT LPDWORD lpNumberOfBytesWritten, IN LPOVERLAPPED lpOverlapped OPTIONAL)
Definition: rw.c:24
DWORD WINAPI GetCurrentDirectoryA(IN DWORD nBufferLength, OUT LPSTR lpBuffer)
Definition: path.c:2146
DWORD WINAPI GetTempPathA(IN DWORD nBufferLength, OUT LPSTR lpBuffer)
Definition: path.c:2054
BOOL WINAPI DECLSPEC_HOTPATCH WritePrivateProfileStringA(LPCSTR section, LPCSTR entry, LPCSTR string, LPCSTR filename)
Definition: profile.c:1484
BOOL WINAPI SetupDiCreateDeviceInterfaceA(HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, const GUID *InterfaceClassGuid, PCSTR ReferenceString, DWORD CreationFlags, PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData)
Definition: devinst.c:2501
HDEVINFO WINAPI SetupDiCreateDeviceInfoListExW(const GUID *ClassGuid, HWND hwndParent, PCWSTR MachineName, PVOID Reserved)
Definition: devinst.c:1259
BOOL WINAPI SetupDiGetDeviceRegistryPropertyA(HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, DWORD Property, PDWORD PropertyRegDataType, PBYTE PropertyBuffer, DWORD PropertyBufferSize, PDWORD RequiredSize)
Definition: devinst.c:3139
BOOL WINAPI SetupDiEnumDeviceInfo(HDEVINFO devinfo, DWORD index, PSP_DEVINFO_DATA info)
Definition: devinst.c:1787
BOOL WINAPI SetupDiInstallClassA(HWND hwndParent, PCSTR InfFileName, DWORD Flags, HSPFILEQ FileQueue)
Definition: devinst.c:3470
HKEY WINAPI SetupDiCreateDevRegKeyW(HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, DWORD Scope, DWORD HwProfile, DWORD KeyType, HINF InfHandle, PCWSTR InfSectionName)
Definition: devinst.c:1396
BOOL WINAPI SetupDiCreateDeviceInfoA(HDEVINFO DeviceInfoSet, PCSTR DeviceName, CONST GUID *ClassGuid, PCSTR DeviceDescription, HWND hwndParent, DWORD CreationFlags, PSP_DEVINFO_DATA DeviceInfoData)
Definition: devinst.c:1528
BOOL WINAPI SetupDiRegisterDeviceInfo(HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, DWORD Flags, PSP_DETSIG_CMPPROC CompareProc, PVOID CompareContext, PSP_DEVINFO_DATA DupDeviceInfoData)
Definition: devinst.c:1711
BOOL WINAPI SetupDiDeleteDeviceInterfaceRegKey(HDEVINFO DeviceInfoSet, PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData, DWORD Reserved)
Definition: devinst.c:2728
BOOL WINAPI SetupDiEnumDeviceInterfaces(HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, CONST GUID *InterfaceClassGuid, DWORD MemberIndex, PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData)
Definition: devinst.c:2780
BOOL WINAPI SetupDiSetDeviceRegistryPropertyA(HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, DWORD Property, const BYTE *PropertyBuffer, DWORD PropertyBufferSize)
Definition: devinst.c:3434
BOOL WINAPI SetupDiGetDeviceRegistryPropertyW(HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, DWORD Property, PDWORD PropertyRegDataType, PBYTE PropertyBuffer, DWORD PropertyBufferSize, PDWORD RequiredSize)
Definition: devinst.c:3224
HKEY WINAPI SetupDiCreateDeviceInterfaceRegKeyA(HDEVINFO DeviceInfoSet, PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData, DWORD Reserved, REGSAM samDesired, HINF InfHandle, PCSTR InfSectionName)
Definition: devinst.c:2579
BOOL WINAPI SetupDiDeleteDeviceInfo(IN HDEVINFO DeviceInfoSet, IN PSP_DEVINFO_DATA DeviceInfoData)
Definition: devinst.c:4712
HKEY WINAPI SetupDiOpenDevRegKey(HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, DWORD Scope, DWORD HwProfile, DWORD KeyType, REGSAM samDesired)
Definition: devinst.c:5934
BOOL WINAPI SetupDiSetDeviceRegistryPropertyW(HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, DWORD Property, const BYTE *PropertyBuffer, DWORD PropertyBufferSize)
Definition: devinst.c:3452
BOOL WINAPI SetupDiGetDeviceInterfaceDetailA(HDEVINFO DeviceInfoSet, PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData, PSP_DEVICE_INTERFACE_DETAIL_DATA_A DeviceInterfaceDetailData, DWORD DeviceInterfaceDetailDataSize, PDWORD RequiredSize, PSP_DEVINFO_DATA DeviceInfoData)
Definition: devinst.c:2917
BOOL WINAPI SetupDiGetDeviceInterfaceDetailW(HDEVINFO DeviceInfoSet, PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData, PSP_DEVICE_INTERFACE_DETAIL_DATA_W DeviceInterfaceDetailData, DWORD DeviceInterfaceDetailDataSize, PDWORD RequiredSize, PSP_DEVINFO_DATA DeviceInfoData)
Definition: devinst.c:3011
HDEVINFO WINAPI SetupDiGetClassDevsA(CONST GUID *class, LPCSTR enumstr, HWND parent, DWORD flags)
Definition: devinst.c:2236
HKEY WINAPI SetupDiOpenClassRegKey(const GUID *ClassGuid, REGSAM samDesired)
Definition: devinst.c:3618
BOOL WINAPI SetupDiDestroyDeviceInfoList(HDEVINFO devinfo)
Definition: devinst.c:2893
BOOL WINAPI SetupDiGetDeviceInstanceIdA(HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, PSTR DeviceInstanceId, DWORD DeviceInstanceIdSize, PDWORD RequiredSize)
Definition: devinst.c:1838
HKEY WINAPI SetupDiOpenClassRegKeyExA(const GUID *ClassGuid, REGSAM samDesired, DWORD Flags, PCSTR MachineName, PVOID Reserved)
Definition: devinst.c:3630
HDEVINFO WINAPI SetupDiCreateDeviceInfoList(const GUID *ClassGuid, HWND hwndParent)
Definition: devinst.c:1205
BOOL WINAPI SetupDiDeleteDeviceInterfaceData(HDEVINFO DeviceInfoSet, PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData)
Definition: interface.c:636
BOOL WINAPI SetupDiGetINFClassA(IN PCSTR InfName, OUT LPGUID ClassGuid, OUT PSTR ClassName, IN DWORD ClassNameSize, OUT PDWORD RequiredSize OPTIONAL)
Definition: parser.c:2347
BOOL WINAPI SetupDiRemoveDeviceInterface(HDEVINFO info, PSP_DEVICE_INTERFACE_DATA data)
Definition: stubs.c:109
BOOL WINAPI SetupDiRemoveDevice(IN HDEVINFO DeviceInfoSet, IN PSP_DEVINFO_DATA DeviceInfoData)
Definition: stubs.c:82
r parent
Definition: btrfs.c:3010
#define strcasecmp
Definition: fake.h:9
UINT WINAPI GetTempFileNameA(IN LPCSTR lpPathName, IN LPCSTR lpPrefixString, IN UINT uUnique, OUT LPSTR lpTempFileName)
Definition: filename.c:26
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
FxAutoRegKey hKey
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
GLsizeiptr size
Definition: glext.h:5919
GLuint res
Definition: glext.h:9613
GLuint buffer
Definition: glext.h:5915
GLuint index
Definition: glext.h:6031
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
GLbitfield flags
Definition: glext.h:7161
GLuint id
Definition: glext.h:5910
GLfloat GLfloat GLfloat GLfloat h
Definition: glext.h:7723
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
_Check_return_ _CRTIMP FILE *__cdecl tmpfile(void)
Definition: file.c:3914
const char * filename
Definition: ioapi.h:137
#define wine_dbgstr_w
Definition: kernel32.h:34
#define GUID_NULL
Definition: ks.h:106
#define REG_SZ
Definition: layer.c:22
LPSTR WINAPI lstrcpyA(LPSTR lpString1, LPCSTR lpString2)
Definition: lstring.c:100
int WINAPI lstrcmpW(LPCWSTR lpString1, LPCWSTR lpString2)
Definition: lstring.c:170
const GUID * guid
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
#define CREATE_ALWAYS
Definition: disk.h:72
#define ERROR_FILE_NOT_FOUND
Definition: disk.h:79
PSDBQUERYRESULT_VISTA PVOID DWORD * dwSize
Definition: env.c:56
static PVOID ptr
Definition: dispmode.c:27
static void create_inf_file(void)
Definition: advpack.c:202
static BYTE cn[]
Definition: cert.c:2938
static const WCHAR friendly_name[]
Definition: devenum.c:40
static const char machine[]
Definition: profile.c:104
#define todo_wine
Definition: custom.c:79
static GUID guid2
Definition: devinst.c:42
static void test_install_class(void)
Definition: devinst.c:206
static void test_device_info(void)
Definition: devinst.c:274
#define check_device_iface(a, b, c, d, e, f)
Definition: devinst.c:579
static void test_device_iface_detail(void)
Definition: devinst.c:688
static void test_device_iface(void)
Definition: devinst.c:581
static void test_create_device_list_ex(void)
Definition: devinst.c:110
static void test_device_key(void)
Definition: devinst.c:770
static void testSetupDiGetClassDevsA(void)
Definition: devinst.c:1358
static void check_device_iface_(int line, HDEVINFO set, SP_DEVINFO_DATA *device, const GUID *class, int index, DWORD flags, const char *path)
Definition: devinst.c:550
#define check_device_info(a, b, c, d)
Definition: devinst.c:272
static void test_registry_property_a(void)
Definition: devinst.c:933
static void test_open_class_key(void)
Definition: devinst.c:144
static void get_temp_filename(LPSTR path)
Definition: devinst.c:192
static void test_get_device_instance_id(void)
Definition: devinst.c:415
static void test_get_inf_class(void)
Definition: devinst.c:1137
static LSTATUS devinst_RegDeleteTreeW(HKEY hKey, LPCWSTR lpszSubKey)
Definition: devinst.c:44
static void test_devnode(void)
Definition: devinst.c:1284
static void check_device_info_(int line, HDEVINFO set, int index, const GUID *class, const char *expect_id)
Definition: devinst.c:248
static void test_device_interface_key(void)
Definition: devinst.c:1304
static void test_register_device_info(void)
Definition: devinst.c:479
static void test_register_device_iface(void)
Definition: devinst.c:880
static void test_registry_property_w(void)
Definition: devinst.c:1033
#define KEY_ALL_ACCESS
Definition: nt_native.h:1041
#define KEY_READ
Definition: nt_native.h:1023
#define GENERIC_WRITE
Definition: nt_native.h:90
long LONG
Definition: pedump.c:60
#define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8)
Definition: guiddef.h:68
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
static calc_node_t temp
Definition: rpn_ieee.c:38
_Check_return_ _CRTIMP _CONST_RETURN char *__cdecl strrchr(_In_z_ const char *_Str, _In_ int _Ch)
static __inline const char * wine_dbgstr_guid(const GUID *id)
Definition: debug.h:197
#define memset(x, y, z)
Definition: compat.h:39
#define ERROR_INVALID_DEVINST_NAME
Definition: setupapi.h:301
#define ERROR_INVALID_MACHINENAME
Definition: setupapi.h:328
#define ERROR_DEVINST_ALREADY_EXISTS
Definition: setupapi.h:303
#define ERROR_INVALID_CLASS
Definition: setupapi.h:302
#define DI_NOVCP
Definition: setupapi.h:49
#define ERROR_INVALID_REG_PROPERTY
Definition: setupapi.h:305
struct _SP_DEVICE_INTERFACE_DETAIL_DATA_A SP_DEVICE_INTERFACE_DETAIL_DATA_A
#define ERROR_NO_SUCH_DEVINST
Definition: setupapi.h:307
#define ERROR_MACHINE_UNAVAILABLE
Definition: setupapi.h:330
#define DIGCF_DEVICEINTERFACE
Definition: setupapi.h:174
#define DIREG_DRV
Definition: setupapi.h:182
#define SPINT_REMOVED
Definition: setupapi.h:584
#define DIGCF_ALLCLASSES
Definition: setupapi.h:172
#define ERROR_CLASS_MISMATCH
Definition: setupapi.h:297
#define DICD_GENERATE_ID
Definition: setupapi.h:110
#define DIOCR_INSTALLER
Definition: setupapi.h:176
#define ERROR_DEVINFO_NOT_REGISTERED
Definition: setupapi.h:304
struct _SP_DEVINFO_DATA SP_DEVINFO_DATA
#define DICS_FLAG_GLOBAL
Definition: setupapi.h:113
#define ERROR_KEY_DOES_NOT_EXIST
Definition: setupapi.h:300
#define SPDRP_HARDWAREID
Definition: setupapi.h:508
#define SPDRP_FRIENDLYNAME
Definition: setupapi.h:519
#define DIREG_BOTH
Definition: setupapi.h:183
CHAR DeviceID[128]
Definition: wingdi.h:2813
CHAR DevicePath[ANYSIZE_ARRAY]
Definition: setupapi.h:851
Definition: devices.h:37
Definition: copy.c:22
Definition: parser.c:49
#define max(a, b)
Definition: svc.c:63
#define FIELD_OFFSET(t, f)
Definition: typedefs.h:255
int ret
BOOL WINAPI EnumDisplayDevicesA(LPCSTR lpDevice, DWORD iDevNum, PDISPLAY_DEVICEA lpDisplayDevice, DWORD dwFlags)
Definition: display.c:23
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
#define ERROR_INVALID_USER_BUFFER
Definition: winerror.h:1091
#define RPC_S_INVALID_STRING_UUID
Definition: winerror.h:1016
#define ERROR_INVALID_FLAGS
Definition: winerror.h:583
#define ERROR_INVALID_DATA
Definition: winerror.h:116
#define HKEY_LOCAL_MACHINE
Definition: winreg.h:12
const char * LPCSTR
Definition: xmlstorage.h:183
char * LPSTR
Definition: xmlstorage.h:182
__wchar_t WCHAR
Definition: xmlstorage.h:180
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
char CHAR
Definition: xmlstorage.h:175
unsigned char BYTE
Definition: xxhash.c:193