2 * SetupAPI device class-related functions tests
4 * Copyright 2006 Hervé Poussineau
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public Licence as
8 * published by the Free Software Foundation; either version 2 of
9 * the License, or (at your option) any later version.
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 * General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this library; if not, write to the Free Software Foundation,
18 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
33 #include "wine/test.h"
35 #define ok_lasterr(err) \
36 ok( GetLastError() == (err), \
37 "Expected error %lx, got %lx\n", (DWORD)(err), GetLastError() )
39 static GUID test_class_guid
= { 0x4d36e967, 0xe325, 0x11ce, { 0xbf, 0xc1, 0x08, 0x00, 0x2b, 0xe1, 0x03, 0x18 } };
40 static char test_class_name
[MAX_CLASS_NAME_LEN
] = "DiskDrive";
42 static const char *debugstr_guid(const GUID
*guid
)
44 static char guidSTR1
[39];
45 static char guidSTR2
[39];
49 if (!guid
) return NULL
;
52 guidSTR
= index
? guidSTR1
: guidSTR2
;
54 snprintf(guidSTR
, sizeof(guidSTR1
),
55 "{%08lx-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}",
56 guid
->Data1
, guid
->Data2
, guid
->Data3
,
57 guid
->Data4
[0], guid
->Data4
[1], guid
->Data4
[2], guid
->Data4
[3],
58 guid
->Data4
[4], guid
->Data4
[5], guid
->Data4
[6], guid
->Data4
[7]);
62 static void test_SetupDiBuildClassInfoList(void)
64 LPGUID guid_list
= NULL
;
65 DWORD required_size
, size
;
67 SetLastError( 0xdeadbeef );
68 ok( !SetupDiBuildClassInfoList( 0, NULL
, 0, NULL
),
70 ok_lasterr( ERROR_INVALID_PARAMETER
);
72 SetLastError( 0xdeadbeef );
73 ok( !SetupDiBuildClassInfoList( 0, NULL
, 0, &required_size
),
75 ok_lasterr( ERROR_INSUFFICIENT_BUFFER
);
77 guid_list
= HeapAlloc( GetProcessHeap(), 0, ( required_size
+ 1 ) * sizeof( GUID
) );
81 SetLastError( 0xdeadbeef );
82 ok( SetupDiBuildClassInfoList( 0, guid_list
, required_size
, &size
),
83 "Error reported %lx\n", GetLastError() );
84 ok( size
== required_size
, "Expected size %lu, got %lu\n", required_size
, size
);
85 SetLastError( 0xdeadbeef );
86 ok( SetupDiBuildClassInfoList( 0, guid_list
, required_size
+ 1, &size
),
87 "Error reported %lx\n", GetLastError() );
88 ok( size
== required_size
, "Expected size %lu, got %lu\n", required_size
, size
);
92 /* That's better to use the first class found, as we know for sure that it exists */
93 memcpy(&test_class_guid
, &guid_list
[0], sizeof( GUID
) );
94 ok( SetupDiClassNameFromGuidA( &test_class_guid
, test_class_name
, sizeof( test_class_name
), NULL
),
95 "Error reported %lx\n", GetLastError() );
97 HeapFree( GetProcessHeap(), 0, guid_list
);
100 static void test_SetupDiClassGuidsFromNameA(void)
102 LPGUID guid_list
= NULL
;
103 DWORD required_size
, size
;
105 SetLastError( 0xdeadbeef );
106 ok( !SetupDiClassGuidsFromNameA( NULL
, NULL
, 0, NULL
),
108 ok_lasterr( ERROR_INVALID_PARAMETER
);
110 SetLastError( 0xdeadbeef );
111 ok( !SetupDiClassGuidsFromNameA( NULL
, NULL
, 0, &required_size
),
113 ok_lasterr( ERROR_INVALID_PARAMETER
);
115 SetLastError( 0xdeadbeef );
116 ok( SetupDiClassGuidsFromNameA( "", NULL
, 0, &required_size
),
117 "Error reported %lx\n", GetLastError() );
118 ok( required_size
== 0, "Expected 0, got %lu\n", required_size
);
120 SetLastError( 0xdeadbeef );
121 ok( !SetupDiClassGuidsFromNameA( test_class_name
, NULL
, 0, &required_size
),
123 ok_lasterr( ERROR_INSUFFICIENT_BUFFER
);
124 ok( required_size
> 0, "Expected > 0, got %lu\n", required_size
);
126 guid_list
= HeapAlloc( GetProcessHeap(), 0, ( required_size
+ 1 ) * sizeof( GUID
) );
130 SetLastError( 0xdeadbeef );
131 ok( SetupDiClassGuidsFromNameA( test_class_name
, guid_list
, required_size
, &size
),
132 "Error reported %lx\n", GetLastError() );
133 ok( size
== required_size
, "Expected size %lu, got %lu\n", required_size
, size
);
134 ok( IsEqualIID( &guid_list
[0], &test_class_guid
),
135 "Expected %s, got %s for class %s\n", debugstr_guid( &test_class_guid
), debugstr_guid( &guid_list
[0] ), test_class_name
);
136 SetLastError( 0xdeadbeef );
137 ok( SetupDiClassGuidsFromNameA( test_class_name
, guid_list
, required_size
+ 1, &size
),
138 "Error reported %lx\n", GetLastError() );
139 ok( size
== required_size
, "Expected size %lu, got %lu\n", required_size
, size
);
140 ok( IsEqualIID( &guid_list
[0], &test_class_guid
),
141 "Expected %s, got %s for class %s\n", debugstr_guid( &test_class_guid
), debugstr_guid( &guid_list
[0] ), test_class_name
);
143 HeapFree( GetProcessHeap(), 0, guid_list
);
146 static void test_SetupDiClassNameFromGuidA(void)
148 CHAR
* class_name
= NULL
;
149 DWORD required_size
, size
;
151 SetLastError( 0xdeadbeef );
152 ok( !SetupDiClassNameFromGuidA( NULL
, NULL
, 0, NULL
),
154 ok_lasterr( ERROR_INVALID_CLASS
);
156 SetLastError( 0xdeadbeef );
157 ok( !SetupDiClassNameFromGuidA( NULL
, NULL
, 0, &required_size
),
159 ok_lasterr( ERROR_INVALID_CLASS
);
161 SetLastError( 0xdeadbeef );
162 ok( !SetupDiClassNameFromGuidA( &test_class_guid
, NULL
, 0, &required_size
),
164 ok_lasterr( ERROR_INSUFFICIENT_BUFFER
);
165 ok( required_size
> 0, "Expected > 0, got %lu\n", required_size
);
166 ok( required_size
< MAX_CLASS_NAME_LEN
, "Expected < %u, got %lu for GUID %s\n", MAX_CLASS_NAME_LEN
, required_size
, debugstr_guid( &test_class_guid
) );
168 class_name
= HeapAlloc( GetProcessHeap(), 0, required_size
);
172 SetLastError( 0xdeadbeef );
173 ok( SetupDiClassNameFromGuidA( &test_class_guid
, class_name
, required_size
, &size
),
174 "Error reported %lx\n", GetLastError() );
175 ok( size
== required_size
, "Expected size %lu, got %lu\n", required_size
, size
);
176 ok( !strcmp( class_name
, test_class_name
),
177 "Expected %s, got %s\n", test_class_name
, class_name
);
178 SetLastError( 0xdeadbeef );
179 ok( SetupDiClassNameFromGuidA( &test_class_guid
, class_name
, required_size
+ 1, &size
),
180 "Error reported %lx\n", GetLastError() );
181 ok( size
== required_size
, "Expected size %lu, got %lu\n", required_size
, size
);
182 ok( !strcmp( class_name
, test_class_name
),
183 "Expected %s, got %s\n", test_class_name
, class_name
);
185 HeapFree( GetProcessHeap(), 0, class_name
);
188 static void test_SetupDiGetClassDescriptionA(void)
190 CHAR
* class_desc
= NULL
;
191 DWORD required_size
, size
;
193 SetLastError( 0xdeadbeef );
194 ok( !SetupDiGetClassDescriptionA( NULL
, NULL
, 0, NULL
),
196 ok_lasterr( ERROR_INVALID_PARAMETER
);
198 SetLastError( 0xdeadbeef );
199 ok( !SetupDiGetClassDescriptionA( NULL
, NULL
, 0, &required_size
),
201 ok_lasterr( ERROR_INVALID_PARAMETER
);
203 SetLastError( 0xdeadbeef );
204 ok( !SetupDiGetClassDescriptionA( &test_class_guid
, NULL
, 0, &required_size
),
206 ok_lasterr( ERROR_INSUFFICIENT_BUFFER
);
207 ok( required_size
> 0, "Expected > 0, got %lu\n", required_size
);
208 ok( required_size
< LINE_LEN
, "Expected < %u, got %lu\n", LINE_LEN
, required_size
);
210 class_desc
= HeapAlloc( GetProcessHeap(), 0, required_size
);
214 SetLastError( 0xdeadbeef );
215 ok( SetupDiGetClassDescriptionA( &test_class_guid
, class_desc
, required_size
, &size
),
216 "Error reported %lx\n", GetLastError() );
217 ok( size
== required_size
, "Expected size %lu, got %lu\n", required_size
, size
);
218 SetLastError( 0xdeadbeef );
219 ok( SetupDiGetClassDescriptionA( &test_class_guid
, class_desc
, required_size
+ 1, &size
),
220 "Error reported %lx\n", GetLastError() );
221 ok( size
== required_size
, "Expected size %lu, got %lu\n", required_size
, size
);
223 HeapFree( GetProcessHeap(), 0, class_desc
);
226 static void test_SetupDiGetClassDevsA(void)
228 HDEVINFO device_info
;
230 SetLastError( 0xdeadbeef );
231 device_info
= SetupDiGetClassDevs( NULL
, NULL
, NULL
, 0 );
232 ok( device_info
== INVALID_HANDLE_VALUE
,
234 ok_lasterr( ERROR_INVALID_PARAMETER
);
236 SetLastError( 0xdeadbeef );
237 device_info
= SetupDiGetClassDevs( NULL
, NULL
, NULL
, DIGCF_ALLCLASSES
);
238 ok( device_info
!= INVALID_HANDLE_VALUE
,
239 "Error reported %lx\n", GetLastError() );
240 SetLastError( 0xdeadbeef );
241 ok( SetupDiDestroyDeviceInfoList( device_info
),
242 "Error reported %lx\n", GetLastError() );
244 SetLastError( 0xdeadbeef );
245 device_info
= SetupDiGetClassDevs( NULL
, NULL
, NULL
, DIGCF_DEVICEINTERFACE
);
246 ok( device_info
== INVALID_HANDLE_VALUE
,
248 ok_lasterr( ERROR_INVALID_PARAMETER
);
250 SetLastError( 0xdeadbeef );
251 device_info
= SetupDiGetClassDevs( &test_class_guid
, NULL
, NULL
, 0 );
252 ok( device_info
!= INVALID_HANDLE_VALUE
,
253 "Error reported %lx\n", GetLastError() );
254 SetLastError( 0xdeadbeef );
255 ok( SetupDiDestroyDeviceInfoList( device_info
),
256 "Error reported %lx\n", GetLastError() );
258 SetLastError( 0xdeadbeef );
259 device_info
= SetupDiGetClassDevs( NULL
, "(invalid enumerator)", NULL
, DIGCF_ALLCLASSES
);
260 ok( device_info
== INVALID_HANDLE_VALUE
,
262 ok_lasterr( ERROR_INVALID_DATA
);
264 SetLastError( 0xdeadbeef );
265 device_info
= SetupDiGetClassDevs( NULL
, "Root", NULL
, DIGCF_ALLCLASSES
);
266 ok( device_info
!= INVALID_HANDLE_VALUE
,
267 "Error reported %lx\n", GetLastError() );
268 SetLastError( 0xdeadbeef );
269 ok( SetupDiDestroyDeviceInfoList( device_info
),
270 "Error reported %lx\n", GetLastError() );
273 static void test_SetupDiGetClassDevsExW(void)
275 const GUID not_existing_guid
= { 0xdeadbeef, 0xdead, 0xbeef, { 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff } };
278 SP_DEVINFO_DATA info
;
280 dev_info
= SetupDiGetClassDevsExW(¬_existing_guid
, NULL
, NULL
, DIGCF_PRESENT
| DIGCF_DEVICEINTERFACE
, NULL
, NULL
, NULL
);
281 ok(dev_info
!= INVALID_HANDLE_VALUE
, "Expected success\n");
283 ZeroMemory(&info
, sizeof(info
));
284 info
.cbSize
= sizeof(info
);
285 ret
= SetupDiEnumDeviceInfo(dev_info
, 0, &info
);
286 ok (!ret
, "Expected failure.\n");
287 ok_lasterr(ERROR_NO_MORE_ITEMS
);
289 SetupDiDestroyDeviceInfoList(dev_info
);
292 static void test_SetupDiOpenClassRegKeyExA(void)
297 SetLastError( 0xdeadbeef );
298 hkey
= SetupDiOpenClassRegKeyExA( NULL
, 0, 0, NULL
, NULL
);
299 ok( hkey
== INVALID_HANDLE_VALUE
,
301 ok_lasterr( ERROR_INVALID_FLAGS
);
303 SetLastError( 0xdeadbeef );
304 hkey
= SetupDiOpenClassRegKeyExA( NULL
, 0, DIOCR_INSTALLER
| DIOCR_INTERFACE
, NULL
, NULL
);
305 ok( hkey
== INVALID_HANDLE_VALUE
,
307 ok_lasterr( ERROR_INVALID_FLAGS
);
309 SetLastError( 0xdeadbeef );
310 hkey
= SetupDiOpenClassRegKeyExA( NULL
, 0, DIOCR_INSTALLER
, NULL
, NULL
);
311 ok( hkey
== INVALID_HANDLE_VALUE
,
313 ok_lasterr( ERROR_INVALID_CLASS
);
315 SetLastError( 0xdeadbeef );
316 hkey
= SetupDiOpenClassRegKeyExA( NULL
, 0, DIOCR_INTERFACE
, NULL
, NULL
);
317 ok( hkey
== INVALID_HANDLE_VALUE
,
319 ok_lasterr( ERROR_INVALID_CLASS
);
321 SetLastError( 0xdeadbeef );
322 hkey
= SetupDiOpenClassRegKeyExA( NULL
, KEY_QUERY_VALUE
, DIOCR_INSTALLER
, NULL
, NULL
);
323 ok( hkey
!= INVALID_HANDLE_VALUE
, "Got error %lx\n", GetLastError() );
324 err
= RegCloseKey( hkey
);
325 ok( err
== ERROR_SUCCESS
, "Got error %lx\n", err
);
327 SetLastError( 0xdeadbeef );
328 hkey
= SetupDiOpenClassRegKeyExA( NULL
, KEY_QUERY_VALUE
, DIOCR_INTERFACE
, NULL
, NULL
);
329 ok( hkey
!= INVALID_HANDLE_VALUE
, "Got error %lx\n", GetLastError() );
330 err
= RegCloseKey( hkey
);
331 ok( err
== ERROR_SUCCESS
, "Got error %lx\n", err
);
333 SetLastError( 0xdeadbeef );
334 hkey
= SetupDiOpenClassRegKeyExA( &test_class_guid
, KEY_QUERY_VALUE
, DIOCR_INSTALLER
, NULL
, NULL
);
335 ok( hkey
!= INVALID_HANDLE_VALUE
, "Got error %lx\n", GetLastError() );
336 err
= RegCloseKey( hkey
);
337 ok( err
== ERROR_SUCCESS
, "Got error %lx\n", err
);
339 err
= RegOpenKeyExA(HKEY_LOCAL_MACHINE
, "System\\CurrentControlSet\\Control\\Class", 0, KEY_SET_VALUE
, &hkey
);
340 ok( err
== ERROR_SUCCESS
, "Got error %lx\n", err
);
345 test_SetupDiBuildClassInfoList();
346 test_SetupDiClassGuidsFromNameA();
347 test_SetupDiClassNameFromGuidA();
348 test_SetupDiGetClassDescriptionA();
349 test_SetupDiGetClassDevsA();
350 test_SetupDiOpenClassRegKeyExA();
351 test_SetupDiGetClassDevsExW();