query.c 18.3 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
/*
 * Unit tests for setupapi.dll query functions
 *
 * Copyright (C) 2006 James Hawkins
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * 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 22 23 24 25
 */

#include <stdio.h>
#include <windows.h>
#include <setupapi.h>
#include "wine/test.h"

26 27
static CHAR CURR_DIR[MAX_PATH];
static CHAR WIN_DIR[MAX_PATH];
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45

static void get_directories(void)
{
    int len;

    GetCurrentDirectoryA(MAX_PATH, CURR_DIR);
    len = lstrlenA(CURR_DIR);

    if(len && (CURR_DIR[len-1] == '\\'))
        CURR_DIR[len-1] = 0;

    GetWindowsDirectoryA(WIN_DIR, MAX_PATH);
    len = lstrlenA(WIN_DIR);

    if (len && (WIN_DIR[len-1] == '\\'))
        WIN_DIR[len-1] = 0;
}

46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
static const char inf_data1[] =
    "[Version]\n"
    "Signature=\"$Chicago$\"\n"
    "AdvancedINF=2.5\n"
    "[SourceDisksNames]\n"
    "2 = %SrcDiskName%, LANCOM\\LANtools\\lanconf.cab\n"
    "[SourceDisksFiles]\n"
    "lanconf.exe = 2\n"
    "[DestinationDirs]\n"
    "DefaultDestDir = 24, %DefaultDest%\n"
    "[Strings]\n"
    "LangDir = english\n"
    "DefaultDest = LANCOM\n"
    "SrcDiskName = \"LANCOM Software CD\"\n";

static const char inf_data2[] =
    "[SourceFileInfo]\n"
    "sp1qfe\\bitsinst.exe=250B3702C7CCD7C2F9E4DAA1555C933E,000600060A28062C,27136,SP1QFE\n"
    "sp1qfe\\bitsprx2.dll=4EBEA67F4BB4EB402E725CA7CA2857AE,000600060A280621,7680,SP1QFE\n"
    "sp1qfe\\bitsprx3.dll=C788A1D9330DA011EF25E95D3BC7BDE5,000600060A280621,7168,SP1QFE\n"
    "sp1qfe\\qmgr.dll=696AC82FB290A03F205901442E0E9589,000600060A280621,361984,SP1QFE\n"
    "sp1qfe\\qmgrprxy.dll=8B5848144829E1BC985EA4C3D8CA7E3F,000600060A280621,17408,SP1QFE\n"
    "sp1qfe\\winhttp.dll=3EC6F518114606CA59D4160322077437,000500010A280615,331776,SP1QFE\n"
    "sp1qfe\\xpob2res.dll=DB83156B9F496F20D1EA70E4ABEC0166,000500010A280622,158720,SP1QFE\n";

71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
static const char inf_data3[] =
    "[Version]\n"
    "Signature = \"$Windows NT$\"\n"
    "[DestinationDirs]\n"
    "CopyAlways.Windir.files = 10\n"
    "[CopyAlways.Windir.Files]\n"
    "WindowsCodecs.dll\n";

static const char inf_data4[] =
    "[Version]\n"
    "Signature = \"$Windows NT$\"\n"
    "[CopyAlways.System32.Files]\n"
    "WindowsCodecs.dll\n";

static const char inf_data5[] =
    "[Version]\n"
    "Signature = \"$Windows NT$\"\n"
    "[DestinationDirs]\n"
    "DefaultDestDir = 11\n"
    "CopyAlways.Windir.files = 10\n"
    "[CopyAlways.Windir.Files]\n"
    "WindowsCodecs.dll\n";

static const char inf_data6[] =
    "[Version]\n"
    "Signature = \"$Windows NT$\"\n"
    "[DestinationDirs]\n"
    "DefaultDestDir = 10\n"
    "[CopyAlways.Windir.Files]\n"
    "WindowsCodecs.dll\n";

