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
33 #include "wine/test.h"
35 static CHAR CURR_DIR[MAX_PATH];
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
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)
56 static void create_inf_file(LPCSTR filename)
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);
76 static void get_temp_filename(LPSTR path)
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)
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)
110 PSP_INF_INFORMATION pspii;
111 SP_ORIGINAL_FILE_INFO spofi;
115 if (!pSetupQueryInfOriginalFileInformationA)
117 skip("SetupQueryInfOriginalFileInformationA is not available\n");
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());
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);
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];
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 GetLastError() == ERROR_BAD_PATHNAME, /* Win98 */
171 "Expected ERROR_FILE_NOT_FOUND or ERROR_BAD_PATHNAME, got %d\n", GetLastError());
173 /* try a relative nonexistent SourceInfFileName */
174 SetLastError(0xdeadbeef);
175 res = pSetupCopyOEMInfA("nonexistent", NULL, 0, SP_COPY_NOOVERWRITE, NULL, 0, NULL, NULL);
176 ok(res == FALSE, "Expected FALSE, got %d\n", res);
177 ok(GetLastError() == ERROR_FILE_NOT_FOUND,
178 "Expected ERROR_FILE_NOT_FOUND, got %d\n", GetLastError());
180 /* try an absolute nonexistent SourceInfFileName */
181 lstrcpy(path, CURR_DIR);
182 lstrcat(path, "\\nonexistent");
183 SetLastError(0xdeadbeef);
184 res = pSetupCopyOEMInfA(path, NULL, 0, SP_COPY_NOOVERWRITE, NULL, 0, NULL, NULL);
185 ok(res == FALSE, "Expected FALSE, got %d\n", res);
186 ok(GetLastError() == ERROR_FILE_NOT_FOUND,
187 "Expected ERROR_FILE_NOT_FOUND, got %d\n", GetLastError());
189 /* try a long SourceInfFileName */
190 memset(toolong, 'a', MAX_PATH * 2);
191 toolong[MAX_PATH * 2 - 1] = '\0';
192 SetLastError(0xdeadbeef);
193 res = pSetupCopyOEMInfA(toolong, NULL, 0, SP_COPY_NOOVERWRITE, NULL, 0, NULL, NULL);
194 ok(res == FALSE, "Expected FALSE, got %d\n", res);
195 ok(GetLastError() == ERROR_FILE_NOT_FOUND ||
196 GetLastError() == ERROR_FILENAME_EXCED_RANGE, /* Win98 */
197 "Expected ERROR_FILE_NOT_FOUND or ERROR_FILENAME_EXCED_RANGE, got %d\n", GetLastError());
199 get_temp_filename(tmpfile);
200 create_inf_file(tmpfile);
202 /* try a relative SourceInfFileName */
203 SetLastError(0xdeadbeef);
204 res = pSetupCopyOEMInfA(tmpfile, NULL, 0, SP_COPY_NOOVERWRITE, NULL, 0, NULL, NULL);
205 ok(res == FALSE, "Expected FALSE, got %d\n", res);
206 ok(GetLastError() == ERROR_FILE_NOT_FOUND,
207 "Expected ERROR_FILE_NOT_FOUND, got %d\n", GetLastError());
208 ok(file_exists(tmpfile), "Expected tmpfile to exist\n");
210 /* try SP_COPY_REPLACEONLY, dest does not exist */
211 SetLastError(0xdeadbeef);
212 res = pSetupCopyOEMInfA(path, NULL, SPOST_NONE, SP_COPY_REPLACEONLY, NULL, 0, NULL, NULL);
213 ok(res == FALSE, "Expected FALSE, got %d\n", res);
214 ok(GetLastError() == ERROR_FILE_NOT_FOUND,
215 "Expected ERROR_FILE_NOT_FOUND, got %d\n", GetLastError());
216 ok(file_exists(tmpfile), "Expected source inf to exist\n");
218 /* try an absolute SourceInfFileName, without DestinationInfFileName */
219 lstrcpy(path, CURR_DIR);
221 lstrcat(path, tmpfile);
222 SetLastError(0xdeadbeef);
223 res = pSetupCopyOEMInfA(path, NULL, SPOST_NONE, 0, NULL, 0, NULL, NULL);
224 ok(res == TRUE, "Expected TRUE, got %d\n", res);
225 ok(GetLastError() == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", GetLastError());
226 ok(file_exists(path), "Expected source inf to exist\n");
228 /* try SP_COPY_REPLACEONLY, dest exists */
229 SetLastError(0xdeadbeef);
230 res = pSetupCopyOEMInfA(path, NULL, SPOST_NONE, SP_COPY_REPLACEONLY, NULL, 0, NULL, NULL);
231 ok(res == TRUE, "Expected TRUE, got %d\n", res);
232 ok(GetLastError() == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", GetLastError());
233 ok(file_exists(path), "Expected source inf to exist\n");
235 /* try SP_COPY_NOOVERWRITE */
236 SetLastError(0xdeadbeef);
237 res = pSetupCopyOEMInfA(path, NULL, SPOST_NONE, SP_COPY_NOOVERWRITE, NULL, 0, NULL, NULL);
238 ok(res == FALSE, "Expected FALSE, got %d\n", res);
239 ok(GetLastError() == ERROR_FILE_EXISTS,
240 "Expected ERROR_FILE_EXISTS, got %d\n", GetLastError());
242 /* get the DestinationInfFileName */
243 SetLastError(0xdeadbeef);
244 res = pSetupCopyOEMInfA(path, NULL, SPOST_NONE, 0, dest, MAX_PATH, NULL, NULL);
245 ok(res == TRUE, "Expected TRUE, got %d\n", res);
246 ok(GetLastError() == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", GetLastError());
247 ok(lstrlen(dest) != 0, "Expected a non-zero length string\n");
248 ok(file_exists(dest), "Expected destination inf to exist\n");
249 ok(check_format(dest, NULL), "Expected %%windir%%\\inf\\OEMx.inf, got %s\n", dest);
250 ok(file_exists(path), "Expected source inf to exist\n");
252 lstrcpy(dest_save, dest);
253 DeleteFile(dest_save);
255 /* get the DestinationInfFileName, DestinationInfFileNameSize is too small
256 * - inf is still copied
258 lstrcpy(dest, "aaa");
260 SetLastError(0xdeadbeef);
261 res = pSetupCopyOEMInfA(path, NULL, SPOST_NONE, 0, dest, 5, &size, NULL);
262 ok(res == FALSE, "Expected FALSE, got %d\n", res);
263 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER,
264 "Expected ERROR_INSUFFICIENT_BUFFER, got %d\n", GetLastError());
265 ok(file_exists(path), "Expected source inf to exist\n");
266 ok(file_exists(dest_save), "Expected dest inf to exist\n");
267 ok(!lstrcmp(dest, "aaa"), "Expected dest to be unchanged\n");
268 ok(size == lstrlen(dest_save) + 1, "Expected size to be lstrlen(dest_save) + 1\n");
270 /* get the DestinationInfFileName and DestinationInfFileNameSize */
271 SetLastError(0xdeadbeef);
272 res = pSetupCopyOEMInfA(path, NULL, SPOST_NONE, 0, dest, MAX_PATH, &size, NULL);
273 ok(res == TRUE, "Expected TRUE, got %d\n", res);
274 ok(GetLastError() == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", GetLastError());
275 ok(lstrlen(dest) + 1 == size, "Expected sizes to match, got (%d, %d)\n", lstrlen(dest), size);
276 ok(file_exists(dest), "Expected destination inf to exist\n");
277 ok(check_format(dest, NULL), "Expected %%windir%%\\inf\\OEMx.inf, got %s\n", dest);
278 ok(file_exists(path), "Expected source inf to exist\n");
279 ok(size == lstrlen(dest_save) + 1, "Expected size to be lstrlen(dest_save) + 1\n");
281 test_original_file_name(strrchr(path, '\\') + 1, dest);
283 /* get the DestinationInfFileName, DestinationInfFileNameSize, and DestinationInfFileNameComponent */
284 SetLastError(0xdeadbeef);
285 res = pSetupCopyOEMInfA(path, NULL, SPOST_NONE, 0, dest, MAX_PATH, &size, &inf);
286 ok(res == TRUE, "Expected TRUE, got %d\n", res);
287 ok(GetLastError() == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", GetLastError());
288 ok(lstrlen(dest) + 1 == size, "Expected sizes to match, got (%d, %d)\n", lstrlen(dest), size);
289 ok(file_exists(dest), "Expected destination inf to exist\n");
290 ok(check_format(dest, inf), "Expected %%windir%%\\inf\\OEMx.inf, got %s\n", dest);
291 ok(file_exists(path), "Expected source inf to exist\n");
292 ok(size == lstrlen(dest_save) + 1, "Expected size to be lstrlen(dest_save) + 1\n");
294 /* try SP_COPY_DELETESOURCE */
295 SetLastError(0xdeadbeef);
296 res = pSetupCopyOEMInfA(path, NULL, SPOST_NONE, SP_COPY_DELETESOURCE, NULL, 0, NULL, NULL);
297 ok(res == TRUE, "Expected TRUE, got %d\n", res);
298 ok(GetLastError() == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", GetLastError());
299 ok(!file_exists(path), "Expected source inf to not exist\n");
302 static void create_source_file(LPSTR filename, const BYTE *data, DWORD size)
307 handle = CreateFileA(filename, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
308 WriteFile(handle, data, size, &written, NULL);
312 static BOOL compare_file_data(LPSTR file, const BYTE *data, DWORD size)
319 handle = CreateFileA(file, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
320 buffer = HeapAlloc(GetProcessHeap(), 0, size);
323 ReadFile(handle, buffer, size, &read, NULL);
324 if (read == size && !memcmp(data, buffer, size)) ret = TRUE;
325 HeapFree(GetProcessHeap(), 0, buffer);
331 static const BYTE uncompressed[] = {
332 'u','n','c','o','m','p','r','e','s','s','e','d','\r','\n'
334 static const BYTE comp_lzx[] = {
335 0x53, 0x5a, 0x44, 0x44, 0x88, 0xf0, 0x27, 0x33, 0x41, 0x00, 0x0e, 0x00, 0x00, 0x00, 0xff, 0x00,
336 0x00, 0x75, 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x3f, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64
338 static const BYTE comp_zip[] = {
339 0x50, 0x4b, 0x03, 0x04, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbd, 0xae, 0x81, 0x36, 0x75, 0x11,
340 0x2c, 0x1b, 0x0e, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x04, 0x00, 0x15, 0x00, 0x77, 0x69,
341 0x6e, 0x65, 0x55, 0x54, 0x09, 0x00, 0x03, 0xd6, 0x0d, 0x10, 0x46, 0xfd, 0x0d, 0x10, 0x46, 0x55,
342 0x78, 0x04, 0x00, 0xe8, 0x03, 0xe8, 0x03, 0x00, 0x00, 0x75, 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x72,
343 0x65, 0x73, 0x73, 0x65, 0x64, 0x50, 0x4b, 0x01, 0x02, 0x17, 0x03, 0x0a, 0x00, 0x00, 0x00, 0x00,
344 0x00, 0xbd, 0xae, 0x81, 0x36, 0x75, 0x11, 0x2c, 0x1b, 0x0e, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00,
345 0x00, 0x04, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x00,
346 0x00, 0x00, 0x00, 0x77, 0x69, 0x6e, 0x65, 0x55, 0x54, 0x05, 0x00, 0x03, 0xd6, 0x0d, 0x10, 0x46,
347 0x55, 0x78, 0x00, 0x00, 0x50, 0x4b, 0x05, 0x06, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00,
348 0x3f, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x00, 0x00, 0x00
350 static const BYTE comp_cab_lzx[] = {
351 0x4d, 0x53, 0x43, 0x46, 0x00, 0x00, 0x00, 0x00, 0x6b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
352 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00,
353 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x01, 0x00, 0x03, 0x0f, 0x0e, 0x00, 0x00, 0x00,
354 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x36, 0x86, 0x72, 0x20, 0x00, 0x77, 0x69, 0x6e, 0x65,
355 0x00, 0x19, 0xd0, 0x1a, 0xe3, 0x22, 0x00, 0x0e, 0x00, 0x5b, 0x80, 0x80, 0x8d, 0x00, 0x30, 0xe0,
356 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x75, 0x6e, 0x63,
357 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x0d, 0x0a
359 static const BYTE comp_cab_zip[] = {
360 0x4d, 0x53, 0x43, 0x46, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
361 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00,
362 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x0e, 0x00, 0x00, 0x00,
363 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x36, 0x2f, 0xa5, 0x20, 0x00, 0x77, 0x69, 0x6e, 0x65,
364 0x00, 0x7c, 0x80, 0x26, 0x2b, 0x12, 0x00, 0x0e, 0x00, 0x43, 0x4b, 0x2b, 0xcd, 0x4b, 0xce, 0xcf,
365 0x2d, 0x28, 0x4a, 0x2d, 0x2e, 0x4e, 0x4d, 0xe1, 0xe5, 0x02, 0x00
368 static void test_SetupGetFileCompressionInfo(void)
370 DWORD ret, source_size, target_size;
371 char source[MAX_PATH], temp[MAX_PATH], *name;
374 GetTempPathA(sizeof(temp), temp);
375 GetTempFileNameA(temp, "fci", 0, source);
377 create_source_file(source, uncompressed, sizeof(uncompressed));
379 ret = SetupGetFileCompressionInfoA(NULL, NULL, NULL, NULL, NULL);
380 ok(ret == ERROR_INVALID_PARAMETER, "SetupGetFileCompressionInfo failed unexpectedly\n");
382 ret = SetupGetFileCompressionInfoA(source, NULL, NULL, NULL, NULL);
383 ok(ret == ERROR_INVALID_PARAMETER, "SetupGetFileCompressionInfo failed unexpectedly\n");
385 ret = SetupGetFileCompressionInfoA(source, &name, NULL, NULL, NULL);
386 ok(ret == ERROR_INVALID_PARAMETER, "SetupGetFileCompressionInfo failed unexpectedly\n");
388 ret = SetupGetFileCompressionInfoA(source, &name, &source_size, NULL, NULL);
389 ok(ret == ERROR_INVALID_PARAMETER, "SetupGetFileCompressionInfo failed unexpectedly\n");
391 ret = SetupGetFileCompressionInfoA(source, &name, &source_size, &target_size, NULL);
392 ok(ret == ERROR_INVALID_PARAMETER, "SetupGetFileCompressionInfo failed unexpectedly\n");
395 source_size = target_size = 0;
398 ret = SetupGetFileCompressionInfoA(source, &name, &source_size, &target_size, &type);
399 ok(!ret, "SetupGetFileCompressionInfo failed unexpectedly\n");
400 ok(name && !lstrcmpA(name, source), "got %s, expected %s\n", name, source);
401 ok(source_size == sizeof(uncompressed), "got %d\n", source_size);
402 ok(target_size == sizeof(uncompressed), "got %d\n", target_size);
403 ok(type == FILE_COMPRESSION_NONE, "got %d, expected FILE_COMPRESSION_NONE\n", type);
409 static void test_SetupGetFileCompressionInfoEx(void)
412 DWORD required_len, source_size, target_size;
413 char source[MAX_PATH], temp[MAX_PATH], name[MAX_PATH];
416 GetTempPathA(sizeof(temp), temp);
417 GetTempFileNameA(temp, "doc", 0, source);
419 ret = pSetupGetFileCompressionInfoExA(NULL, NULL, 0, NULL, NULL, NULL, NULL);
420 ok(!ret, "SetupGetFileCompressionInfoEx succeeded unexpectedly\n");
422 ret = pSetupGetFileCompressionInfoExA(source, NULL, 0, NULL, NULL, NULL, NULL);
423 ok(!ret, "SetupGetFileCompressionInfoEx succeeded unexpectedly\n");
425 ret = pSetupGetFileCompressionInfoExA(source, NULL, 0, &required_len, NULL, NULL, NULL);
426 ok(!ret, "SetupGetFileCompressionInfoEx succeeded unexpectedly\n");
427 ok(required_len == lstrlenA(source) + 1, "got %d, expected %d\n", required_len, lstrlenA(source) + 1);
429 create_source_file(source, comp_lzx, sizeof(comp_lzx));
431 ret = pSetupGetFileCompressionInfoExA(source, name, sizeof(name), &required_len, &source_size, &target_size, &type);
432 ok(ret, "SetupGetFileCompressionInfoEx failed unexpectedly: %d\n", ret);
433 ok(!lstrcmpA(name, source), "got %s, expected %s\n", name, source);
434 ok(required_len == lstrlenA(source) + 1, "got %d, expected %d\n", required_len, lstrlenA(source) + 1);
435 ok(source_size == sizeof(comp_lzx), "got %d\n", source_size);
436 ok(target_size == sizeof(uncompressed), "got %d\n", target_size);
437 ok(type == FILE_COMPRESSION_WINLZA, "got %d, expected FILE_COMPRESSION_WINLZA\n", type);
440 create_source_file(source, comp_zip, sizeof(comp_zip));
442 ret = pSetupGetFileCompressionInfoExA(source, name, sizeof(name), &required_len, &source_size, &target_size, &type);
443 ok(ret, "SetupGetFileCompressionInfoEx failed unexpectedly: %d\n", ret);
444 ok(!lstrcmpA(name, source), "got %s, expected %s\n", name, source);
445 ok(required_len == lstrlenA(source) + 1, "got %d, expected %d\n", required_len, lstrlenA(source) + 1);
446 ok(source_size == sizeof(comp_zip), "got %d\n", source_size);
447 ok(target_size == sizeof(comp_zip), "got %d\n", target_size);
448 ok(type == FILE_COMPRESSION_NONE, "got %d, expected FILE_COMPRESSION_NONE\n", type);
451 create_source_file(source, comp_cab_lzx, sizeof(comp_cab_lzx));
453 ret = pSetupGetFileCompressionInfoExA(source, name, sizeof(name), &required_len, &source_size, &target_size, &type);
454 ok(ret, "SetupGetFileCompressionInfoEx failed unexpectedly: %d\n", ret);
455 ok(!lstrcmpA(name, source), "got %s, expected %s\n", name, source);
456 ok(required_len == lstrlenA(source) + 1, "got %d, expected %d\n", required_len, lstrlenA(source) + 1);
457 ok(source_size == sizeof(comp_cab_lzx), "got %d\n", source_size);
458 ok(target_size == sizeof(uncompressed), "got %d\n", target_size);
459 ok(type == FILE_COMPRESSION_MSZIP, "got %d, expected FILE_COMPRESSION_MSZIP\n", type);
462 create_source_file(source, comp_cab_zip, sizeof(comp_cab_zip));
464 ret = pSetupGetFileCompressionInfoExA(source, name, sizeof(name), &required_len, &source_size, &target_size, &type);
465 ok(ret, "SetupGetFileCompressionInfoEx failed unexpectedly: %d\n", ret);
466 ok(!lstrcmpA(name, source), "got %s, expected %s\n", name, source);
467 ok(required_len == lstrlenA(source) + 1, "got %d, expected %d\n", required_len, lstrlenA(source) + 1);
468 ok(source_size == sizeof(comp_cab_zip), "got %d\n", source_size);
469 ok(target_size == sizeof(uncompressed), "got %d\n", target_size);
470 ok(type == FILE_COMPRESSION_MSZIP, "got %d, expected FILE_COMPRESSION_MSZIP\n", type);
474 static void test_SetupDecompressOrCopyFile(void)
477 char source[MAX_PATH], target[MAX_PATH], temp[MAX_PATH], *p;
480 GetTempPathA(sizeof(temp), temp);
481 GetTempFileNameA(temp, "doc", 0, source);
482 GetTempFileNameA(temp, "doc", 0, target);
484 /* parameter tests */
486 create_source_file(source, uncompressed, sizeof(uncompressed));
488 ret = SetupDecompressOrCopyFileA(NULL, NULL, NULL);
489 ok(ret == ERROR_INVALID_PARAMETER, "SetupDecompressOrCopyFile failed unexpectedly\n");
491 type = FILE_COMPRESSION_NONE;
492 ret = SetupDecompressOrCopyFileA(NULL, target, &type);
493 ok(ret == ERROR_INVALID_PARAMETER, "SetupDecompressOrCopyFile failed unexpectedly\n");
495 ret = SetupDecompressOrCopyFileA(source, NULL, &type);
496 ok(ret == ERROR_INVALID_PARAMETER, "SetupDecompressOrCopyFile failed unexpectedly\n");
498 type = 5; /* try an invalid compression type */
499 ret = SetupDecompressOrCopyFileA(source, target, &type);
500 ok(ret == ERROR_INVALID_PARAMETER, "SetupDecompressOrCopyFile failed unexpectedly\n");
504 /* no compression tests */
506 ret = SetupDecompressOrCopyFileA(source, target, NULL);
507 ok(!ret, "SetupDecompressOrCopyFile failed unexpectedly: %d\n", ret);
508 ok(compare_file_data(target, uncompressed, sizeof(uncompressed)), "incorrect target file\n");
510 /* try overwriting existing file */
511 ret = SetupDecompressOrCopyFileA(source, target, NULL);
512 ok(!ret, "SetupDecompressOrCopyFile failed unexpectedly: %d\n", ret);
515 type = FILE_COMPRESSION_NONE;
516 ret = SetupDecompressOrCopyFileA(source, target, &type);
517 ok(!ret, "SetupDecompressOrCopyFile failed unexpectedly: %d\n", ret);
518 ok(compare_file_data(target, uncompressed, sizeof(uncompressed)), "incorrect target file\n");
521 type = FILE_COMPRESSION_WINLZA;
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");
527 /* lz compression tests */
529 create_source_file(source, comp_lzx, sizeof(comp_lzx));
531 ret = SetupDecompressOrCopyFileA(source, target, NULL);
532 ok(!ret, "SetupDecompressOrCopyFile failed unexpectedly: %d\n", ret);
535 /* zip compression tests */
537 create_source_file(source, comp_zip, sizeof(comp_zip));
539 ret = SetupDecompressOrCopyFileA(source, target, NULL);
540 ok(!ret, "SetupDecompressOrCopyFile failed unexpectedly: %d\n", ret);
541 ok(compare_file_data(target, comp_zip, sizeof(comp_zip)), "incorrect target file\n");
544 /* cabinet compression tests */
546 create_source_file(source, comp_cab_zip, sizeof(comp_cab_zip));
548 p = strrchr(target, '\\');
549 lstrcpyA(p + 1, "wine");
551 ret = SetupDecompressOrCopyFileA(source, target, NULL);
552 ok(!ret, "SetupDecompressOrCopyFile failed unexpectedly: %d\n", ret);
553 ok(compare_file_data(target, uncompressed, sizeof(uncompressed)), "incorrect target file\n");
555 /* try overwriting existing file */
556 ret = SetupDecompressOrCopyFileA(source, target, NULL);
557 ok(!ret, "SetupDecompressOrCopyFile failed unexpectedly: %d\n", ret);
559 /* try zip compression */
560 type = FILE_COMPRESSION_MSZIP;
561 ret = SetupDecompressOrCopyFileA(source, target, &type);
562 ok(!ret, "SetupDecompressOrCopyFile failed unexpectedly: %d\n", ret);
563 ok(compare_file_data(target, uncompressed, sizeof(uncompressed)), "incorrect target file\n");
565 /* try no compression */
566 type = FILE_COMPRESSION_NONE;
567 ret = SetupDecompressOrCopyFileA(source, target, &type);
568 ok(!ret, "SetupDecompressOrCopyFile failed unexpectedly: %d\n", ret);
569 ok(compare_file_data(target, comp_cab_zip, sizeof(comp_cab_zip)), "incorrect target file\n");
577 HMODULE hsetupapi = GetModuleHandle("setupapi.dll");
579 pSetupGetFileCompressionInfoExA = (void*)GetProcAddress(hsetupapi, "SetupGetFileCompressionInfoExA");
580 pSetupCopyOEMInfA = (void*)GetProcAddress(hsetupapi, "SetupCopyOEMInfA");
581 pSetupQueryInfOriginalFileInformationA = (void*)GetProcAddress(hsetupapi, "SetupQueryInfOriginalFileInformationA");
583 GetCurrentDirectoryA(MAX_PATH, CURR_DIR);
585 if (pSetupCopyOEMInfA)
586 test_SetupCopyOEMInf();
588 skip("SetupCopyOEMInfA is not available\n");
590 test_SetupGetFileCompressionInfo();
592 if (pSetupGetFileCompressionInfoExA)
593 test_SetupGetFileCompressionInfoEx();
595 skip("SetupGetFileCompressionInfoExA is not available\n");
597 test_SetupDecompressOrCopyFile();