push a68a33e62d41ba03b0e27371e671eaa1e09ebd44
[wine/hacks.git] / dlls / setupapi / tests / misc.c
bloba18fd37a242a38fccb5b742faf8990dbb8b1e1da
1 /*
2 * Miscellaneous tests
4 * Copyright 2007 James Hawkins
5 * Copyright 2007 Hans Leidekker
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.
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.
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
22 #include <stdarg.h>
23 #include <stdio.h>
24 #include <string.h>
26 #include "windef.h"
27 #include "winbase.h"
28 #include "winnls.h"
29 #include "winuser.h"
30 #include "winreg.h"
31 #include "setupapi.h"
33 #include "wine/test.h"
35 static CHAR CURR_DIR[MAX_PATH];
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
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);
50 static void append_str(char **str, const char *data)
52 sprintf(*str, data);
53 *str += strlen(*str);
56 static void create_inf_file(LPCSTR filename)
58 char data[1024];
59 char *ptr = data;
60 DWORD dwNumberOfBytesWritten;
61 HANDLE hf = CreateFile(filename, GENERIC_WRITE, 0, NULL,
62 CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
64 append_str(&ptr, "[Version]\n");
65 append_str(&ptr, "Signature=\"$Chicago$\"\n");
66 append_str(&ptr, "AdvancedINF=2.5\n");
67 append_str(&ptr, "[DefaultInstall]\n");
68 append_str(&ptr, "RegisterOCXs=RegisterOCXsSection\n");
69 append_str(&ptr, "[RegisterOCXsSection]\n");
70 append_str(&ptr, "%%11%%\\ole32.dll\n");
72 WriteFile(hf, data, ptr - data, &dwNumberOfBytesWritten, NULL);
73 CloseHandle(hf);
76 static void get_temp_filename(LPSTR path)
78 CHAR temp[MAX_PATH];
79 LPSTR ptr;
81 GetTempFileName(CURR_DIR, "set", 0, temp);
82 ptr = strrchr(temp, '\\');
84 lstrcpy(path, ptr + 1);
87 static BOOL file_exists(LPSTR path)
89 return GetFileAttributes(path) != INVALID_FILE_ATTRIBUTES;
92 static BOOL check_format(LPSTR path, LPSTR inf)
94 CHAR check[MAX_PATH];
95 BOOL res;
97 static const CHAR format[] = "\\INF\\oem";
99 GetWindowsDirectory(check, MAX_PATH);
100 lstrcat(check, format);
101 res = CompareString(LOCALE_SYSTEM_DEFAULT, NORM_IGNORECASE, check, -1, path, lstrlen(check)) == CSTR_EQUAL &&
102 path[lstrlen(check)] != '\\';
104 return (!inf) ? res : res && (inf == path + lstrlen(check) - 3);
107 static void test_original_file_name(LPCSTR original, LPCSTR dest)
109 HINF hinf;
110 PSP_INF_INFORMATION pspii;
111 SP_ORIGINAL_FILE_INFO spofi;
112 BOOL res;
113 DWORD size;
115 if (!pSetupQueryInfOriginalFileInformationA)
117 skip("SetupQueryInfOriginalFileInformationA is not available\n");
118 return;
121 hinf = SetupOpenInfFileA(dest, NULL, INF_STYLE_WIN4, NULL);
122 ok(hinf != NULL, "SetupOpenInfFileA failed with error %d\n", GetLastError());
124 res = SetupGetInfInformation(hinf, INFINFO_INF_SPEC_IS_HINF, NULL, 0, &size);
125 ok(res, "SetupGetInfInformation failed with error %d\n", GetLastError());
127 pspii = HeapAlloc(GetProcessHeap(), 0, size);
129 res = SetupGetInfInformation(hinf, INFINFO_INF_SPEC_IS_HINF, pspii, size, NULL);
130 ok(res, "SetupGetInfInformation failed with error %d\n", GetLastError());
132 spofi.cbSize = 0;
133 res = pSetupQueryInfOriginalFileInformationA(pspii, 0, NULL, &spofi);
134 ok(!res && GetLastError() == ERROR_INVALID_USER_BUFFER,
135 "SetupQueryInfOriginalFileInformationA should have failed with ERROR_INVALID_USER_BUFFER instead of %d\n", GetLastError());
137 spofi.cbSize = sizeof(spofi);
138 res = pSetupQueryInfOriginalFileInformationA(pspii, 0, NULL, &spofi);
139 ok(res, "SetupQueryInfOriginalFileInformationA failed with error %d\n", GetLastError());
140 ok(!spofi.OriginalCatalogName[0], "spofi.OriginalCatalogName should have been \"\" instead of \"%s\"\n", spofi.OriginalCatalogName);
141 todo_wine
142 ok(!strcmp(original, spofi.OriginalInfName), "spofi.OriginalInfName of %s didn't match real original name %s\n", spofi.OriginalInfName, original);
144 HeapFree(GetProcessHeap(), 0, pspii);
146 SetupCloseInfFile(hinf);
149 static void test_SetupCopyOEMInf(void)
151 CHAR toolong[MAX_PATH * 2];
152 CHAR path[MAX_PATH], dest[MAX_PATH];
153 CHAR tmpfile[MAX_PATH], dest_save[MAX_PATH];
154 LPSTR inf;
155 DWORD size;
156 BOOL res;
158 /* try NULL SourceInfFileName */
159 SetLastError(0xdeadbeef);
160 res = pSetupCopyOEMInfA(NULL, NULL, 0, SP_COPY_NOOVERWRITE, NULL, 0, NULL, NULL);
161 ok(res == FALSE, "Expected FALSE, got %d\n", res);
162 ok(GetLastError() == ERROR_INVALID_PARAMETER,
163 "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
165 /* try empty SourceInfFileName */
166 SetLastError(0xdeadbeef);
167 res = pSetupCopyOEMInfA("", NULL, 0, SP_COPY_NOOVERWRITE, NULL, 0, NULL, NULL);
168 ok(res == FALSE, "Expected FALSE, got %d\n", res);
169 ok(GetLastError() == ERROR_FILE_NOT_FOUND,
170 "Expected ERROR_FILE_NOT_FOUND, got %d\n", GetLastError());
172 /* try a relative nonexistent SourceInfFileName */
173 SetLastError(0xdeadbeef);
174 res = pSetupCopyOEMInfA("nonexistent", NULL, 0, SP_COPY_NOOVERWRITE, NULL, 0, NULL, NULL);
175 ok(res == FALSE, "Expected FALSE, got %d\n", res);
176 ok(GetLastError() == ERROR_FILE_NOT_FOUND,
177 "Expected ERROR_FILE_NOT_FOUND, got %d\n", GetLastError());
179 /* try an absolute nonexistent SourceInfFileName */
180 lstrcpy(path, CURR_DIR);
181 lstrcat(path, "\\nonexistent");
182 SetLastError(0xdeadbeef);
183 res = pSetupCopyOEMInfA(path, NULL, 0, SP_COPY_NOOVERWRITE, NULL, 0, NULL, NULL);
184 ok(res == FALSE, "Expected FALSE, got %d\n", res);
185 ok(GetLastError() == ERROR_FILE_NOT_FOUND,
186 "Expected ERROR_FILE_NOT_FOUND, got %d\n", GetLastError());
188 /* try a long SourceInfFileName */
189 memset(toolong, 'a', MAX_PATH * 2);
190 toolong[MAX_PATH * 2 - 1] = '\0';
191 SetLastError(0xdeadbeef);
192 res = pSetupCopyOEMInfA(toolong, NULL, 0, SP_COPY_NOOVERWRITE, NULL, 0, NULL, NULL);
193 ok(res == FALSE, "Expected FALSE, got %d\n", res);
194 ok(GetLastError() == ERROR_FILE_NOT_FOUND,
195 "Expected ERROR_FILE_NOT_FOUND, got %d\n", GetLastError());
197 get_temp_filename(tmpfile);
198 create_inf_file(tmpfile);
200 /* try a relative SourceInfFileName */
201 SetLastError(0xdeadbeef);
202 res = pSetupCopyOEMInfA(tmpfile, NULL, 0, SP_COPY_NOOVERWRITE, NULL, 0, NULL, NULL);
203 ok(res == FALSE, "Expected FALSE, got %d\n", res);
204 ok(GetLastError() == ERROR_FILE_NOT_FOUND,
205 "Expected ERROR_FILE_NOT_FOUND, got %d\n", GetLastError());
206 ok(file_exists(tmpfile), "Expected tmpfile to exist\n");
208 /* try SP_COPY_REPLACEONLY, dest does not exist */
209 SetLastError(0xdeadbeef);
210 res = pSetupCopyOEMInfA(path, NULL, SPOST_NONE, SP_COPY_REPLACEONLY, NULL, 0, NULL, NULL);
211 ok(res == FALSE, "Expected FALSE, got %d\n", res);
212 ok(GetLastError() == ERROR_FILE_NOT_FOUND,
213 "Expected ERROR_FILE_NOT_FOUND, got %d\n", GetLastError());
214 ok(file_exists(tmpfile), "Expected source inf to exist\n");
216 /* try an absolute SourceInfFileName, without DestinationInfFileName */
217 lstrcpy(path, CURR_DIR);
218 lstrcat(path, "\\");
219 lstrcat(path, tmpfile);
220 SetLastError(0xdeadbeef);
221 res = pSetupCopyOEMInfA(path, NULL, SPOST_NONE, 0, NULL, 0, NULL, NULL);
222 ok(res == TRUE, "Expected TRUE, got %d\n", res);
223 ok(GetLastError() == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", GetLastError());
224 ok(file_exists(path), "Expected source inf to exist\n");
226 /* try SP_COPY_REPLACEONLY, dest exists */
227 SetLastError(0xdeadbeef);
228 res = pSetupCopyOEMInfA(path, NULL, SPOST_NONE, SP_COPY_REPLACEONLY, NULL, 0, NULL, NULL);
229 ok(res == TRUE, "Expected TRUE, got %d\n", res);
230 ok(GetLastError() == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", GetLastError());
231 ok(file_exists(path), "Expected source inf to exist\n");
233 /* try SP_COPY_NOOVERWRITE */
234 SetLastError(0xdeadbeef);
235 res = pSetupCopyOEMInfA(path, NULL, SPOST_NONE, SP_COPY_NOOVERWRITE, NULL, 0, NULL, NULL);
236 ok(res == FALSE, "Expected FALSE, got %d\n", res);
237 ok(GetLastError() == ERROR_FILE_EXISTS,
238 "Expected ERROR_FILE_EXISTS, got %d\n", GetLastError());
240 /* get the DestinationInfFileName */
241 SetLastError(0xdeadbeef);
242 res = pSetupCopyOEMInfA(path, NULL, SPOST_NONE, 0, dest, MAX_PATH, NULL, NULL);
243 ok(res == TRUE, "Expected TRUE, got %d\n", res);
244 ok(GetLastError() == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", GetLastError());
245 ok(lstrlen(dest) != 0, "Expected a non-zero length string\n");
246 ok(file_exists(dest), "Expected destination inf to exist\n");
247 ok(check_format(dest, NULL), "Expected %%windir%%\\inf\\OEMx.inf, got %s\n", dest);
248 ok(file_exists(path), "Expected source inf to exist\n");
250 lstrcpy(dest_save, dest);
251 DeleteFile(dest_save);
253 /* get the DestinationInfFileName, DestinationInfFileNameSize is too small
254 * - inf is still copied
256 lstrcpy(dest, "aaa");
257 size = 0;
258 SetLastError(0xdeadbeef);
259 res = pSetupCopyOEMInfA(path, NULL, SPOST_NONE, 0, dest, 5, &size, NULL);
260 ok(res == FALSE, "Expected FALSE, got %d\n", res);
261 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER,
262 "Expected ERROR_INSUFFICIENT_BUFFER, got %d\n", GetLastError());
263 ok(file_exists(path), "Expected source inf to exist\n");
264 ok(file_exists(dest_save), "Expected dest inf to exist\n");
265 ok(!lstrcmp(dest, "aaa"), "Expected dest to be unchanged\n");
266 ok(size == lstrlen(dest_save) + 1, "Expected size to be lstrlen(dest_save) + 1\n");
268 /* get the DestinationInfFileName and DestinationInfFileNameSize */
269 SetLastError(0xdeadbeef);
270 res = pSetupCopyOEMInfA(path, NULL, SPOST_NONE, 0, dest, MAX_PATH, &size, NULL);
271 ok(res == TRUE, "Expected TRUE, got %d\n", res);
272 ok(GetLastError() == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", GetLastError());
273 ok(lstrlen(dest) + 1 == size, "Expected sizes to match, got (%d, %d)\n", lstrlen(dest), size);
274 ok(file_exists(dest), "Expected destination inf to exist\n");
275 ok(check_format(dest, NULL), "Expected %%windir%%\\inf\\OEMx.inf, got %s\n", dest);
276 ok(file_exists(path), "Expected source inf to exist\n");
277 ok(size == lstrlen(dest_save) + 1, "Expected size to be lstrlen(dest_save) + 1\n");
279 test_original_file_name(strrchr(path, '\\') + 1, dest);
281 /* get the DestinationInfFileName, DestinationInfFileNameSize, and DestinationInfFileNameComponent */
282 SetLastError(0xdeadbeef);
283 res = pSetupCopyOEMInfA(path, NULL, SPOST_NONE, 0, dest, MAX_PATH, &size, &inf);
284 ok(res == TRUE, "Expected TRUE, got %d\n", res);
285 ok(GetLastError() == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", GetLastError());
286 ok(lstrlen(dest) + 1 == size, "Expected sizes to match, got (%d, %d)\n", lstrlen(dest), size);
287 ok(file_exists(dest), "Expected destination inf to exist\n");
288 ok(check_format(dest, inf), "Expected %%windir%%\\inf\\OEMx.inf, got %s\n", dest);
289 ok(file_exists(path), "Expected source inf to exist\n");
290 ok(size == lstrlen(dest_save) + 1, "Expected size to be lstrlen(dest_save) + 1\n");
292 /* try SP_COPY_DELETESOURCE */
293 SetLastError(0xdeadbeef);
294 res = pSetupCopyOEMInfA(path, NULL, SPOST_NONE, SP_COPY_DELETESOURCE, NULL, 0, NULL, NULL);
295 ok(res == TRUE, "Expected TRUE, got %d\n", res);
296 ok(GetLastError() == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", GetLastError());
297 ok(!file_exists(path), "Expected source inf to not exist\n");
300 static void create_source_file(LPSTR filename, const BYTE *data, DWORD size)
302 HANDLE handle;
303 DWORD written;
305 handle = CreateFileA(filename, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
306 WriteFile(handle, data, size, &written, NULL);
307 CloseHandle(handle);
310 static BOOL compare_file_data(LPSTR file, const BYTE *data, DWORD size)
312 DWORD read;
313 HANDLE handle;
314 BOOL ret = FALSE;
315 LPBYTE buffer;
317 handle = CreateFileA(file, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
318 buffer = HeapAlloc(GetProcessHeap(), 0, size);
319 if (buffer)
321 ReadFile(handle, buffer, size, &read, NULL);
322 if (read == size && !memcmp(data, buffer, size)) ret = TRUE;
323 HeapFree(GetProcessHeap(), 0, buffer);
325 CloseHandle(handle);
326 return ret;
329 static const BYTE uncompressed[] = {
330 'u','n','c','o','m','p','r','e','s','s','e','d','\r','\n'
332 static const BYTE comp_lzx[] = {
333 0x53, 0x5a, 0x44, 0x44, 0x88, 0xf0, 0x27, 0x33, 0x41, 0x00, 0x0e, 0x00, 0x00, 0x00, 0xff, 0x00,
334 0x00, 0x75, 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x3f, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64
336 static const BYTE comp_zip[] = {
337 0x50, 0x4b, 0x03, 0x04, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbd, 0xae, 0x81, 0x36, 0x75, 0x11,
338 0x2c, 0x1b, 0x0e, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x04, 0x00, 0x15, 0x00, 0x77, 0x69,
339 0x6e, 0x65, 0x55, 0x54, 0x09, 0x00, 0x03, 0xd6, 0x0d, 0x10, 0x46, 0xfd, 0x0d, 0x10, 0x46, 0x55,
340 0x78, 0x04, 0x00, 0xe8, 0x03, 0xe8, 0x03, 0x00, 0x00, 0x75, 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x72,
341 0x65, 0x73, 0x73, 0x65, 0x64, 0x50, 0x4b, 0x01, 0x02, 0x17, 0x03, 0x0a, 0x00, 0x00, 0x00, 0x00,
342 0x00, 0xbd, 0xae, 0x81, 0x36, 0x75, 0x11, 0x2c, 0x1b, 0x0e, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00,
343 0x00, 0x04, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x00,
344 0x00, 0x00, 0x00, 0x77, 0x69, 0x6e, 0x65, 0x55, 0x54, 0x05, 0x00, 0x03, 0xd6, 0x0d, 0x10, 0x46,
345 0x55, 0x78, 0x00, 0x00, 0x50, 0x4b, 0x05, 0x06, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00,
346 0x3f, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x00, 0x00, 0x00
348 static const BYTE comp_cab_lzx[] = {
349 0x4d, 0x53, 0x43, 0x46, 0x00, 0x00, 0x00, 0x00, 0x6b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
350 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00,
351 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x01, 0x00, 0x03, 0x0f, 0x0e, 0x00, 0x00, 0x00,
352 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x36, 0x86, 0x72, 0x20, 0x00, 0x77, 0x69, 0x6e, 0x65,
353 0x00, 0x19, 0xd0, 0x1a, 0xe3, 0x22, 0x00, 0x0e, 0x00, 0x5b, 0x80, 0x80, 0x8d, 0x00, 0x30, 0xe0,
354 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x75, 0x6e, 0x63,
355 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x0d, 0x0a
357 static const BYTE comp_cab_zip[] = {
358 0x4d, 0x53, 0x43, 0x46, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
359 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00,
360 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x0e, 0x00, 0x00, 0x00,
361 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x36, 0x2f, 0xa5, 0x20, 0x00, 0x77, 0x69, 0x6e, 0x65,
362 0x00, 0x7c, 0x80, 0x26, 0x2b, 0x12, 0x00, 0x0e, 0x00, 0x43, 0x4b, 0x2b, 0xcd, 0x4b, 0xce, 0xcf,
363 0x2d, 0x28, 0x4a, 0x2d, 0x2e, 0x4e, 0x4d, 0xe1, 0xe5, 0x02, 0x00
366 static void test_SetupGetFileCompressionInfo(void)
368 DWORD ret, source_size, target_size;
369 char source[MAX_PATH], temp[MAX_PATH], *name;
370 UINT type;
372 GetTempPathA(sizeof(temp), temp);
373 GetTempFileNameA(temp, "fci", 0, source);
375 create_source_file(source, uncompressed, sizeof(uncompressed));
377 ret = SetupGetFileCompressionInfoA(NULL, NULL, NULL, NULL, NULL);
378 ok(ret == ERROR_INVALID_PARAMETER, "SetupGetFileCompressionInfo failed unexpectedly\n");
380 ret = SetupGetFileCompressionInfoA(source, NULL, NULL, NULL, NULL);
381 ok(ret == ERROR_INVALID_PARAMETER, "SetupGetFileCompressionInfo failed unexpectedly\n");
383 ret = SetupGetFileCompressionInfoA(source, &name, NULL, NULL, NULL);
384 ok(ret == ERROR_INVALID_PARAMETER, "SetupGetFileCompressionInfo failed unexpectedly\n");
386 ret = SetupGetFileCompressionInfoA(source, &name, &source_size, NULL, NULL);
387 ok(ret == ERROR_INVALID_PARAMETER, "SetupGetFileCompressionInfo failed unexpectedly\n");
389 ret = SetupGetFileCompressionInfoA(source, &name, &source_size, &target_size, NULL);
390 ok(ret == ERROR_INVALID_PARAMETER, "SetupGetFileCompressionInfo failed unexpectedly\n");
392 name = NULL;
393 source_size = target_size = 0;
394 type = 5;
396 ret = SetupGetFileCompressionInfoA(source, &name, &source_size, &target_size, &type);
397 ok(!ret, "SetupGetFileCompressionInfo failed unexpectedly\n");
398 ok(name && !lstrcmpA(name, source), "got %s, expected %s\n", name, source);
399 ok(source_size == sizeof(uncompressed), "got %d\n", source_size);
400 ok(target_size == sizeof(uncompressed), "got %d\n", target_size);
401 ok(type == FILE_COMPRESSION_NONE, "got %d, expected FILE_COMPRESSION_NONE\n", type);
403 MyFree(name);
404 DeleteFileA(source);
407 static void test_SetupGetFileCompressionInfoEx(void)
409 BOOL ret;
410 DWORD required_len, source_size, target_size;
411 char source[MAX_PATH], temp[MAX_PATH], name[MAX_PATH];
412 UINT type;
414 GetTempPathA(sizeof(temp), temp);
415 GetTempFileNameA(temp, "doc", 0, source);
417 ret = pSetupGetFileCompressionInfoExA(NULL, NULL, 0, NULL, NULL, NULL, NULL);
418 ok(!ret, "SetupGetFileCompressionInfoEx succeeded unexpectedly\n");
420 ret = pSetupGetFileCompressionInfoExA(source, NULL, 0, NULL, NULL, NULL, NULL);
421 ok(!ret, "SetupGetFileCompressionInfoEx succeeded unexpectedly\n");
423 ret = pSetupGetFileCompressionInfoExA(source, NULL, 0, &required_len, NULL, NULL, NULL);
424 ok(!ret, "SetupGetFileCompressionInfoEx succeeded unexpectedly\n");
425 ok(required_len == lstrlenA(source) + 1, "got %d, expected %d\n", required_len, lstrlenA(source) + 1);
427 create_source_file(source, comp_lzx, sizeof(comp_lzx));
429 ret = pSetupGetFileCompressionInfoExA(source, name, sizeof(name), &required_len, &source_size, &target_size, &type);
430 ok(ret, "SetupGetFileCompressionInfoEx failed unexpectedly: %d\n", ret);
431 ok(!lstrcmpA(name, source), "got %s, expected %s\n", name, source);
432 ok(required_len == lstrlenA(source) + 1, "got %d, expected %d\n", required_len, lstrlenA(source) + 1);
433 ok(source_size == sizeof(comp_lzx), "got %d\n", source_size);
434 ok(target_size == sizeof(uncompressed), "got %d\n", target_size);
435 ok(type == FILE_COMPRESSION_WINLZA, "got %d, expected FILE_COMPRESSION_WINLZA\n", type);
436 DeleteFileA(source);
438 create_source_file(source, comp_zip, sizeof(comp_zip));
440 ret = pSetupGetFileCompressionInfoExA(source, name, sizeof(name), &required_len, &source_size, &target_size, &type);
441 ok(ret, "SetupGetFileCompressionInfoEx failed unexpectedly: %d\n", ret);
442 ok(!lstrcmpA(name, source), "got %s, expected %s\n", name, source);
443 ok(required_len == lstrlenA(source) + 1, "got %d, expected %d\n", required_len, lstrlenA(source) + 1);
444 ok(source_size == sizeof(comp_zip), "got %d\n", source_size);
445 ok(target_size == sizeof(comp_zip), "got %d\n", target_size);
446 ok(type == FILE_COMPRESSION_NONE, "got %d, expected FILE_COMPRESSION_NONE\n", type);
447 DeleteFileA(source);
449 create_source_file(source, comp_cab_lzx, sizeof(comp_cab_lzx));
451 ret = pSetupGetFileCompressionInfoExA(source, name, sizeof(name), &required_len, &source_size, &target_size, &type);
452 ok(ret, "SetupGetFileCompressionInfoEx failed unexpectedly: %d\n", ret);
453 ok(!lstrcmpA(name, source), "got %s, expected %s\n", name, source);
454 ok(required_len == lstrlenA(source) + 1, "got %d, expected %d\n", required_len, lstrlenA(source) + 1);
455 ok(source_size == sizeof(comp_cab_lzx), "got %d\n", source_size);
456 ok(target_size == sizeof(uncompressed), "got %d\n", target_size);
457 ok(type == FILE_COMPRESSION_MSZIP, "got %d, expected FILE_COMPRESSION_MSZIP\n", type);
458 DeleteFileA(source);
460 create_source_file(source, comp_cab_zip, sizeof(comp_cab_zip));
462 ret = pSetupGetFileCompressionInfoExA(source, name, sizeof(name), &required_len, &source_size, &target_size, &type);
463 ok(ret, "SetupGetFileCompressionInfoEx failed unexpectedly: %d\n", ret);
464 ok(!lstrcmpA(name, source), "got %s, expected %s\n", name, source);
465 ok(required_len == lstrlenA(source) + 1, "got %d, expected %d\n", required_len, lstrlenA(source) + 1);
466 ok(source_size == sizeof(comp_cab_zip), "got %d\n", source_size);
467 ok(target_size == sizeof(uncompressed), "got %d\n", target_size);
468 ok(type == FILE_COMPRESSION_MSZIP, "got %d, expected FILE_COMPRESSION_MSZIP\n", type);
469 DeleteFileA(source);
472 static void test_SetupDecompressOrCopyFile(void)
474 DWORD ret;
475 char source[MAX_PATH], target[MAX_PATH], temp[MAX_PATH], *p;
476 UINT type;
478 GetTempPathA(sizeof(temp), temp);
479 GetTempFileNameA(temp, "doc", 0, source);
480 GetTempFileNameA(temp, "doc", 0, target);
482 /* parameter tests */
484 create_source_file(source, uncompressed, sizeof(uncompressed));
486 ret = SetupDecompressOrCopyFileA(NULL, NULL, NULL);
487 ok(ret == ERROR_INVALID_PARAMETER, "SetupDecompressOrCopyFile failed unexpectedly\n");
489 type = FILE_COMPRESSION_NONE;
490 ret = SetupDecompressOrCopyFileA(NULL, target, &type);
491 ok(ret == ERROR_INVALID_PARAMETER, "SetupDecompressOrCopyFile failed unexpectedly\n");
493 ret = SetupDecompressOrCopyFileA(source, NULL, &type);
494 ok(ret == ERROR_INVALID_PARAMETER, "SetupDecompressOrCopyFile failed unexpectedly\n");
496 type = 5; /* try an invalid compression type */
497 ret = SetupDecompressOrCopyFileA(source, target, &type);
498 ok(ret == ERROR_INVALID_PARAMETER, "SetupDecompressOrCopyFile failed unexpectedly\n");
500 DeleteFileA(target);
502 /* no compression tests */
504 ret = SetupDecompressOrCopyFileA(source, target, NULL);
505 ok(!ret, "SetupDecompressOrCopyFile failed unexpectedly: %d\n", ret);
506 ok(compare_file_data(target, uncompressed, sizeof(uncompressed)), "incorrect target file\n");
508 /* try overwriting existing file */
509 ret = SetupDecompressOrCopyFileA(source, target, NULL);
510 ok(!ret, "SetupDecompressOrCopyFile failed unexpectedly: %d\n", ret);
511 DeleteFileA(target);
513 type = FILE_COMPRESSION_NONE;
514 ret = SetupDecompressOrCopyFileA(source, target, &type);
515 ok(!ret, "SetupDecompressOrCopyFile failed unexpectedly: %d\n", ret);
516 ok(compare_file_data(target, uncompressed, sizeof(uncompressed)), "incorrect target file\n");
517 DeleteFileA(target);
519 type = FILE_COMPRESSION_WINLZA;
520 ret = SetupDecompressOrCopyFileA(source, target, &type);
521 ok(!ret, "SetupDecompressOrCopyFile failed unexpectedly: %d\n", ret);
522 ok(compare_file_data(target, uncompressed, sizeof(uncompressed)), "incorrect target file\n");
523 DeleteFileA(target);
525 /* lz compression tests */
527 create_source_file(source, comp_lzx, sizeof(comp_lzx));
529 ret = SetupDecompressOrCopyFileA(source, target, NULL);
530 ok(!ret, "SetupDecompressOrCopyFile failed unexpectedly: %d\n", ret);
531 DeleteFileA(target);
533 /* zip compression tests */
535 create_source_file(source, comp_zip, sizeof(comp_zip));
537 ret = SetupDecompressOrCopyFileA(source, target, NULL);
538 ok(!ret, "SetupDecompressOrCopyFile failed unexpectedly: %d\n", ret);
539 ok(compare_file_data(target, comp_zip, sizeof(comp_zip)), "incorrect target file\n");
540 DeleteFileA(target);
542 /* cabinet compression tests */
544 create_source_file(source, comp_cab_zip, sizeof(comp_cab_zip));
546 p = strrchr(target, '\\');
547 lstrcpyA(p + 1, "wine");
549 ret = SetupDecompressOrCopyFileA(source, target, NULL);
550 ok(!ret, "SetupDecompressOrCopyFile failed unexpectedly: %d\n", ret);
551 ok(compare_file_data(target, uncompressed, sizeof(uncompressed)), "incorrect target file\n");
553 /* try overwriting existing file */
554 ret = SetupDecompressOrCopyFileA(source, target, NULL);
555 ok(!ret, "SetupDecompressOrCopyFile failed unexpectedly: %d\n", ret);
557 /* try zip compression */
558 type = FILE_COMPRESSION_MSZIP;
559 ret = SetupDecompressOrCopyFileA(source, target, &type);
560 ok(!ret, "SetupDecompressOrCopyFile failed unexpectedly: %d\n", ret);
561 ok(compare_file_data(target, uncompressed, sizeof(uncompressed)), "incorrect target file\n");
563 /* try no compression */
564 type = FILE_COMPRESSION_NONE;
565 ret = SetupDecompressOrCopyFileA(source, target, &type);
566 ok(!ret, "SetupDecompressOrCopyFile failed unexpectedly: %d\n", ret);
567 ok(compare_file_data(target, comp_cab_zip, sizeof(comp_cab_zip)), "incorrect target file\n");
569 DeleteFileA(target);
570 DeleteFileA(source);
573 START_TEST(misc)
575 HMODULE hsetupapi = GetModuleHandle("setupapi.dll");
577 pSetupGetFileCompressionInfoExA = (void*)GetProcAddress(hsetupapi, "SetupGetFileCompressionInfoExA");
578 pSetupCopyOEMInfA = (void*)GetProcAddress(hsetupapi, "SetupCopyOEMInfA");
579 pSetupQueryInfOriginalFileInformationA = (void*)GetProcAddress(hsetupapi, "SetupQueryInfOriginalFileInformationA");
581 GetCurrentDirectoryA(MAX_PATH, CURR_DIR);
583 if (pSetupCopyOEMInfA)
584 test_SetupCopyOEMInf();
585 else
586 skip("SetupCopyOEMInfA is not available\n");
588 test_SetupGetFileCompressionInfo();
590 if (pSetupGetFileCompressionInfoExA)
591 test_SetupGetFileCompressionInfoEx();
592 else
593 skip("SetupGetFileCompressionInfoExA is not available\n");
595 test_SetupDecompressOrCopyFile();