102
static void create_inf_file(LPSTR filename, const char *data, DWORD size)
103 104
{
    DWORD dwNumberOfBytesWritten;
105 106
    HANDLE hf = CreateFileA(filename, GENERIC_WRITE, 0, NULL,
                            CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
107
    WriteFile(hf, data, size, &dwNumberOfBytesWritten, NULL);
108 109 110
    CloseHandle(hf);
}

111 112 113 114 115 116
static BOOL check_info_filename(PSP_INF_INFORMATION info, LPSTR test)
{
    LPSTR filename;
    DWORD size;
    BOOL ret = FALSE;

117
    if (!SetupQueryInfFileInformationA(info, 0, NULL, 0, &size))
118 119 120 121 122 123
        return FALSE;

    filename = HeapAlloc(GetProcessHeap(), 0, size);
    if (!filename)
        return FALSE;

124
    SetupQueryInfFileInformationA(info, 0, filename, size, &size);
125 126 127 128 129 130 131 132

    if (!lstrcmpiA(test, filename))
        ret = TRUE;

    HeapFree(GetProcessHeap(), 0, filename);
    return ret;
}

133
static PSP_INF_INFORMATION alloc_inf_info(LPCSTR filename, DWORD search, PDWORD size)
134 135 136 137
{
    PSP_INF_INFORMATION info;
    BOOL ret;

138
    ret = SetupGetInfInformationA(filename, search, NULL, 0, size);
139 140 141 142 143 144 145 146 147 148 149 150
    if (!ret)
        return NULL;

    info = HeapAlloc(GetProcessHeap(), 0, *size);
    return info;
}

static void test_SetupGetInfInformation(void)
{
    PSP_INF_INFORMATION info;
    CHAR inf_filename[MAX_PATH];
    CHAR inf_one[MAX_PATH], inf_two[MAX_PATH];
151
    LPSTR revfile;
152 153 154 155 156 157 158 159 160 161 162
    DWORD size;
    HINF hinf;
    BOOL ret;

    lstrcpyA(inf_filename, CURR_DIR);
    lstrcatA(inf_filename, "\\");
    lstrcatA(inf_filename, "test.inf");

    /* try an invalid inf handle */
    size = 0xdeadbeef;
    SetLastError(0xbeefcafe);
163
    ret = SetupGetInfInformationA(NULL, INFINFO_INF_SPEC_IS_HINF, NULL, 0, &size);
164
    ok(ret == FALSE, "Expected SetupGetInfInformation to fail\n");
165 166 167 168
    ok(GetLastError() == ERROR_INVALID_HANDLE ||
       broken(GetLastError() == ERROR_BAD_PATHNAME) || /* win95 */
       broken(GetLastError() == ERROR_FILE_NOT_FOUND) || /* win98 */
       broken(GetLastError() == ERROR_PATH_NOT_FOUND) || /* NT4 */
169
       broken(GetLastError() == ERROR_INVALID_NAME) || /* win2k */
170
       broken(GetLastError() == ERROR_GENERAL_SYNTAX), /* another win2k / winMe */
171
       "Expected ERROR_INVALID_HANDLE, got %d\n", GetLastError());
172 173 174
    ok(size == 0xdeadbeef, "Expected size to remain unchanged\n");

    /* try an invalid inf filename */
175
    /* do not use NULL as absolute inf filename on win9x/winMe (crash) */
176
    if ((GetLastError() != ERROR_BAD_PATHNAME) &&   /* win95 */
177 178
        (GetLastError() != ERROR_FILE_NOT_FOUND) &&  /* win98 */
        (GetLastError() != ERROR_GENERAL_SYNTAX))  /* winMe */
179 180 181 182 183 184 185 186 187
    {
        size = 0xdeadbeef;
        SetLastError(0xbeefcafe);
        ret = SetupGetInfInformationA(NULL, INFINFO_INF_NAME_IS_ABSOLUTE, NULL, 0, &size);
        ok(ret == FALSE, "Expected SetupGetInfInformation to fail\n");
        ok(GetLastError() == ERROR_INVALID_PARAMETER,
           "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
        ok(size == 0xdeadbeef, "Expected size to remain unchanged\n");
    }
188

189
    create_inf_file(inf_filename, inf_data1, sizeof(inf_data1) - 1);
190 191 192 193

    /* try an invalid search flag */
    size = 0xdeadbeef;
    SetLastError(0xbeefcafe);
194
    ret = SetupGetInfInformationA(inf_filename, -1, NULL, 0, &size);
195 196
    ok(ret == FALSE, "Expected SetupGetInfInformation to fail\n");
    ok(GetLastError() == ERROR_INVALID_PARAMETER,
197
       "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
198 199 200 201 202
    ok(size == 0xdeadbeef, "Expected size to remain unchanged\n");

    /* try a nonexistent inf file */
    size = 0xdeadbeef;
    SetLastError(0xbeefcafe);
203
    ret = SetupGetInfInformationA("idontexist", INFINFO_INF_NAME_IS_ABSOLUTE, NULL, 0, &size);
204
    ok(ret == FALSE, "Expected SetupGetInfInformation to fail\n");
205
    ok(GetLastError() == ERROR_FILE_NOT_FOUND,
206
       "Expected ERROR_FILE_NOT_FOUND, got %d\n", GetLastError());
207
    ok(size == 0xdeadbeef, "Expected size to remain unchanged\n");
208 209 210

    /* successfully open the inf file */
    size = 0xdeadbeef;
211
    ret = SetupGetInfInformationA(inf_filename, INFINFO_INF_NAME_IS_ABSOLUTE, NULL, 0, &size);
212
    ok(ret == TRUE, "Expected SetupGetInfInformation to succeed\n");
213
    ok(size != 0xdeadbeef, "Expected a valid size on return\n");
214

215
    /* set ReturnBuffer to NULL and ReturnBufferSize to non-zero value 'size' */
216
    SetLastError(0xbeefcafe);
217
    ret = SetupGetInfInformationA(inf_filename, INFINFO_INF_NAME_IS_ABSOLUTE, NULL, size, &size);
218
    ok(ret == FALSE, "Expected SetupGetInfInformation to fail\n");
219
    ok(GetLastError() == ERROR_INVALID_PARAMETER,
220
       "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
221

222
    /* set ReturnBuffer to NULL and ReturnBufferSize to non-zero value 'size-1' */
223
    ret = SetupGetInfInformationA(inf_filename, INFINFO_INF_NAME_IS_ABSOLUTE, NULL, size-1, &size);
224 225 226
    ok(ret == TRUE, "Expected SetupGetInfInformation to succeed\n");

    /* some tests for behaviour with a NULL RequiredSize pointer */
227
    ret = SetupGetInfInformationA(inf_filename, INFINFO_INF_NAME_IS_ABSOLUTE, NULL, 0, NULL);
228
    ok(ret == TRUE, "Expected SetupGetInfInformation to succeed\n");
229
    ret = SetupGetInfInformationA(inf_filename, INFINFO_INF_NAME_IS_ABSOLUTE, NULL, size - 1, NULL);
230
    ok(ret == TRUE, "Expected SetupGetInfInformation to succeed\n");
231
    ret = SetupGetInfInformationA(inf_filename, INFINFO_INF_NAME_IS_ABSOLUTE, NULL, size, NULL);
232 233
    ok(ret == FALSE, "Expected SetupGetInfInformation to fail\n");

234 235 236 237
    info = HeapAlloc(GetProcessHeap(), 0, size);

    /* try valid ReturnBuffer but too small size */
    SetLastError(0xbeefcafe);
238
    ret = SetupGetInfInformationA(inf_filename, INFINFO_INF_NAME_IS_ABSOLUTE, info, size - 1, &size);
239
    ok(ret == FALSE, "Expected SetupGetInfInformation to fail\n");
240
    ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER,
241
       "Expected ERROR_INSUFFICIENT_BUFFER, got %d\n", GetLastError());
242 243

    /* successfully get the inf information */
244
    ret = SetupGetInfInformationA(inf_filename, INFINFO_INF_NAME_IS_ABSOLUTE, info, size, &size);
245 246
    ok(ret == TRUE, "Expected SetupGetInfInformation to succeed\n");
    ok(check_info_filename(info, inf_filename), "Expected returned filename to be equal\n");
247

248 249
    HeapFree(GetProcessHeap(), 0, info);

250
    /* try the INFINFO_INF_SPEC_IS_HINF search flag */
251
    hinf = SetupOpenInfFileA(inf_filename, NULL, INF_STYLE_WIN4, NULL);
252
    info = alloc_inf_info(hinf, INFINFO_INF_SPEC_IS_HINF, &size);
253
    ret = SetupGetInfInformationA(hinf, INFINFO_INF_SPEC_IS_HINF, info, size, &size);
254
    ok(ret == TRUE, "Expected SetupGetInfInformation to succeed\n");
255
    ok(check_info_filename(info, inf_filename), "Expected returned filename to be equal\n");
256
    SetupCloseInfFile(hinf);
257 258 259 260

    lstrcpyA(inf_two, WIN_DIR);
    lstrcatA(inf_two, "\\system32\\");
    lstrcatA(inf_two, "test.inf");
261
    create_inf_file(inf_two, inf_data1, sizeof(inf_data1) - 1);
262 263 264 265

    HeapFree(GetProcessHeap(), 0, info);
    info = alloc_inf_info("test.inf", INFINFO_DEFAULT_SEARCH, &size);

266 267 268 269 270 271 272 273 274 275
    /* check if system32 is searched for inf */
    ret = SetupGetInfInformationA("test.inf", INFINFO_DEFAULT_SEARCH, info, size, &size);
    if (!ret && GetLastError() == ERROR_FILE_NOT_FOUND)
        revfile = inf_one; /* Vista */
    else
        revfile = inf_two;

    lstrcpyA(inf_one, WIN_DIR);
    lstrcatA(inf_one, "\\inf\\");
    lstrcatA(inf_one, "test.inf");
276
    create_inf_file(inf_one, inf_data1, sizeof(inf_data1) - 1);
277 278 279 280

    HeapFree(GetProcessHeap(), 0, info);
    info = alloc_inf_info("test.inf", INFINFO_DEFAULT_SEARCH, &size);

281
    /* test the INFINFO_DEFAULT_SEARCH search flag */
282
    ret = SetupGetInfInformationA("test.inf", INFINFO_DEFAULT_SEARCH, info, size, &size);
283
    ok(ret == TRUE, "Expected SetupGetInfInformation to succeed: %d\n", GetLastError());
284
    ok(check_info_filename(info, inf_one), "Expected returned filename to be equal\n");
285 286 287 288 289

    HeapFree(GetProcessHeap(), 0, info);
    info = alloc_inf_info("test.inf", INFINFO_REVERSE_DEFAULT_SEARCH, &size);

    /* test the INFINFO_REVERSE_DEFAULT_SEARCH search flag */
290
    ret = SetupGetInfInformationA("test.inf", INFINFO_REVERSE_DEFAULT_SEARCH, info, size, &size);
291
    ok(ret == TRUE, "Expected SetupGetInfInformation to succeed\n");
292
    ok(check_info_filename(info, revfile), "Expected returned filename to be equal\n");
293

294 295
    HeapFree(GetProcessHeap(), 0, info);

296 297 298 299 300
    DeleteFileA(inf_filename);
    DeleteFileA(inf_one);
    DeleteFileA(inf_two);
}

301 302 303 304
static void test_SetupGetSourceFileLocation(void)
{
    char buffer[MAX_PATH] = "not empty", inf_filename[MAX_PATH];
    UINT source_id;
305
    DWORD required, error;
306 307 308 309 310 311 312
    HINF hinf;
    BOOL ret;

    lstrcpyA(inf_filename, CURR_DIR);
    lstrcatA(inf_filename, "\\");
    lstrcatA(inf_filename, "test.inf");

313
    create_inf_file(inf_filename, inf_data1, sizeof(inf_data1) - 1);
314

315
    hinf = SetupOpenInfFileA(inf_filename, NULL, INF_STYLE_WIN4, NULL);
316 317 318 319 320
    ok(hinf != INVALID_HANDLE_VALUE, "could not open inf file\n");

    required = 0;
    source_id = 0;

321
    ret = SetupGetSourceFileLocationA(hinf, NULL, "lanconf.exe", &source_id, buffer, sizeof(buffer), &required);
322 323 324 325 326 327
    ok(ret, "SetupGetSourceFileLocation failed\n");

    ok(required == 1, "unexpected required size: %d\n", required);
    ok(source_id == 2, "unexpected source id: %d\n", source_id);
    ok(!lstrcmpA("", buffer), "unexpected result string: %s\n", buffer);

328
    SetupCloseInfFile(hinf);
329
    DeleteFileA(inf_filename);
330

331
    create_inf_file(inf_filename, inf_data2, sizeof(inf_data2) - 1);
332 333

    SetLastError(0xdeadbeef);
334
    hinf = SetupOpenInfFileA(inf_filename, NULL, INF_STYLE_WIN4, NULL);
335 336 337 338
    error = GetLastError();
    ok(hinf == INVALID_HANDLE_VALUE, "could open inf file\n");
    ok(error == ERROR_WRONG_INF_STYLE, "got wrong error: %d\n", error);

339
    hinf = SetupOpenInfFileA(inf_filename, NULL, INF_STYLE_OLDNT, NULL);
340 341
    ok(hinf != INVALID_HANDLE_VALUE, "could not open inf file\n");

342
    ret = SetupGetSourceFileLocationA(hinf, NULL, "", &source_id, buffer, sizeof(buffer), &required);
343 344
    ok(!ret, "SetupGetSourceFileLocation succeeded\n");

345
    SetupCloseInfFile(hinf);
346
    DeleteFileA(inf_filename);
347 348 349 350 351 352 353 354 355 356 357 358 359
}

static void test_SetupGetSourceInfo(void)
{
    char buffer[MAX_PATH], inf_filename[MAX_PATH];
    DWORD required;
    HINF hinf;
    BOOL ret;

    lstrcpyA(inf_filename, CURR_DIR);
    lstrcatA(inf_filename, "\\");
    lstrcatA(inf_filename, "test.inf");

360
    create_inf_file(inf_filename, inf_data1, sizeof(inf_data1) - 1);
361

362
    hinf = SetupOpenInfFileA(inf_filename, NULL, INF_STYLE_WIN4, NULL);
363 364 365 366
    ok(hinf != INVALID_HANDLE_VALUE, "could not open inf file\n");

    required = 0;

367
    ret = SetupGetSourceInfoA(hinf, 2, SRCINFO_PATH, buffer, sizeof(buffer), &required);
368 369 370 371 372 373 374 375
    ok(ret, "SetupGetSourceInfoA failed\n");

    ok(required == 1, "unexpected required size: %d\n", required);
    ok(!lstrcmpA("", buffer), "unexpected result string: %s\n", buffer);

    required = 0;
    buffer[0] = 0;

376
    ret = SetupGetSourceInfoA(hinf, 2, SRCINFO_TAGFILE, buffer, sizeof(buffer), &required);
377 378 379 380 381 382 383 384
    ok(ret, "SetupGetSourceInfoA failed\n");

    ok(required == 28, "unexpected required size: %d\n", required);
    ok(!lstrcmpA("LANCOM\\LANtools\\lanconf.cab", buffer), "unexpected result string: %s\n", buffer);

    required = 0;
    buffer[0] = 0;

385
    ret = SetupGetSourceInfoA(hinf, 2, SRCINFO_DESCRIPTION, buffer, sizeof(buffer), &required);
386 387 388 389 390
    ok(ret, "SetupGetSourceInfoA failed\n");

    ok(required == 19, "unexpected required size: %d\n", required);
    ok(!lstrcmpA("LANCOM Software CD", buffer), "unexpected result string: %s\n", buffer);

391
    SetupCloseInfFile(hinf);
392 393 394 395 396 397
    DeleteFileA(inf_filename);
}

static void test_SetupGetTargetPath(void)
{
    char buffer[MAX_PATH], inf_filename[MAX_PATH];
398
    char destfile[MAX_PATH];
399 400 401 402 403 404 405 406 407
    DWORD required;
    HINF hinf;
    INFCONTEXT ctx;
    BOOL ret;

    lstrcpyA(inf_filename, CURR_DIR);
    lstrcatA(inf_filename, "\\");
    lstrcatA(inf_filename, "test.inf");

408
    create_inf_file(inf_filename, inf_data1, sizeof(inf_data1) - 1);
409

410
    hinf = SetupOpenInfFileA(inf_filename, NULL, INF_STYLE_WIN4, NULL);
411 412 413 414 415 416 417 418 419
    ok(hinf != INVALID_HANDLE_VALUE, "could not open inf file\n");

    ctx.Inf = hinf;
    ctx.CurrentInf = hinf;
    ctx.Section = 7;
    ctx.Line = 0;

    required = 0;

420
    ret = SetupGetTargetPathA(hinf, &ctx, NULL, buffer, sizeof(buffer), &required);
421 422
    ok(ret, "SetupGetTargetPathA failed\n");
    ok(required == 10, "unexpected required size: %d\n", required);
423 424 425 426 427 428 429
    /* Retrieve the system drive from the windows directory.
     * (%SystemDrive% is not available on Win9x)
     */
    lstrcpyA(destfile, WIN_DIR);
    destfile[3] = '\0';
    lstrcatA(destfile, "LANCOM");
    ok(!lstrcmpiA(destfile, buffer), "unexpected result string: %s\n", buffer);
430

431
    SetupCloseInfFile(hinf);
432
    DeleteFileA(inf_filename);
433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461

    create_inf_file(inf_filename, inf_data3, sizeof(inf_data3) - 1);

    hinf = SetupOpenInfFileA(inf_filename, NULL, INF_STYLE_WIN4, NULL);
    ok(hinf != INVALID_HANDLE_VALUE, "could not open inf file\n");

    required = 0;

    ret = SetupGetTargetPathA(hinf, NULL, "CopyAlways.Windir.Files", buffer, sizeof(buffer), &required);
    ok(ret, "SetupGetTargetPathA failed\n");

    lstrcpyA(destfile, WIN_DIR);

    ok(required == lstrlenA(destfile) + 1, "unexpected required size: %d\n", required);
    ok(!lstrcmpiA(buffer, destfile), "unexpected path: %s\n", buffer);

    SetupCloseInfFile(hinf);
    DeleteFileA(inf_filename);

    create_inf_file(inf_filename, inf_data4, sizeof(inf_data4) - 1);

    hinf = SetupOpenInfFileA(inf_filename, NULL, INF_STYLE_WIN4, NULL);
    ok(hinf != INVALID_HANDLE_VALUE, "could not open inf file\n");

    required = 0;

    ret = SetupGetTargetPathA(hinf, NULL, "CopyAlways.System32.Files", buffer, sizeof(buffer), &required);
    ok(ret, "SetupGetTargetPathA failed\n");

462
    GetSystemDirectoryA(destfile, MAX_PATH);
463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504

    ok(required == lstrlenA(destfile) + 1, "unexpected required size: %d\n", required);
    ok(!lstrcmpiA(buffer, destfile), "unexpected path: %s\n", buffer);

    SetupCloseInfFile(hinf);
    DeleteFileA(inf_filename);

    create_inf_file(inf_filename, inf_data5, sizeof(inf_data5) - 1);

    hinf = SetupOpenInfFileA(inf_filename, NULL, INF_STYLE_WIN4, NULL);
    ok(hinf != INVALID_HANDLE_VALUE, "could not open inf file\n");

    required = 0;

    ret = SetupGetTargetPathA(hinf, NULL, "CopyAlways.Windir.Files", buffer, sizeof(buffer), &required);
    ok(ret, "SetupGetTargetPathA failed\n");

    lstrcpyA(destfile, WIN_DIR);

    ok(required == lstrlenA(destfile) + 1, "unexpected required size: %d\n", required);
    ok(!lstrcmpiA(buffer, destfile), "unexpected path: %s\n", buffer);

    SetupCloseInfFile(hinf);
    DeleteFileA(inf_filename);

    create_inf_file(inf_filename, inf_data6, sizeof(inf_data6) - 1);

    hinf = SetupOpenInfFileA(inf_filename, NULL, INF_STYLE_WIN4, NULL);
    ok(hinf != INVALID_HANDLE_VALUE, "could not open inf file\n");

    required = 0;

    ret = SetupGetTargetPathA(hinf, NULL, "CopyAlways.Windir.Files", buffer, sizeof(buffer), &required);
    ok(ret, "SetupGetTargetPathA failed\n");

    lstrcpyA(destfile, WIN_DIR);

    ok(required == lstrlenA(destfile) + 1, "unexpected required size: %d\n", required);
    ok(!lstrcmpiA(buffer, destfile), "unexpected path: %s\n", buffer);

    SetupCloseInfFile(hinf);
    DeleteFileA(inf_filename);
505 506
}

507 508 509 510 511
START_TEST(query)
{
    get_directories();

    test_SetupGetInfInformation();
512 513 514
    test_SetupGetSourceFileLocation();
    test_SetupGetSourceInfo();
    test_SetupGetTargetPath();
515
}