setupapi/tests: Fix a test failure on Vista (and skip some tests).
[wine] / dlls / setupapi / tests / misc.c
1 /*
2  * Miscellaneous tests
3  *
4  * Copyright 2007 James Hawkins
5  * Copyright 2007 Hans Leidekker
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with this library; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
20  */
21
22 #include <stdarg.h>
23 #include <stdio.h>
24 #include <string.h>
25
26 #include "windef.h"
27 #include "winbase.h"
28 #include "winnls.h"
29 #include "winuser.h"
30 #include "winreg.h"
31 #include "setupapi.h"
32
33 #include "wine/test.h"
34
35 static CHAR CURR_DIR[MAX_PATH];
36
37 /* test:
38  *  - fails if not administrator
39  *  - what if it's not a .inf file?
40  *  - copied to %windir%/Inf
41  *  - SourceInfFileName should be a full path
42  *  - SourceInfFileName should be <= MAX_PATH
43  *  - copy styles
44  */
45
46 static BOOL (WINAPI *pSetupGetFileCompressionInfoExA)(PCSTR, PSTR, DWORD, PDWORD, PDWORD, PDWORD, PUINT);
47 static BOOL (WINAPI *pSetupCopyOEMInfA)(PCSTR, PCSTR, DWORD, DWORD, PSTR, DWORD, PDWORD, PSTR *);
48 static BOOL (WINAPI *pSetupQueryInfOriginalFileInformationA)(PSP_INF_INFORMATION, UINT, PSP_ALTPLATFORM_INFO, PSP_ORIGINAL_FILE_INFO_A);
49
50 static void create_inf_file(LPCSTR filename)
51 {
52     DWORD dwNumberOfBytesWritten;
53     HANDLE hf = CreateFile(filename, GENERIC_WRITE, 0, NULL,
54                            CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
55
56     static const char data[] =
57         "[Version]\n"
58         "Signature=\"$Chicago$\"\n"
59         "AdvancedINF=2.5\n"
60         "[DefaultInstall]\n"
61         "RegisterOCXs=RegisterOCXsSection\n"
62         "[RegisterOCXsSection]\n"
63         "%%11%%\\ole32.dll\n";
64
65     WriteFile(hf, data, sizeof(data) - 1, &dwNumberOfBytesWritten, NULL);
66     CloseHandle(hf);
67 }
68
69 static void get_temp_filename(LPSTR path)
70 {
71     CHAR temp[MAX_PATH];
72     LPSTR ptr;
73
74     GetTempFileName(CURR_DIR, "set", 0, temp);
75     ptr = strrchr(temp, '\\');
76
77     lstrcpy(path, ptr + 1);
78 }
79
80 static BOOL file_exists(LPSTR path)
81 {
82     return GetFileAttributes(path) != INVALID_FILE_ATTRIBUTES;
83 }
84
85 static BOOL check_format(LPSTR path, LPSTR inf)
86 {
87     CHAR check[MAX_PATH];
88     BOOL res;
89
90     static const CHAR format[] = "\\INF\\oem";
91
92     GetWindowsDirectory(check, MAX_PATH);
93     lstrcat(check, format);
94     res = CompareString(LOCALE_SYSTEM_DEFAULT, NORM_IGNORECASE, check, -1, path, lstrlen(check)) == CSTR_EQUAL &&
95           path[lstrlen(check)] != '\\';
96
97     return (!inf) ? res : res && (inf == path + lstrlen(check) - 3);
98 }
99
100 static void test_original_file_name(LPCSTR original, LPCSTR dest)
101 {
102     HINF hinf;
103     PSP_INF_INFORMATION pspii;
104     SP_ORIGINAL_FILE_INFO spofi;
105     BOOL res;
106     DWORD size;
107
108     if (!pSetupQueryInfOriginalFileInformationA)
109     {
110         skip("SetupQueryInfOriginalFileInformationA is not available\n");
111         return;
112     }
113
114     hinf = SetupOpenInfFileA(dest, NULL, INF_STYLE_WIN4, NULL);
115     ok(hinf != NULL, "SetupOpenInfFileA failed with error %d\n", GetLastError());
116
117     res = SetupGetInfInformation(hinf, INFINFO_INF_SPEC_IS_HINF, NULL, 0, &size);
118     ok(res, "SetupGetInfInformation failed with error %d\n", GetLastError());
119
120     pspii = HeapAlloc(GetProcessHeap(), 0, size);
121
122     res = SetupGetInfInformation(hinf, INFINFO_INF_SPEC_IS_HINF, pspii, size, NULL);
123     ok(res, "SetupGetInfInformation failed with error %d\n", GetLastError());
124
125     spofi.cbSize = 0;
126     res = pSetupQueryInfOriginalFileInformationA(pspii, 0, NULL, &spofi);
127     ok(!res && GetLastError() == ERROR_INVALID_USER_BUFFER,
128         "SetupQueryInfOriginalFileInformationA should have failed with ERROR_INVALID_USER_BUFFER instead of %d\n", GetLastError());
129
130     spofi.cbSize = sizeof(spofi);
131     res = pSetupQueryInfOriginalFileInformationA(pspii, 0, NULL, &spofi);
132     ok(res, "SetupQueryInfOriginalFileInformationA failed with error %d\n", GetLastError());
133     ok(!spofi.OriginalCatalogName[0], "spofi.OriginalCatalogName should have been \"\" instead of \"%s\"\n", spofi.OriginalCatalogName);
134     todo_wine
135     ok(!strcmp(original, spofi.OriginalInfName), "spofi.OriginalInfName of %s didn't match real original name %s\n", spofi.OriginalInfName, original);
136
137     HeapFree(GetProcessHeap(), 0, pspii);
138
139     SetupCloseInfFile(hinf);
140 }
141
142 static void test_SetupCopyOEMInf(void)
143 {
144     CHAR toolong[MAX_PATH * 2];
145     CHAR path[MAX_PATH], dest[MAX_PATH];
146     CHAR tmpfile[MAX_PATH], dest_save[MAX_PATH];
147     LPSTR inf;
148     DWORD size;
149     BOOL res;
150
151     /* try NULL SourceInfFileName */
152     SetLastError(0xdeadbeef);
153     res = pSetupCopyOEMInfA(NULL, NULL, 0, SP_COPY_NOOVERWRITE, NULL, 0, NULL, NULL);
154     ok(res == FALSE, "Expected FALSE, got %d\n", res);
155     ok(GetLastError() == ERROR_INVALID_PARAMETER,
156        "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
157
158     /* try empty SourceInfFileName */
159     SetLastError(0xdeadbeef);
160     res = pSetupCopyOEMInfA("", NULL, 0, SP_COPY_NOOVERWRITE, NULL, 0, NULL, NULL);
161     ok(res == FALSE, "Expected FALSE, got %d\n", res);
162     ok(GetLastError() == ERROR_FILE_NOT_FOUND ||
163        GetLastError() == ERROR_BAD_PATHNAME || /* Win98 */
164        GetLastError() == ERROR_INVALID_PARAMETER, /* Vista, W2K8 */
165        "Unexpected error : %d\n", GetLastError());
166
167     /* try a relative nonexistent SourceInfFileName */
168     SetLastError(0xdeadbeef);
169     res = pSetupCopyOEMInfA("nonexistent", NULL, 0, SP_COPY_NOOVERWRITE, NULL, 0, NULL, NULL);
170     ok(res == FALSE, "Expected FALSE, got %d\n", res);
171     ok(GetLastError() == ERROR_FILE_NOT_FOUND,
172        "Expected ERROR_FILE_NOT_FOUND, got %d\n", GetLastError());
173
174     /* try an absolute nonexistent SourceInfFileName */
175     lstrcpy(path, CURR_DIR);
176     lstrcat(path, "\\nonexistent");
177     SetLastError(0xdeadbeef);
178     res = pSetupCopyOEMInfA(path, NULL, 0, SP_COPY_NOOVERWRITE, NULL, 0, NULL, NULL);
179     ok(res == FALSE, "Expected FALSE, got %d\n", res);
180     ok(GetLastError() == ERROR_FILE_NOT_FOUND,
181        "Expected ERROR_FILE_NOT_FOUND, got %d\n", GetLastError());
182
183     /* try a long SourceInfFileName */
184     memset(toolong, 'a', MAX_PATH * 2);
185     toolong[MAX_PATH * 2 - 1] = '\0';
186     SetLastError(0xdeadbeef);
187     res = pSetupCopyOEMInfA(toolong, NULL, 0, SP_COPY_NOOVERWRITE, NULL, 0, NULL, NULL);
188     ok(res == FALSE, "Expected FALSE, got %d\n", res);
189     ok(GetLastError() == ERROR_FILE_NOT_FOUND ||
190        GetLastError() == ERROR_FILENAME_EXCED_RANGE, /* Win98 */
191        "Expected ERROR_FILE_NOT_FOUND or ERROR_FILENAME_EXCED_RANGE, got %d\n", GetLastError());
192
193     get_temp_filename(tmpfile);
194     create_inf_file(tmpfile);
195
196     /* try a relative SourceInfFileName */
197     SetLastError(0xdeadbeef);
198     res = pSetupCopyOEMInfA(tmpfile, NULL, 0, SP_COPY_NOOVERWRITE, NULL, 0, NULL, NULL);
199     ok(res == FALSE, "Expected FALSE, got %d\n", res);
200     if (GetLastError() == ERROR_WRONG_INF_TYPE)
201     {
202        /* FIXME:
203         * Vista needs a [Manufacturer] entry in the inf file. Doing this will give some
204         * popups during the installation though as it also needs a catalog file (signed?).
205         */
206        win_skip("Needs a different inf file on Vista/W2K8\n");
207        DeleteFile(tmpfile);
208        return;
209     }
210
211     ok(GetLastError() == ERROR_FILE_NOT_FOUND ||
212        GetLastError() == ERROR_FILE_EXISTS, /* Win98 */
213        "Expected ERROR_FILE_NOT_FOUND or ERROR_FILE_EXISTS, got %d\n", GetLastError());
214     ok(file_exists(tmpfile), "Expected tmpfile to exist\n");
215
216     /* try SP_COPY_REPLACEONLY, dest does not exist */
217     SetLastError(0xdeadbeef);
218     res = pSetupCopyOEMInfA(path, NULL, SPOST_NONE, SP_COPY_REPLACEONLY, NULL, 0, NULL, NULL);
219     ok(res == FALSE, "Expected FALSE, got %d\n", res);
220     ok(GetLastError() == ERROR_FILE_NOT_FOUND,
221        "Expected ERROR_FILE_NOT_FOUND, got %d\n", GetLastError());
222     ok(file_exists(tmpfile), "Expected source inf to exist\n");
223
224     /* try an absolute SourceInfFileName, without DestinationInfFileName */
225     lstrcpy(path, CURR_DIR);
226     lstrcat(path, "\\");
227     lstrcat(path, tmpfile);
228     SetLastError(0xdeadbeef);
229     res = pSetupCopyOEMInfA(path, NULL, SPOST_NONE, 0, NULL, 0, NULL, NULL);
230     ok(res == TRUE, "Expected TRUE, got %d\n", res);
231     ok(GetLastError() == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", GetLastError());
232     ok(file_exists(path), "Expected source inf to exist\n");
233
234     /* try SP_COPY_REPLACEONLY, dest exists */
235     SetLastError(0xdeadbeef);
236     res = pSetupCopyOEMInfA(path, NULL, SPOST_NONE, SP_COPY_REPLACEONLY, NULL, 0, NULL, NULL);
237     ok(res == TRUE, "Expected TRUE, got %d\n", res);
238     ok(GetLastError() == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", GetLastError());
239     ok(file_exists(path), "Expected source inf to exist\n");
240
241     /* try SP_COPY_NOOVERWRITE */
242     SetLastError(0xdeadbeef);
243     res = pSetupCopyOEMInfA(path, NULL, SPOST_NONE, SP_COPY_NOOVERWRITE, NULL, 0, NULL, NULL);
244     ok(res == FALSE, "Expected FALSE, got %d\n", res);
245     ok(GetLastError() == ERROR_FILE_EXISTS,
246        "Expected ERROR_FILE_EXISTS, got %d\n", GetLastError());
247
248     /* get the DestinationInfFileName */
249     SetLastError(0xdeadbeef);
250     res = pSetupCopyOEMInfA(path, NULL, SPOST_NONE, 0, dest, MAX_PATH, NULL, NULL);
251     ok(res == TRUE, "Expected TRUE, got %d\n", res);
252     ok(GetLastError() == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", GetLastError());
253     ok(lstrlen(dest) != 0, "Expected a non-zero length string\n");
254     ok(file_exists(dest), "Expected destination inf to exist\n");
255     ok(check_format(dest, NULL), "Expected %%windir%%\\inf\\OEMx.inf, got %s\n", dest);
256     ok(file_exists(path), "Expected source inf to exist\n");
257
258     lstrcpy(dest_save, dest);
259     DeleteFile(dest_save);
260
261     /* get the DestinationInfFileName, DestinationInfFileNameSize is too small
262      *   - inf is still copied
263      */
264     lstrcpy(dest, "aaa");
265     size = 0;
266     SetLastError(0xdeadbeef);
267     res = pSetupCopyOEMInfA(path, NULL, SPOST_NONE, 0, dest, 5, &size, NULL);
268     ok(res == FALSE, "Expected FALSE, got %d\n", res);
269     ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER,
270        "Expected ERROR_INSUFFICIENT_BUFFER, got %d\n", GetLastError());
271     ok(file_exists(path), "Expected source inf to exist\n");
272     ok(file_exists(dest_save), "Expected dest inf to exist\n");
273     ok(!lstrcmp(dest, "aaa"), "Expected dest to be unchanged\n");
274     ok(size == lstrlen(dest_save) + 1, "Expected size to be lstrlen(dest_save) + 1\n");
275
276     /* get the DestinationInfFileName and DestinationInfFileNameSize */
277     SetLastError(0xdeadbeef);
278     res = pSetupCopyOEMInfA(path, NULL, SPOST_NONE, 0, dest, MAX_PATH, &size, NULL);
279     ok(res == TRUE, "Expected TRUE, got %d\n", res);
280     ok(GetLastError() == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", GetLastError());
281     ok(lstrlen(dest) + 1 == size, "Expected sizes to match, got (%d, %d)\n", lstrlen(dest), size);
282     ok(file_exists(dest), "Expected destination inf to exist\n");
283     ok(check_format(dest, NULL), "Expected %%windir%%\\inf\\OEMx.inf, got %s\n", dest);
284     ok(file_exists(path), "Expected source inf to exist\n");
285     ok(size == lstrlen(dest_save) + 1, "Expected size to be lstrlen(dest_save) + 1\n");
286
287     test_original_file_name(strrchr(path, '\\') + 1, dest);
288
289     /* get the DestinationInfFileName, DestinationInfFileNameSize, and DestinationInfFileNameComponent */
290     SetLastError(0xdeadbeef);
291     res = pSetupCopyOEMInfA(path, NULL, SPOST_NONE, 0, dest, MAX_PATH, &size, &inf);
292     ok(res == TRUE, "Expected TRUE, got %d\n", res);
293     ok(GetLastError() == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", GetLastError());
294     ok(lstrlen(dest) + 1 == size, "Expected sizes to match, got (%d, %d)\n", lstrlen(dest), size);
295     ok(file_exists(dest), "Expected destination inf to exist\n");
296     ok(check_format(dest, inf), "Expected %%windir%%\\inf\\OEMx.inf, got %s\n", dest);
297     ok(file_exists(path), "Expected source inf to exist\n");
298     ok(size == lstrlen(dest_save) + 1, "Expected size to be lstrlen(dest_save) + 1\n");
299
300     /* try SP_COPY_DELETESOURCE */
301     SetLastError(0xdeadbeef);
302     res = pSetupCopyOEMInfA(path, NULL, SPOST_NONE, SP_COPY_DELETESOURCE, NULL, 0, NULL, NULL);
303     ok(res == TRUE, "Expected TRUE, got %d\n", res);
304     ok(GetLastError() == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", GetLastError());
305     ok(!file_exists(path), "Expected source inf to not exist\n");
306 }
307
308 static void create_source_file(LPSTR filename, const BYTE *data, DWORD size)
309 {
310     HANDLE handle;
311     DWORD written;
312
313     handle = CreateFileA(filename, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
314     WriteFile(handle, data, size, &written, NULL);
315     CloseHandle(handle);
316 }
317
318 static BOOL compare_file_data(LPSTR file, const BYTE *data, DWORD size)
319 {
320     DWORD read;
321     HANDLE handle;
322     BOOL ret = FALSE;
323     LPBYTE buffer;
324
325     handle = CreateFileA(file, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
326     buffer = HeapAlloc(GetProcessHeap(), 0, size);
327     if (buffer)
328     {
329         ReadFile(handle, buffer, size, &read, NULL);
330         if (read == size && !memcmp(data, buffer, size)) ret = TRUE;
331         HeapFree(GetProcessHeap(), 0, buffer);
332     }
333     CloseHandle(handle);
334     return ret;
335 }
336
337 static const BYTE uncompressed[] = {
338     'u','n','c','o','m','p','r','e','s','s','e','d','\r','\n'
339 };
340 static const BYTE comp_lzx[] = {
341     0x53, 0x5a, 0x44, 0x44, 0x88, 0xf0, 0x27, 0x33, 0x41, 0x00, 0x0e, 0x00, 0x00, 0x00, 0xff, 0x00,
342     0x00, 0x75, 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x3f, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64
343 };
344 static const BYTE comp_zip[] = {
345     0x50, 0x4b, 0x03, 0x04, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbd, 0xae, 0x81, 0x36, 0x75, 0x11,
346     0x2c, 0x1b, 0x0e, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x04, 0x00, 0x15, 0x00, 0x77, 0x69,
347     0x6e, 0x65, 0x55, 0x54, 0x09, 0x00, 0x03, 0xd6, 0x0d, 0x10, 0x46, 0xfd, 0x0d, 0x10, 0x46, 0x55,
348     0x78, 0x04, 0x00, 0xe8, 0x03, 0xe8, 0x03, 0x00, 0x00, 0x75, 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x72,
349     0x65, 0x73, 0x73, 0x65, 0x64, 0x50, 0x4b, 0x01, 0x02, 0x17, 0x03, 0x0a, 0x00, 0x00, 0x00, 0x00,
350     0x00, 0xbd, 0xae, 0x81, 0x36, 0x75, 0x11, 0x2c, 0x1b, 0x0e, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00,
351     0x00, 0x04, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x00,
352     0x00, 0x00, 0x00, 0x77, 0x69, 0x6e, 0x65, 0x55, 0x54, 0x05, 0x00, 0x03, 0xd6, 0x0d, 0x10, 0x46,
353     0x55, 0x78, 0x00, 0x00, 0x50, 0x4b, 0x05, 0x06, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00,
354     0x3f, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x00, 0x00, 0x00
355 };
356 static const BYTE comp_cab_lzx[] = {
357     0x4d, 0x53, 0x43, 0x46, 0x00, 0x00, 0x00, 0x00, 0x6b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
358     0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00,
359     0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x01, 0x00, 0x03, 0x0f, 0x0e, 0x00, 0x00, 0x00,
360     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x36, 0x86, 0x72, 0x20, 0x00, 0x77, 0x69, 0x6e, 0x65,
361     0x00, 0x19, 0xd0, 0x1a, 0xe3, 0x22, 0x00, 0x0e, 0x00, 0x5b, 0x80, 0x80, 0x8d, 0x00, 0x30, 0xe0,
362     0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x75, 0x6e, 0x63,
363     0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x0d, 0x0a
364 };
365 static const BYTE comp_cab_zip[] =  {
366     0x4d, 0x53, 0x43, 0x46, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
367     0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00,
368     0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x0e, 0x00, 0x00, 0x00,
369     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x36, 0x2f, 0xa5, 0x20, 0x00, 0x77, 0x69, 0x6e, 0x65,
370     0x00, 0x7c, 0x80, 0x26, 0x2b, 0x12, 0x00, 0x0e, 0x00, 0x43, 0x4b, 0x2b, 0xcd, 0x4b, 0xce, 0xcf,
371     0x2d, 0x28, 0x4a, 0x2d, 0x2e, 0x4e, 0x4d, 0xe1, 0xe5, 0x02, 0x00
372 };
373
374 static void test_SetupGetFileCompressionInfo(void)
375 {
376     DWORD ret, source_size, target_size;
377     char source[MAX_PATH], temp[MAX_PATH], *name;
378     UINT type;
379
380     GetTempPathA(sizeof(temp), temp);
381     GetTempFileNameA(temp, "fci", 0, source);
382
383     create_source_file(source, uncompressed, sizeof(uncompressed));
384
385     ret = SetupGetFileCompressionInfoA(NULL, NULL, NULL, NULL, NULL);
386     ok(ret == ERROR_INVALID_PARAMETER, "SetupGetFileCompressionInfo failed unexpectedly\n");
387
388     ret = SetupGetFileCompressionInfoA(source, NULL, NULL, NULL, NULL);
389     ok(ret == ERROR_INVALID_PARAMETER, "SetupGetFileCompressionInfo failed unexpectedly\n");
390
391     ret = SetupGetFileCompressionInfoA(source, &name, NULL, NULL, NULL);
392     ok(ret == ERROR_INVALID_PARAMETER, "SetupGetFileCompressionInfo failed unexpectedly\n");
393
394     ret = SetupGetFileCompressionInfoA(source, &name, &source_size, NULL, NULL);
395     ok(ret == ERROR_INVALID_PARAMETER, "SetupGetFileCompressionInfo failed unexpectedly\n");
396
397     ret = SetupGetFileCompressionInfoA(source, &name, &source_size, &target_size, NULL);
398     ok(ret == ERROR_INVALID_PARAMETER, "SetupGetFileCompressionInfo failed unexpectedly\n");
399
400     name = NULL;
401     source_size = target_size = 0;
402     type = 5;
403
404     ret = SetupGetFileCompressionInfoA(source, &name, &source_size, &target_size, &type);
405     ok(!ret, "SetupGetFileCompressionInfo failed unexpectedly\n");
406     ok(name && !lstrcmpA(name, source), "got %s, expected %s\n", name, source);
407     ok(source_size == sizeof(uncompressed), "got %d\n", source_size);
408     ok(target_size == sizeof(uncompressed), "got %d\n", target_size);
409     ok(type == FILE_COMPRESSION_NONE, "got %d, expected FILE_COMPRESSION_NONE\n", type);
410
411     MyFree(name);
412     DeleteFileA(source);
413 }
414
415 static void test_SetupGetFileCompressionInfoEx(void)
416 {
417     BOOL ret;
418     DWORD required_len, source_size, target_size;
419     char source[MAX_PATH], temp[MAX_PATH], name[MAX_PATH];
420     UINT type;
421
422     GetTempPathA(sizeof(temp), temp);
423     GetTempFileNameA(temp, "doc", 0, source);
424
425     ret = pSetupGetFileCompressionInfoExA(NULL, NULL, 0, NULL, NULL, NULL, NULL);
426     ok(!ret, "SetupGetFileCompressionInfoEx succeeded unexpectedly\n");
427
428     ret = pSetupGetFileCompressionInfoExA(source, NULL, 0, NULL, NULL, NULL, NULL);
429     ok(!ret, "SetupGetFileCompressionInfoEx succeeded unexpectedly\n");
430
431     ret = pSetupGetFileCompressionInfoExA(source, NULL, 0, &required_len, NULL, NULL, NULL);
432     ok(!ret, "SetupGetFileCompressionInfoEx succeeded unexpectedly\n");
433     ok(required_len == lstrlenA(source) + 1, "got %d, expected %d\n", required_len, lstrlenA(source) + 1);
434
435     create_source_file(source, comp_lzx, sizeof(comp_lzx));
436
437     ret = pSetupGetFileCompressionInfoExA(source, name, sizeof(name), &required_len, &source_size, &target_size, &type);
438     ok(ret, "SetupGetFileCompressionInfoEx failed unexpectedly: %d\n", ret);
439     ok(!lstrcmpA(name, source), "got %s, expected %s\n", name, source);
440     ok(required_len == lstrlenA(source) + 1, "got %d, expected %d\n", required_len, lstrlenA(source) + 1);
441     ok(source_size == sizeof(comp_lzx), "got %d\n", source_size);
442     ok(target_size == sizeof(uncompressed), "got %d\n", target_size);
443     ok(type == FILE_COMPRESSION_WINLZA, "got %d, expected FILE_COMPRESSION_WINLZA\n", type);
444     DeleteFileA(source);
445
446     create_source_file(source, comp_zip, sizeof(comp_zip));
447
448     ret = pSetupGetFileCompressionInfoExA(source, name, sizeof(name), &required_len, &source_size, &target_size, &type);
449     ok(ret, "SetupGetFileCompressionInfoEx failed unexpectedly: %d\n", ret);
450     ok(!lstrcmpA(name, source), "got %s, expected %s\n", name, source);
451     ok(required_len == lstrlenA(source) + 1, "got %d, expected %d\n", required_len, lstrlenA(source) + 1);
452     ok(source_size == sizeof(comp_zip), "got %d\n", source_size);
453     ok(target_size == sizeof(comp_zip), "got %d\n", target_size);
454     ok(type == FILE_COMPRESSION_NONE, "got %d, expected FILE_COMPRESSION_NONE\n", type);
455     DeleteFileA(source);
456
457     create_source_file(source, comp_cab_lzx, sizeof(comp_cab_lzx));
458
459     ret = pSetupGetFileCompressionInfoExA(source, name, sizeof(name), &required_len, &source_size, &target_size, &type);
460     ok(ret, "SetupGetFileCompressionInfoEx failed unexpectedly: %d\n", ret);
461     ok(!lstrcmpA(name, source), "got %s, expected %s\n", name, source);
462     ok(required_len == lstrlenA(source) + 1, "got %d, expected %d\n", required_len, lstrlenA(source) + 1);
463     ok(source_size == sizeof(comp_cab_lzx), "got %d\n", source_size);
464     ok(target_size == sizeof(uncompressed), "got %d\n", target_size);
465     ok(type == FILE_COMPRESSION_MSZIP, "got %d, expected FILE_COMPRESSION_MSZIP\n", type);
466     DeleteFileA(source);
467
468     create_source_file(source, comp_cab_zip, sizeof(comp_cab_zip));
469
470     ret = pSetupGetFileCompressionInfoExA(source, name, sizeof(name), &required_len, &source_size, &target_size, &type);
471     ok(ret, "SetupGetFileCompressionInfoEx failed unexpectedly: %d\n", ret);
472     ok(!lstrcmpA(name, source), "got %s, expected %s\n", name, source);
473     ok(required_len == lstrlenA(source) + 1, "got %d, expected %d\n", required_len, lstrlenA(source) + 1);
474     ok(source_size == sizeof(comp_cab_zip), "got %d\n", source_size);
475     ok(target_size == sizeof(uncompressed), "got %d\n", target_size);
476     ok(type == FILE_COMPRESSION_MSZIP, "got %d, expected FILE_COMPRESSION_MSZIP\n", type);
477     DeleteFileA(source);
478 }
479
480 static void test_SetupDecompressOrCopyFile(void)
481 {
482     DWORD ret;
483     char source[MAX_PATH], target[MAX_PATH], temp[MAX_PATH], *p;
484     UINT type;
485
486     GetTempPathA(sizeof(temp), temp);
487     GetTempFileNameA(temp, "doc", 0, source);
488     GetTempFileNameA(temp, "doc", 0, target);
489
490     /* parameter tests */
491
492     create_source_file(source, uncompressed, sizeof(uncompressed));
493
494     ret = SetupDecompressOrCopyFileA(NULL, NULL, NULL);
495     ok(ret == ERROR_INVALID_PARAMETER, "SetupDecompressOrCopyFile failed unexpectedly\n");
496
497     type = FILE_COMPRESSION_NONE;
498     ret = SetupDecompressOrCopyFileA(NULL, target, &type);
499     ok(ret == ERROR_INVALID_PARAMETER, "SetupDecompressOrCopyFile failed unexpectedly\n");
500
501     ret = SetupDecompressOrCopyFileA(source, NULL, &type);
502     ok(ret == ERROR_INVALID_PARAMETER, "SetupDecompressOrCopyFile failed unexpectedly\n");
503
504     type = 5; /* try an invalid compression type */
505     ret = SetupDecompressOrCopyFileA(source, target, &type);
506     ok(ret == ERROR_INVALID_PARAMETER, "SetupDecompressOrCopyFile failed unexpectedly\n");
507
508     DeleteFileA(target);
509
510     /* no compression tests */
511
512     ret = SetupDecompressOrCopyFileA(source, target, NULL);
513     ok(!ret, "SetupDecompressOrCopyFile failed unexpectedly: %d\n", ret);
514     ok(compare_file_data(target, uncompressed, sizeof(uncompressed)), "incorrect target file\n");
515
516     /* try overwriting existing file */
517     ret = SetupDecompressOrCopyFileA(source, target, NULL);
518     ok(!ret, "SetupDecompressOrCopyFile failed unexpectedly: %d\n", ret);
519     DeleteFileA(target);
520
521     type = FILE_COMPRESSION_NONE;
522     ret = SetupDecompressOrCopyFileA(source, target, &type);
523     ok(!ret, "SetupDecompressOrCopyFile failed unexpectedly: %d\n", ret);
524     ok(compare_file_data(target, uncompressed, sizeof(uncompressed)), "incorrect target file\n");
525     DeleteFileA(target);
526
527     type = FILE_COMPRESSION_WINLZA;
528     ret = SetupDecompressOrCopyFileA(source, target, &type);
529     ok(!ret, "SetupDecompressOrCopyFile failed unexpectedly: %d\n", ret);
530     ok(compare_file_data(target, uncompressed, sizeof(uncompressed)), "incorrect target file\n");
531     DeleteFileA(target);
532
533     /* lz compression tests */
534
535     create_source_file(source, comp_lzx, sizeof(comp_lzx));
536
537     ret = SetupDecompressOrCopyFileA(source, target, NULL);
538     ok(!ret, "SetupDecompressOrCopyFile failed unexpectedly: %d\n", ret);
539     DeleteFileA(target);
540
541     /* zip compression tests */
542
543     create_source_file(source, comp_zip, sizeof(comp_zip));
544
545     ret = SetupDecompressOrCopyFileA(source, target, NULL);
546     ok(!ret, "SetupDecompressOrCopyFile failed unexpectedly: %d\n", ret);
547     ok(compare_file_data(target, comp_zip, sizeof(comp_zip)), "incorrect target file\n");
548     DeleteFileA(target);
549
550     /* cabinet compression tests */
551
552     create_source_file(source, comp_cab_zip, sizeof(comp_cab_zip));
553
554     p = strrchr(target, '\\');
555     lstrcpyA(p + 1, "wine");
556
557     ret = SetupDecompressOrCopyFileA(source, target, NULL);
558     ok(!ret, "SetupDecompressOrCopyFile failed unexpectedly: %d\n", ret);
559     ok(compare_file_data(target, uncompressed, sizeof(uncompressed)), "incorrect target file\n");
560
561     /* try overwriting existing file */
562     ret = SetupDecompressOrCopyFileA(source, target, NULL);
563     ok(!ret, "SetupDecompressOrCopyFile failed unexpectedly: %d\n", ret);
564
565     /* try zip compression */
566     type = FILE_COMPRESSION_MSZIP;
567     ret = SetupDecompressOrCopyFileA(source, target, &type);
568     ok(!ret, "SetupDecompressOrCopyFile failed unexpectedly: %d\n", ret);
569     ok(compare_file_data(target, uncompressed, sizeof(uncompressed)), "incorrect target file\n");
570
571     /* try no compression */
572     type = FILE_COMPRESSION_NONE;
573     ret = SetupDecompressOrCopyFileA(source, target, &type);
574     ok(!ret, "SetupDecompressOrCopyFile failed unexpectedly: %d\n", ret);
575     ok(compare_file_data(target, comp_cab_zip, sizeof(comp_cab_zip)), "incorrect target file\n");
576
577     DeleteFileA(target);
578     DeleteFileA(source);
579 }
580
581 START_TEST(misc)
582 {
583     HMODULE hsetupapi = GetModuleHandle("setupapi.dll");
584
585     pSetupGetFileCompressionInfoExA = (void*)GetProcAddress(hsetupapi, "SetupGetFileCompressionInfoExA");
586     pSetupCopyOEMInfA = (void*)GetProcAddress(hsetupapi, "SetupCopyOEMInfA");
587     pSetupQueryInfOriginalFileInformationA = (void*)GetProcAddress(hsetupapi, "SetupQueryInfOriginalFileInformationA");
588
589     GetCurrentDirectoryA(MAX_PATH, CURR_DIR);
590
591     if (pSetupCopyOEMInfA)
592         test_SetupCopyOEMInf();
593     else
594         skip("SetupCopyOEMInfA is not available\n");
595
596     test_SetupGetFileCompressionInfo();
597
598     if (pSetupGetFileCompressionInfoExA)
599         test_SetupGetFileCompressionInfoEx();
600     else
601         skip("SetupGetFileCompressionInfoExA is not available\n");
602
603     test_SetupDecompressOrCopyFile();
604 }