1 /*
2 * Unit tests for setupapi.dll query functions
3 *
4 * Copyright (C) 2006 James Hawkins
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 <stdio.h>
22 #include <windows.h>
23 #include <setupapi.h>
24 #include "wine/test.h"
25
26 static CHAR CURR_DIR[MAX_PATH];
27 static CHAR WIN_DIR[MAX_PATH];
28
get_directories(void)29 static void get_directories(void)
30 {
31 int len;
32
33 GetCurrentDirectoryA(MAX_PATH, CURR_DIR);
34 len = lstrlenA(CURR_DIR);
35
36 if(len && (CURR_DIR[len-1] == '\\'))
37 CURR_DIR[len-1] = 0;
38
39 GetWindowsDirectoryA(WIN_DIR, MAX_PATH);
40 len = lstrlenA(WIN_DIR);
41
42 if (len && (WIN_DIR[len-1] == '\\'))
43 WIN_DIR[len-1] = 0;
44 }
45
46 static const char inf_data1[] =
47 "[Version]\n"
48 "Signature=\"$Chicago$\"\n"
49 "AdvancedINF=2.5\n"
50 "[SourceDisksNames]\n"
51 "2 = %SrcDiskName%, LANCOM\\LANtools\\lanconf.cab\n"
52 "[SourceDisksFiles]\n"
53 "lanconf.exe = 2\n"
54 "[DestinationDirs]\n"
55 "DefaultDestDir = 24, %DefaultDest%\n"
56 "[Strings]\n"
57 "LangDir = english\n"
58 "DefaultDest = LANCOM\n"
59 "SrcDiskName = \"LANCOM Software CD\"\n";
60
61 static const char inf_data2[] =
62 "[SourceFileInfo]\n"
63 "sp1qfe\\bitsinst.exe=250B3702C7CCD7C2F9E4DAA1555C933E,000600060A28062C,27136,SP1QFE\n"
64 "sp1qfe\\bitsprx2.dll=4EBEA67F4BB4EB402E725CA7CA2857AE,000600060A280621,7680,SP1QFE\n"
65 "sp1qfe\\bitsprx3.dll=C788A1D9330DA011EF25E95D3BC7BDE5,000600060A280621,7168,SP1QFE\n"
66 "sp1qfe\\qmgr.dll=696AC82FB290A03F205901442E0E9589,000600060A280621,361984,SP1QFE\n"
67 "sp1qfe\\qmgrprxy.dll=8B5848144829E1BC985EA4C3D8CA7E3F,000600060A280621,17408,SP1QFE\n"
68 "sp1qfe\\winhttp.dll=3EC6F518114606CA59D4160322077437,000500010A280615,331776,SP1QFE\n"
69 "sp1qfe\\xpob2res.dll=DB83156B9F496F20D1EA70E4ABEC0166,000500010A280622,158720,SP1QFE\n";
70
71 static const char inf_data3[] =
72 "[Version]\n"
73 "Signature = \"$Windows NT$\"\n"
74 "[DestinationDirs]\n"
75 "CopyAlways.Windir.files = 10\n"
76 "[CopyAlways.Windir.Files]\n"
77 "WindowsCodecs.dll\n";
78
79 static const char inf_data4[] =
80 "[Version]\n"
81 "Signature = \"$Windows NT$\"\n"
82 "[CopyAlways.System32.Files]\n"
83 "WindowsCodecs.dll\n";
84
85 static const char inf_data5[] =
86 "[Version]\n"
87 "Signature = \"$Windows NT$\"\n"
88 "[DestinationDirs]\n"
89 "DefaultDestDir = 11\n"
90 "CopyAlways.Windir.files = 10\n"
91 "[CopyAlways.Windir.Files]\n"
92 "WindowsCodecs.dll\n";
93
94 static const char inf_data6[] =
95 "[Version]\n"
96 "Signature = \"$Windows NT$\"\n"
97 "[DestinationDirs]\n"
98 "DefaultDestDir = 10\n"
99 "[CopyAlways.Windir.Files]\n"
100 "WindowsCodecs.dll\n";
101
create_inf_file(LPSTR filename,const char * data,DWORD size)102 static BOOL create_inf_file(LPSTR filename, const char *data, DWORD size)
103 {
104 BOOL ret;
105 DWORD dwNumberOfBytesWritten;
106 HANDLE hf = CreateFileA(filename, GENERIC_WRITE, 0, NULL,
107 CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
108 if (hf == INVALID_HANDLE_VALUE) return FALSE;
109 ret = WriteFile(hf, data, size, &dwNumberOfBytesWritten, NULL);
110 CloseHandle(hf);
111 return ret;
112 }
113
check_info_filename(PSP_INF_INFORMATION info,LPSTR test)114 static BOOL check_info_filename(PSP_INF_INFORMATION info, LPSTR test)
115 {
116 LPSTR filename;
117 DWORD size;
118 BOOL ret = FALSE;
119
120 if (!SetupQueryInfFileInformationA(info, 0, NULL, 0, &size))
121 return FALSE;
122
123 filename = HeapAlloc(GetProcessHeap(), 0, size);
124 if (!filename)
125 return FALSE;
126
127 SetupQueryInfFileInformationA(info, 0, filename, size, &size);
128
129 if (!lstrcmpiA(test, filename))
130 ret = TRUE;
131
132 HeapFree(GetProcessHeap(), 0, filename);
133 return ret;
134 }
135
alloc_inf_info(LPCSTR filename,DWORD search,PDWORD size)136 static PSP_INF_INFORMATION alloc_inf_info(LPCSTR filename, DWORD search, PDWORD size)
137 {
138 PSP_INF_INFORMATION info;
139 BOOL ret;
140
141 ret = SetupGetInfInformationA(filename, search, NULL, 0, size);
142 if (!ret)
143 return NULL;
144
145 info = HeapAlloc(GetProcessHeap(), 0, *size);
146 return info;
147 }
148
test_SetupGetInfInformation(void)149 static void test_SetupGetInfInformation(void)
150 {
151 PSP_INF_INFORMATION info;
152 CHAR inf_filename[MAX_PATH];
153 CHAR inf_one[MAX_PATH], inf_two[MAX_PATH];
154 LPSTR revfile;
155 DWORD size;
156 HINF hinf;
157 BOOL ret;
158
159 lstrcpyA(inf_filename, CURR_DIR);
160 lstrcatA(inf_filename, "\\");
161 lstrcatA(inf_filename, "test.inf");
162
163 /* try an invalid inf handle */
164 size = 0xdeadbeef;
165 SetLastError(0xbeefcafe);
166 ret = SetupGetInfInformationA(NULL, INFINFO_INF_SPEC_IS_HINF, NULL, 0, &size);
167 ok(ret == FALSE, "Expected SetupGetInfInformation to fail\n");
168 ok(GetLastError() == ERROR_INVALID_HANDLE ||
169 broken(GetLastError() == ERROR_BAD_PATHNAME) || /* win95 */
170 broken(GetLastError() == ERROR_FILE_NOT_FOUND) || /* win98 */
171 broken(GetLastError() == ERROR_PATH_NOT_FOUND) || /* NT4 */
172 broken(GetLastError() == ERROR_INVALID_NAME) || /* win2k */
173 broken(GetLastError() == ERROR_GENERAL_SYNTAX), /* another win2k / winMe */
174 "Expected ERROR_INVALID_HANDLE, got %d\n", GetLastError());
175 ok(size == 0xdeadbeef, "Expected size to remain unchanged\n");
176
177 /* try an invalid inf filename */
178 /* do not use NULL as absolute inf filename on win9x/winMe (crash) */
179 if ((GetLastError() != ERROR_BAD_PATHNAME) && /* win95 */
180 (GetLastError() != ERROR_FILE_NOT_FOUND) && /* win98 */
181 (GetLastError() != ERROR_GENERAL_SYNTAX)) /* winMe */
182 {
183 size = 0xdeadbeef;
184 SetLastError(0xbeefcafe);
185 ret = SetupGetInfInformationA(NULL, INFINFO_INF_NAME_IS_ABSOLUTE, NULL, 0, &size);
186 ok(ret == FALSE, "Expected SetupGetInfInformation to fail\n");
187 ok(GetLastError() == ERROR_INVALID_PARAMETER,
188 "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
189 ok(size == 0xdeadbeef, "Expected size to remain unchanged\n");
190 }
191
192 create_inf_file(inf_filename, inf_data1, sizeof(inf_data1) - 1);
193
194 /* try an invalid search flag */
195 size = 0xdeadbeef;
196 SetLastError(0xbeefcafe);
197 ret = SetupGetInfInformationA(inf_filename, -1, NULL, 0, &size);
198 ok(ret == FALSE, "Expected SetupGetInfInformation to fail\n");
199 ok(GetLastError() == ERROR_INVALID_PARAMETER,
200 "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
201 ok(size == 0xdeadbeef, "Expected size to remain unchanged\n");
202
203 /* try a nonexistent inf file */
204 size = 0xdeadbeef;
205 SetLastError(0xbeefcafe);
206 ret = SetupGetInfInformationA("idontexist", INFINFO_INF_NAME_IS_ABSOLUTE, NULL, 0, &size);
207 ok(ret == FALSE, "Expected SetupGetInfInformation to fail\n");
208 ok(GetLastError() == ERROR_FILE_NOT_FOUND,
209 "Expected ERROR_FILE_NOT_FOUND, got %d\n", GetLastError());
210 ok(size == 0xdeadbeef, "Expected size to remain unchanged\n");
211
212 /* successfully open the inf file */
213 size = 0xdeadbeef;
214 ret = SetupGetInfInformationA(inf_filename, INFINFO_INF_NAME_IS_ABSOLUTE, NULL, 0, &size);
215 ok(ret == TRUE, "Expected SetupGetInfInformation to succeed\n");
216 ok(size != 0xdeadbeef, "Expected a valid size on return\n");
217
218 /* set ReturnBuffer to NULL and ReturnBufferSize to non-zero value 'size' */
219 SetLastError(0xbeefcafe);
220 ret = SetupGetInfInformationA(inf_filename, INFINFO_INF_NAME_IS_ABSOLUTE, NULL, size, &size);
221 ok(ret == FALSE, "Expected SetupGetInfInformation to fail\n");
222 ok(GetLastError() == ERROR_INVALID_PARAMETER,
223 "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
224
225 /* set ReturnBuffer to NULL and ReturnBufferSize to non-zero value 'size-1' */
226 ret = SetupGetInfInformationA(inf_filename, INFINFO_INF_NAME_IS_ABSOLUTE, NULL, size-1, &size);
227 ok(ret == TRUE, "Expected SetupGetInfInformation to succeed\n");
228
229 /* some tests for behaviour with a NULL RequiredSize pointer */
230 ret = SetupGetInfInformationA(inf_filename, INFINFO_INF_NAME_IS_ABSOLUTE, NULL, 0, NULL);
231 ok(ret == TRUE, "Expected SetupGetInfInformation to succeed\n");
232 ret = SetupGetInfInformationA(inf_filename, INFINFO_INF_NAME_IS_ABSOLUTE, NULL, size - 1, NULL);
233 ok(ret == TRUE, "Expected SetupGetInfInformation to succeed\n");
234 ret = SetupGetInfInformationA(inf_filename, INFINFO_INF_NAME_IS_ABSOLUTE, NULL, size, NULL);
235 ok(ret == FALSE, "Expected SetupGetInfInformation to fail\n");
236
237 info = HeapAlloc(GetProcessHeap(), 0, size);
238
239 /* try valid ReturnBuffer but too small size */
240 SetLastError(0xbeefcafe);
241 ret = SetupGetInfInformationA(inf_filename, INFINFO_INF_NAME_IS_ABSOLUTE, info, size - 1, &size);
242 ok(ret == FALSE, "Expected SetupGetInfInformation to fail\n");
243 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER,
244 "Expected ERROR_INSUFFICIENT_BUFFER, got %d\n", GetLastError());
245
246 /* successfully get the inf information */
247 ret = SetupGetInfInformationA(inf_filename, INFINFO_INF_NAME_IS_ABSOLUTE, info, size, &size);
248 ok(ret == TRUE, "Expected SetupGetInfInformation to succeed\n");
249 ok(check_info_filename(info, inf_filename), "Expected returned filename to be equal\n");
250
251 HeapFree(GetProcessHeap(), 0, info);
252
253 /* try the INFINFO_INF_SPEC_IS_HINF search flag */
254 hinf = SetupOpenInfFileA(inf_filename, NULL, INF_STYLE_WIN4, NULL);
255 info = alloc_inf_info(hinf, INFINFO_INF_SPEC_IS_HINF, &size);
256 ret = SetupGetInfInformationA(hinf, INFINFO_INF_SPEC_IS_HINF, info, size, &size);
257 ok(ret == TRUE, "Expected SetupGetInfInformation to succeed\n");
258 ok(check_info_filename(info, inf_filename), "Expected returned filename to be equal\n");
259 SetupCloseInfFile(hinf);
260
261 lstrcpyA(inf_two, WIN_DIR);
262 lstrcatA(inf_two, "\\system32\\");
263 lstrcatA(inf_two, "test.inf");
264 ret = create_inf_file(inf_two, inf_data1, sizeof(inf_data1) - 1);
265 if (!ret && GetLastError() == ERROR_ACCESS_DENIED)
266 {
267 skip("need admin rights\n");
268 goto done;
269 }
270 ok(ret, "can't create inf file %u\n", GetLastError());
271
272 HeapFree(GetProcessHeap(), 0, info);
273 info = alloc_inf_info("test.inf", INFINFO_DEFAULT_SEARCH, &size);
274
275 /* check if system32 is searched for inf */
276 ret = SetupGetInfInformationA("test.inf", INFINFO_DEFAULT_SEARCH, info, size, &size);
277 if (!ret && GetLastError() == ERROR_FILE_NOT_FOUND)
278 revfile = inf_one; /* Vista */
279 else
280 revfile = inf_two;
281
282 lstrcpyA(inf_one, WIN_DIR);
283 lstrcatA(inf_one, "\\inf\\");
284 lstrcatA(inf_one, "test.inf");
285 create_inf_file(inf_one, inf_data1, sizeof(inf_data1) - 1);
286
287 HeapFree(GetProcessHeap(), 0, info);
288 info = alloc_inf_info("test.inf", INFINFO_DEFAULT_SEARCH, &size);
289
290 /* test the INFINFO_DEFAULT_SEARCH search flag */
291 ret = SetupGetInfInformationA("test.inf", INFINFO_DEFAULT_SEARCH, info, size, &size);
292 ok(ret == TRUE, "Expected SetupGetInfInformation to succeed: %d\n", GetLastError());
293 ok(check_info_filename(info, inf_one), "Expected returned filename to be equal\n");
294
295 HeapFree(GetProcessHeap(), 0, info);
296 info = alloc_inf_info("test.inf", INFINFO_REVERSE_DEFAULT_SEARCH, &size);
297
298 /* test the INFINFO_REVERSE_DEFAULT_SEARCH search flag */
299 ret = SetupGetInfInformationA("test.inf", INFINFO_REVERSE_DEFAULT_SEARCH, info, size, &size);
300 ok(ret == TRUE, "Expected SetupGetInfInformation to succeed\n");
301 ok(check_info_filename(info, revfile), "Expected returned filename to be equal\n");
302
303 done:
304 HeapFree(GetProcessHeap(), 0, info);
305 DeleteFileA(inf_filename);
306 DeleteFileA(inf_one);
307 DeleteFileA(inf_two);
308 }
309
test_SetupGetSourceFileLocation(void)310 static void test_SetupGetSourceFileLocation(void)
311 {
312 char buffer[MAX_PATH] = "not empty", inf_filename[MAX_PATH];
313 UINT source_id;
314 DWORD required, error;
315 HINF hinf;
316 BOOL ret;
317
318 lstrcpyA(inf_filename, CURR_DIR);
319 lstrcatA(inf_filename, "\\");
320 lstrcatA(inf_filename, "test.inf");
321
322 create_inf_file(inf_filename, inf_data1, sizeof(inf_data1) - 1);
323
324 hinf = SetupOpenInfFileA(inf_filename, NULL, INF_STYLE_WIN4, NULL);
325 ok(hinf != INVALID_HANDLE_VALUE, "could not open inf file\n");
326
327 required = 0;
328 source_id = 0;
329
330 ret = SetupGetSourceFileLocationA(hinf, NULL, "lanconf.exe", &source_id, buffer, sizeof(buffer), &required);
331 ok(ret, "SetupGetSourceFileLocation failed\n");
332
333 ok(required == 1, "unexpected required size: %d\n", required);
334 ok(source_id == 2, "unexpected source id: %d\n", source_id);
335 ok(!lstrcmpA("", buffer), "unexpected result string: %s\n", buffer);
336
337 SetupCloseInfFile(hinf);
338 DeleteFileA(inf_filename);
339
340 create_inf_file(inf_filename, inf_data2, sizeof(inf_data2) - 1);
341
342 SetLastError(0xdeadbeef);
343 hinf = SetupOpenInfFileA(inf_filename, NULL, INF_STYLE_WIN4, NULL);
344 error = GetLastError();
345 ok(hinf == INVALID_HANDLE_VALUE, "could open inf file\n");
346 ok(error == ERROR_WRONG_INF_STYLE, "got wrong error: %d\n", error);
347
348 hinf = SetupOpenInfFileA(inf_filename, NULL, INF_STYLE_OLDNT, NULL);
349 ok(hinf != INVALID_HANDLE_VALUE, "could not open inf file\n");
350
351 ret = SetupGetSourceFileLocationA(hinf, NULL, "", &source_id, buffer, sizeof(buffer), &required);
352 ok(!ret, "SetupGetSourceFileLocation succeeded\n");
353
354 SetupCloseInfFile(hinf);
355 DeleteFileA(inf_filename);
356 }
357
test_SetupGetSourceInfo(void)358 static void test_SetupGetSourceInfo(void)
359 {
360 char buffer[MAX_PATH], inf_filename[MAX_PATH];
361 DWORD required;
362 HINF hinf;
363 BOOL ret;
364
365 lstrcpyA(inf_filename, CURR_DIR);
366 lstrcatA(inf_filename, "\\");
367 lstrcatA(inf_filename, "test.inf");
368
369 create_inf_file(inf_filename, inf_data1, sizeof(inf_data1) - 1);
370
371 hinf = SetupOpenInfFileA(inf_filename, NULL, INF_STYLE_WIN4, NULL);
372 ok(hinf != INVALID_HANDLE_VALUE, "could not open inf file\n");
373
374 required = 0;
375
376 ret = SetupGetSourceInfoA(hinf, 2, SRCINFO_PATH, buffer, sizeof(buffer), &required);
377 ok(ret, "SetupGetSourceInfoA failed\n");
378
379 ok(required == 1, "unexpected required size: %d\n", required);
380 ok(!lstrcmpA("", buffer), "unexpected result string: %s\n", buffer);
381
382 required = 0;
383 buffer[0] = 0;
384
385 ret = SetupGetSourceInfoA(hinf, 2, SRCINFO_TAGFILE, buffer, sizeof(buffer), &required);
386 ok(ret, "SetupGetSourceInfoA failed\n");
387
388 ok(required == 28, "unexpected required size: %d\n", required);
389 ok(!lstrcmpA("LANCOM\\LANtools\\lanconf.cab", buffer), "unexpected result string: %s\n", buffer);
390
391 required = 0;
392 buffer[0] = 0;
393
394 ret = SetupGetSourceInfoA(hinf, 2, SRCINFO_DESCRIPTION, buffer, sizeof(buffer), &required);
395 ok(ret, "SetupGetSourceInfoA failed\n");
396
397 ok(required == 19, "unexpected required size: %d\n", required);
398 ok(!lstrcmpA("LANCOM Software CD", buffer), "unexpected result string: %s\n", buffer);
399
400 SetupCloseInfFile(hinf);
401 DeleteFileA(inf_filename);
402 }
403
test_SetupGetTargetPath(void)404 static void test_SetupGetTargetPath(void)
405 {
406 char buffer[MAX_PATH], inf_filename[MAX_PATH];
407 char destfile[MAX_PATH];
408 DWORD required;
409 HINF hinf;
410 INFCONTEXT ctx;
411 BOOL ret;
412
413 lstrcpyA(inf_filename, CURR_DIR);
414 lstrcatA(inf_filename, "\\");
415 lstrcatA(inf_filename, "test.inf");
416
417 create_inf_file(inf_filename, inf_data1, sizeof(inf_data1) - 1);
418
419 hinf = SetupOpenInfFileA(inf_filename, NULL, INF_STYLE_WIN4, NULL);
420 ok(hinf != INVALID_HANDLE_VALUE, "could not open inf file\n");
421
422 ctx.Inf = hinf;
423 ctx.CurrentInf = hinf;
424 ctx.Section = 7;
425 ctx.Line = 0;
426
427 required = 0;
428
429 ret = SetupGetTargetPathA(hinf, &ctx, NULL, buffer, sizeof(buffer), &required);
430 ok(ret, "SetupGetTargetPathA failed\n");
431 ok(required == 10, "unexpected required size: %d\n", required);
432 /* Retrieve the system drive from the windows directory.
433 * (%SystemDrive% is not available on Win9x)
434 */
435 lstrcpyA(destfile, WIN_DIR);
436 destfile[3] = '\0';
437 lstrcatA(destfile, "LANCOM");
438 ok(!lstrcmpiA(destfile, buffer), "unexpected result string: %s\n", buffer);
439
440 SetupCloseInfFile(hinf);
441 DeleteFileA(inf_filename);
442
443 create_inf_file(inf_filename, inf_data3, sizeof(inf_data3) - 1);
444
445 hinf = SetupOpenInfFileA(inf_filename, NULL, INF_STYLE_WIN4, NULL);
446 ok(hinf != INVALID_HANDLE_VALUE, "could not open inf file\n");
447
448 required = 0;
449
450 ret = SetupGetTargetPathA(hinf, NULL, "CopyAlways.Windir.Files", buffer, sizeof(buffer), &required);
451 ok(ret, "SetupGetTargetPathA failed\n");
452
453 lstrcpyA(destfile, WIN_DIR);
454
455 ok(required == lstrlenA(destfile) + 1, "unexpected required size: %d\n", required);
456 ok(!lstrcmpiA(buffer, destfile), "unexpected path: %s\n", buffer);
457
458 SetupCloseInfFile(hinf);
459 DeleteFileA(inf_filename);
460
461 create_inf_file(inf_filename, inf_data4, sizeof(inf_data4) - 1);
462
463 hinf = SetupOpenInfFileA(inf_filename, NULL, INF_STYLE_WIN4, NULL);
464 ok(hinf != INVALID_HANDLE_VALUE, "could not open inf file\n");
465
466 required = 0;
467
468 ret = SetupGetTargetPathA(hinf, NULL, "CopyAlways.System32.Files", buffer, sizeof(buffer), &required);
469 ok(ret, "SetupGetTargetPathA failed\n");
470
471 GetSystemDirectoryA(destfile, MAX_PATH);
472
473 ok(required == lstrlenA(destfile) + 1, "unexpected required size: %d\n", required);
474 ok(!lstrcmpiA(buffer, destfile), "unexpected path: %s\n", buffer);
475
476 SetupCloseInfFile(hinf);
477 DeleteFileA(inf_filename);
478
479 create_inf_file(inf_filename, inf_data5, sizeof(inf_data5) - 1);
480
481 hinf = SetupOpenInfFileA(inf_filename, NULL, INF_STYLE_WIN4, NULL);
482 ok(hinf != INVALID_HANDLE_VALUE, "could not open inf file\n");
483
484 required = 0;
485
486 ret = SetupGetTargetPathA(hinf, NULL, "CopyAlways.Windir.Files", buffer, sizeof(buffer), &required);
487 ok(ret, "SetupGetTargetPathA failed\n");
488
489 lstrcpyA(destfile, WIN_DIR);
490
491 ok(required == lstrlenA(destfile) + 1, "unexpected required size: %d\n", required);
492 ok(!lstrcmpiA(buffer, destfile), "unexpected path: %s\n", buffer);
493
494 SetupCloseInfFile(hinf);
495 DeleteFileA(inf_filename);
496
497 create_inf_file(inf_filename, inf_data6, sizeof(inf_data6) - 1);
498
499 hinf = SetupOpenInfFileA(inf_filename, NULL, INF_STYLE_WIN4, NULL);
500 ok(hinf != INVALID_HANDLE_VALUE, "could not open inf file\n");
501
502 required = 0;
503
504 ret = SetupGetTargetPathA(hinf, NULL, "CopyAlways.Windir.Files", buffer, sizeof(buffer), &required);
505 ok(ret, "SetupGetTargetPathA failed\n");
506
507 lstrcpyA(destfile, WIN_DIR);
508
509 ok(required == lstrlenA(destfile) + 1, "unexpected required size: %d\n", required);
510 ok(!lstrcmpiA(buffer, destfile), "unexpected path: %s\n", buffer);
511
512 SetupCloseInfFile(hinf);
513 DeleteFileA(inf_filename);
514 }
515
START_TEST(query)516 START_TEST(query)
517 {
518 get_directories();
519
520 test_SetupGetInfInformation();
521 test_SetupGetSourceFileLocation();
522 test_SetupGetSourceInfo();
523 test_SetupGetTargetPath();
524 }
525