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
);
49 static BOOL (WINAPI
*pSetupUninstallOEMInfA
)(PCSTR
, DWORD
, PVOID
);
51 static void create_inf_file(LPCSTR filename
)
53 DWORD dwNumberOfBytesWritten
;
54 HANDLE hf
= CreateFile(filename
, GENERIC_WRITE
, 0, NULL
,
55 CREATE_ALWAYS
, FILE_ATTRIBUTE_NORMAL
, NULL
);
57 static const char data
[] =
59 "Signature=\"$Chicago$\"\n"
62 "RegisterOCXs=RegisterOCXsSection\n"
63 "[RegisterOCXsSection]\n"
64 "%%11%%\\ole32.dll\n";
66 WriteFile(hf
, data
, sizeof(data
) - 1, &dwNumberOfBytesWritten
, NULL
);
70 static void get_temp_filename(LPSTR path
)
75 GetTempFileName(CURR_DIR
, "set", 0, temp
);
76 ptr
= strrchr(temp
, '\\');
78 lstrcpy(path
, ptr
+ 1);
81 static BOOL
file_exists(LPSTR path
)
83 return GetFileAttributes(path
) != INVALID_FILE_ATTRIBUTES
;
86 static BOOL
check_format(LPSTR path
, LPSTR inf
)
91 static const CHAR format
[] = "\\INF\\oem";
93 GetWindowsDirectory(check
, MAX_PATH
);
94 lstrcat(check
, format
);
95 res
= CompareString(LOCALE_SYSTEM_DEFAULT
, NORM_IGNORECASE
, check
, -1, path
, lstrlen(check
)) == CSTR_EQUAL
&&
96 path
[lstrlen(check
)] != '\\';
98 return (!inf
) ? res
: res
&& (inf
== path
+ lstrlen(check
) - 3);
101 static void test_original_file_name(LPCSTR original
, LPCSTR dest
)
104 PSP_INF_INFORMATION pspii
;
105 SP_ORIGINAL_FILE_INFO spofi
;
109 if (!pSetupQueryInfOriginalFileInformationA
)
111 win_skip("SetupQueryInfOriginalFileInformationA is not available\n");
115 hinf
= SetupOpenInfFileA(dest
, NULL
, INF_STYLE_WIN4
, NULL
);
116 ok(hinf
!= NULL
, "SetupOpenInfFileA failed with error %d\n", GetLastError());
118 res
= SetupGetInfInformation(hinf
, INFINFO_INF_SPEC_IS_HINF
, NULL
, 0, &size
);
119 ok(res
, "SetupGetInfInformation failed with error %d\n", GetLastError());
121 pspii
= HeapAlloc(GetProcessHeap(), 0, size
);
123 res
= SetupGetInfInformation(hinf
, INFINFO_INF_SPEC_IS_HINF
, pspii
, size
, NULL
);
124 ok(res
, "SetupGetInfInformation failed with error %d\n", GetLastError());
127 res
= pSetupQueryInfOriginalFileInformationA(pspii
, 0, NULL
, &spofi
);
128 ok(!res
&& GetLastError() == ERROR_INVALID_USER_BUFFER
,
129 "SetupQueryInfOriginalFileInformationA should have failed with ERROR_INVALID_USER_BUFFER instead of %d\n", GetLastError());
131 spofi
.cbSize
= sizeof(spofi
);
132 res
= pSetupQueryInfOriginalFileInformationA(pspii
, 0, NULL
, &spofi
);
133 ok(res
, "SetupQueryInfOriginalFileInformationA failed with error %d\n", GetLastError());
134 ok(!spofi
.OriginalCatalogName
[0], "spofi.OriginalCatalogName should have been \"\" instead of \"%s\"\n", spofi
.OriginalCatalogName
);
136 ok(!strcmp(original
, spofi
.OriginalInfName
), "spofi.OriginalInfName of %s didn't match real original name %s\n", spofi
.OriginalInfName
, original
);
138 HeapFree(GetProcessHeap(), 0, pspii
);
140 SetupCloseInfFile(hinf
);
143 static void test_SetupCopyOEMInf(void)
145 CHAR toolong
[MAX_PATH
* 2];
146 CHAR path
[MAX_PATH
], dest
[MAX_PATH
];
147 CHAR tmpfile
[MAX_PATH
], dest_save
[MAX_PATH
];
152 /* try NULL SourceInfFileName */
153 SetLastError(0xdeadbeef);
154 res
= pSetupCopyOEMInfA(NULL
, NULL
, 0, SP_COPY_NOOVERWRITE
, NULL
, 0, NULL
, NULL
);
155 ok(res
== FALSE
, "Expected FALSE, got %d\n", res
);
156 ok(GetLastError() == ERROR_INVALID_PARAMETER
,
157 "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
159 /* try empty SourceInfFileName */
160 SetLastError(0xdeadbeef);
161 res
= pSetupCopyOEMInfA("", NULL
, 0, SP_COPY_NOOVERWRITE
, NULL
, 0, NULL
, NULL
);
162 ok(res
== FALSE
, "Expected FALSE, got %d\n", res
);
163 ok(GetLastError() == ERROR_FILE_NOT_FOUND
||
164 GetLastError() == ERROR_BAD_PATHNAME
|| /* Win98 */
165 GetLastError() == ERROR_INVALID_PARAMETER
, /* Vista, W2K8 */
166 "Unexpected error : %d\n", GetLastError());
168 /* try a relative nonexistent SourceInfFileName */
169 SetLastError(0xdeadbeef);
170 res
= pSetupCopyOEMInfA("nonexistent", NULL
, 0, SP_COPY_NOOVERWRITE
, NULL
, 0, NULL
, NULL
);
171 ok(res
== FALSE
, "Expected FALSE, got %d\n", res
);
172 ok(GetLastError() == ERROR_FILE_NOT_FOUND
,
173 "Expected ERROR_FILE_NOT_FOUND, got %d\n", GetLastError());
175 /* try an absolute nonexistent SourceInfFileName */
176 lstrcpy(path
, CURR_DIR
);
177 lstrcat(path
, "\\nonexistent");
178 SetLastError(0xdeadbeef);
179 res
= pSetupCopyOEMInfA(path
, NULL
, 0, SP_COPY_NOOVERWRITE
, NULL
, 0, NULL
, NULL
);
180 ok(res
== FALSE
, "Expected FALSE, got %d\n", res
);
181 ok(GetLastError() == ERROR_FILE_NOT_FOUND
,
182 "Expected ERROR_FILE_NOT_FOUND, got %d\n", GetLastError());
184 /* try a long SourceInfFileName */
185 memset(toolong
, 'a', MAX_PATH
* 2);
186 toolong
[MAX_PATH
* 2 - 1] = '\0';
187 SetLastError(0xdeadbeef);
188 res
= pSetupCopyOEMInfA(toolong
, NULL
, 0, SP_COPY_NOOVERWRITE
, NULL
, 0, NULL
, NULL
);
189 ok(res
== FALSE
, "Expected FALSE, got %d\n", res
);
190 ok(GetLastError() == ERROR_FILE_NOT_FOUND
||
191 GetLastError() == ERROR_FILENAME_EXCED_RANGE
, /* Win98 */
192 "Expected ERROR_FILE_NOT_FOUND or ERROR_FILENAME_EXCED_RANGE, got %d\n", GetLastError());
194 get_temp_filename(tmpfile
);
195 create_inf_file(tmpfile
);
197 /* try a relative SourceInfFileName */
198 SetLastError(0xdeadbeef);
199 res
= pSetupCopyOEMInfA(tmpfile
, NULL
, 0, SP_COPY_NOOVERWRITE
, NULL
, 0, NULL
, NULL
);
201 broken(res
== TRUE
), /* Win98 */
202 "Expected FALSE, got %d\n", res
);
203 if (GetLastError() == ERROR_WRONG_INF_TYPE
|| GetLastError() == ERROR_UNSUPPORTED_TYPE
/* Win7 */)
206 * Vista needs a [Manufacturer] entry in the inf file. Doing this will give some
207 * popups during the installation though as it also needs a catalog file (signed?).
209 win_skip("Needs a different inf file on Vista+\n");
214 ok(GetLastError() == ERROR_FILE_NOT_FOUND
||
215 broken(GetLastError() == ERROR_SUCCESS
), /* Win98 */
216 "Expected ERROR_FILE_NOT_FOUND, got %d\n", GetLastError());
217 ok(file_exists(tmpfile
), "Expected tmpfile to exist\n");
219 /* try SP_COPY_REPLACEONLY, dest does not exist */
220 SetLastError(0xdeadbeef);
221 res
= pSetupCopyOEMInfA(path
, NULL
, SPOST_NONE
, SP_COPY_REPLACEONLY
, NULL
, 0, NULL
, NULL
);
222 ok(res
== FALSE
, "Expected FALSE, got %d\n", res
);
223 ok(GetLastError() == ERROR_FILE_NOT_FOUND
,
224 "Expected ERROR_FILE_NOT_FOUND, got %d\n", GetLastError());
225 ok(file_exists(tmpfile
), "Expected source inf to exist\n");
227 /* try an absolute SourceInfFileName, without DestinationInfFileName */
228 lstrcpy(path
, CURR_DIR
);
230 lstrcat(path
, tmpfile
);
231 SetLastError(0xdeadbeef);
232 res
= pSetupCopyOEMInfA(path
, NULL
, SPOST_NONE
, 0, NULL
, 0, NULL
, NULL
);
233 ok(res
== TRUE
, "Expected TRUE, got %d\n", res
);
234 ok(GetLastError() == ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", GetLastError());
235 ok(file_exists(path
), "Expected source inf to exist\n");
237 /* try SP_COPY_REPLACEONLY, dest exists */
238 SetLastError(0xdeadbeef);
239 res
= pSetupCopyOEMInfA(path
, NULL
, SPOST_NONE
, SP_COPY_REPLACEONLY
, NULL
, 0, NULL
, NULL
);
240 ok(res
== TRUE
, "Expected TRUE, got %d\n", res
);
241 ok(GetLastError() == ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", GetLastError());
242 ok(file_exists(path
), "Expected source inf to exist\n");
244 /* try SP_COPY_NOOVERWRITE */
245 SetLastError(0xdeadbeef);
246 res
= pSetupCopyOEMInfA(path
, NULL
, SPOST_NONE
, SP_COPY_NOOVERWRITE
, NULL
, 0, NULL
, NULL
);
247 ok(res
== FALSE
, "Expected FALSE, got %d\n", res
);
248 ok(GetLastError() == ERROR_FILE_EXISTS
,
249 "Expected ERROR_FILE_EXISTS, got %d\n", GetLastError());
251 /* get the DestinationInfFileName */
252 SetLastError(0xdeadbeef);
253 res
= pSetupCopyOEMInfA(path
, NULL
, SPOST_NONE
, 0, dest
, MAX_PATH
, NULL
, NULL
);
254 ok(res
== TRUE
, "Expected TRUE, got %d\n", res
);
255 ok(GetLastError() == ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", GetLastError());
256 ok(lstrlen(dest
) != 0, "Expected a non-zero length string\n");
257 ok(file_exists(dest
), "Expected destination inf to exist\n");
258 ok(check_format(dest
, NULL
), "Expected %%windir%%\\inf\\OEMx.inf, got %s\n", dest
);
259 ok(file_exists(path
), "Expected source inf to exist\n");
261 lstrcpy(dest_save
, dest
);
262 DeleteFile(dest_save
);
264 /* get the DestinationInfFileName, DestinationInfFileNameSize is too small
265 * - inf is still copied
267 lstrcpy(dest
, "aaa");
269 SetLastError(0xdeadbeef);
270 res
= pSetupCopyOEMInfA(path
, NULL
, SPOST_NONE
, 0, dest
, 5, &size
, NULL
);
271 ok(res
== FALSE
, "Expected FALSE, got %d\n", res
);
272 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER
,
273 "Expected ERROR_INSUFFICIENT_BUFFER, got %d\n", GetLastError());
274 ok(file_exists(path
), "Expected source inf to exist\n");
275 ok(file_exists(dest_save
), "Expected dest inf to exist\n");
276 ok(!lstrcmp(dest
, "aaa"), "Expected dest to be unchanged\n");
277 ok(size
== lstrlen(dest_save
) + 1, "Expected size to be lstrlen(dest_save) + 1\n");
279 /* get the DestinationInfFileName and DestinationInfFileNameSize */
280 SetLastError(0xdeadbeef);
281 res
= pSetupCopyOEMInfA(path
, NULL
, SPOST_NONE
, 0, dest
, MAX_PATH
, &size
, NULL
);
282 ok(res
== TRUE
, "Expected TRUE, got %d\n", res
);
283 ok(GetLastError() == ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", GetLastError());
284 ok(lstrlen(dest
) + 1 == size
, "Expected sizes to match, got (%d, %d)\n", lstrlen(dest
), size
);
285 ok(file_exists(dest
), "Expected destination inf to exist\n");
286 ok(check_format(dest
, NULL
), "Expected %%windir%%\\inf\\OEMx.inf, got %s\n", dest
);
287 ok(file_exists(path
), "Expected source inf to exist\n");
288 ok(size
== lstrlen(dest_save
) + 1, "Expected size to be lstrlen(dest_save) + 1\n");
290 test_original_file_name(strrchr(path
, '\\') + 1, dest
);
292 /* get the DestinationInfFileName, DestinationInfFileNameSize, and DestinationInfFileNameComponent */
293 SetLastError(0xdeadbeef);
294 res
= pSetupCopyOEMInfA(path
, NULL
, SPOST_NONE
, 0, dest
, MAX_PATH
, &size
, &inf
);
295 ok(res
== TRUE
, "Expected TRUE, got %d\n", res
);
296 ok(GetLastError() == ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", GetLastError());
297 ok(lstrlen(dest
) + 1 == size
, "Expected sizes to match, got (%d, %d)\n", lstrlen(dest
), size
);
298 ok(file_exists(dest
), "Expected destination inf to exist\n");
299 ok((inf
&& inf
[0] != 0) ||
300 broken(!inf
), /* Win98 */
301 "Expected inf to point to the filename\n");
302 ok(check_format(dest
, inf
), "Expected %%windir%%\\inf\\OEMx.inf, got %s\n", dest
);
303 ok(file_exists(path
), "Expected source inf to exist\n");
304 ok(size
== lstrlen(dest_save
) + 1, "Expected size to be lstrlen(dest_save) + 1\n");
306 /* try SP_COPY_DELETESOURCE */
307 SetLastError(0xdeadbeef);
308 res
= pSetupCopyOEMInfA(path
, NULL
, SPOST_NONE
, SP_COPY_DELETESOURCE
, NULL
, 0, NULL
, NULL
);
309 ok(res
== TRUE
, "Expected TRUE, got %d\n", res
);
310 ok(GetLastError() == ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got %d\n", GetLastError());
311 ok(!file_exists(path
), "Expected source inf to not exist\n");
313 if (pSetupUninstallOEMInfA
)
315 char *destfile
= strrchr(dest
, '\\') + 1;
317 SetLastError(0xdeadbeef);
318 ok(pSetupUninstallOEMInfA(destfile
, 0, NULL
), "Failed to uninstall '%s' : %d\n", destfile
, GetLastError());
323 SetLastError(0xdeadbeef);
324 ok(DeleteFileA(dest
), "Failed to delete file '%s' : %d\n", dest
, GetLastError());
326 /* On WinMe we also need to remove the .pnf file */
327 *(strrchr(dest
, '.') + 1) = 'p';
332 static void create_source_file(LPSTR filename
, const BYTE
*data
, DWORD size
)
337 handle
= CreateFileA(filename
, GENERIC_WRITE
, 0, NULL
, CREATE_ALWAYS
, FILE_ATTRIBUTE_NORMAL
, NULL
);
338 WriteFile(handle
, data
, size
, &written
, NULL
);
342 static BOOL
compare_file_data(LPSTR file
, const BYTE
*data
, DWORD size
)
349 handle
= CreateFileA(file
, GENERIC_READ
, 0, NULL
, OPEN_EXISTING
, FILE_ATTRIBUTE_NORMAL
, NULL
);
350 buffer
= HeapAlloc(GetProcessHeap(), 0, size
);
353 ReadFile(handle
, buffer
, size
, &read
, NULL
);
354 if (read
== size
&& !memcmp(data
, buffer
, size
)) ret
= TRUE
;
355 HeapFree(GetProcessHeap(), 0, buffer
);
361 static const BYTE uncompressed
[] = {
362 'u','n','c','o','m','p','r','e','s','s','e','d','\r','\n'
364 static const BYTE comp_lzx
[] = {
365 0x53, 0x5a, 0x44, 0x44, 0x88, 0xf0, 0x27, 0x33, 0x41, 0x00, 0x0e, 0x00, 0x00, 0x00, 0xff, 0x00,
366 0x00, 0x75, 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x3f, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64
368 static const BYTE comp_zip
[] = {
369 0x50, 0x4b, 0x03, 0x04, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbd, 0xae, 0x81, 0x36, 0x75, 0x11,
370 0x2c, 0x1b, 0x0e, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x04, 0x00, 0x15, 0x00, 0x77, 0x69,
371 0x6e, 0x65, 0x55, 0x54, 0x09, 0x00, 0x03, 0xd6, 0x0d, 0x10, 0x46, 0xfd, 0x0d, 0x10, 0x46, 0x55,
372 0x78, 0x04, 0x00, 0xe8, 0x03, 0xe8, 0x03, 0x00, 0x00, 0x75, 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x72,
373 0x65, 0x73, 0x73, 0x65, 0x64, 0x50, 0x4b, 0x01, 0x02, 0x17, 0x03, 0x0a, 0x00, 0x00, 0x00, 0x00,
374 0x00, 0xbd, 0xae, 0x81, 0x36, 0x75, 0x11, 0x2c, 0x1b, 0x0e, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00,
375 0x00, 0x04, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x00,
376 0x00, 0x00, 0x00, 0x77, 0x69, 0x6e, 0x65, 0x55, 0x54, 0x05, 0x00, 0x03, 0xd6, 0x0d, 0x10, 0x46,
377 0x55, 0x78, 0x00, 0x00, 0x50, 0x4b, 0x05, 0x06, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00,
378 0x3f, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x00, 0x00, 0x00
380 static const BYTE comp_cab_lzx
[] = {
381 0x4d, 0x53, 0x43, 0x46, 0x00, 0x00, 0x00, 0x00, 0x6b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
382 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00,
383 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x01, 0x00, 0x03, 0x0f, 0x0e, 0x00, 0x00, 0x00,
384 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x36, 0x86, 0x72, 0x20, 0x00, 0x77, 0x69, 0x6e, 0x65,
385 0x00, 0x19, 0xd0, 0x1a, 0xe3, 0x22, 0x00, 0x0e, 0x00, 0x5b, 0x80, 0x80, 0x8d, 0x00, 0x30, 0xe0,
386 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x75, 0x6e, 0x63,
387 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x0d, 0x0a
389 static const BYTE comp_cab_zip
[] = {
390 0x4d, 0x53, 0x43, 0x46, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
391 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00,
392 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x0e, 0x00, 0x00, 0x00,
393 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x36, 0x2f, 0xa5, 0x20, 0x00, 0x77, 0x69, 0x6e, 0x65,
394 0x00, 0x7c, 0x80, 0x26, 0x2b, 0x12, 0x00, 0x0e, 0x00, 0x43, 0x4b, 0x2b, 0xcd, 0x4b, 0xce, 0xcf,
395 0x2d, 0x28, 0x4a, 0x2d, 0x2e, 0x4e, 0x4d, 0xe1, 0xe5, 0x02, 0x00
398 static void test_SetupGetFileCompressionInfo(void)
400 DWORD ret
, source_size
, target_size
;
401 char source
[MAX_PATH
], temp
[MAX_PATH
], *name
;
404 GetTempPathA(sizeof(temp
), temp
);
405 GetTempFileNameA(temp
, "fci", 0, source
);
407 create_source_file(source
, uncompressed
, sizeof(uncompressed
));
409 ret
= SetupGetFileCompressionInfoA(NULL
, NULL
, NULL
, NULL
, NULL
);
410 ok(ret
== ERROR_INVALID_PARAMETER
, "SetupGetFileCompressionInfo failed unexpectedly\n");
412 ret
= SetupGetFileCompressionInfoA(source
, NULL
, NULL
, NULL
, NULL
);
413 ok(ret
== ERROR_INVALID_PARAMETER
, "SetupGetFileCompressionInfo failed unexpectedly\n");
415 ret
= SetupGetFileCompressionInfoA(source
, &name
, NULL
, NULL
, NULL
);
416 ok(ret
== ERROR_INVALID_PARAMETER
, "SetupGetFileCompressionInfo failed unexpectedly\n");
418 ret
= SetupGetFileCompressionInfoA(source
, &name
, &source_size
, NULL
, NULL
);
419 ok(ret
== ERROR_INVALID_PARAMETER
, "SetupGetFileCompressionInfo failed unexpectedly\n");
421 ret
= SetupGetFileCompressionInfoA(source
, &name
, &source_size
, &target_size
, NULL
);
422 ok(ret
== ERROR_INVALID_PARAMETER
, "SetupGetFileCompressionInfo failed unexpectedly\n");
425 source_size
= target_size
= 0;
428 ret
= SetupGetFileCompressionInfoA(source
, &name
, &source_size
, &target_size
, &type
);
429 ok(!ret
, "SetupGetFileCompressionInfo failed unexpectedly\n");
430 ok(name
&& !lstrcmpA(name
, source
), "got %s, expected %s\n", name
, source
);
431 ok(source_size
== sizeof(uncompressed
), "got %d\n", source_size
);
432 ok(target_size
== sizeof(uncompressed
), "got %d\n", target_size
);
433 ok(type
== FILE_COMPRESSION_NONE
, "got %d, expected FILE_COMPRESSION_NONE\n", type
);
439 static void test_SetupGetFileCompressionInfoEx(void)
442 DWORD required_len
, source_size
, target_size
;
443 char source
[MAX_PATH
], temp
[MAX_PATH
], name
[MAX_PATH
];
446 GetTempPathA(sizeof(temp
), temp
);
447 GetTempFileNameA(temp
, "doc", 0, source
);
449 ret
= pSetupGetFileCompressionInfoExA(NULL
, NULL
, 0, NULL
, NULL
, NULL
, NULL
);
450 ok(!ret
, "SetupGetFileCompressionInfoEx succeeded unexpectedly\n");
452 ret
= pSetupGetFileCompressionInfoExA(source
, NULL
, 0, NULL
, NULL
, NULL
, NULL
);
453 ok(!ret
, "SetupGetFileCompressionInfoEx succeeded unexpectedly\n");
455 ret
= pSetupGetFileCompressionInfoExA(source
, NULL
, 0, &required_len
, NULL
, NULL
, NULL
);
456 ok(!ret
, "SetupGetFileCompressionInfoEx succeeded unexpectedly\n");
457 ok(required_len
== lstrlenA(source
) + 1, "got %d, expected %d\n", required_len
, lstrlenA(source
) + 1);
459 create_source_file(source
, comp_lzx
, sizeof(comp_lzx
));
461 ret
= pSetupGetFileCompressionInfoExA(source
, name
, sizeof(name
), &required_len
, &source_size
, &target_size
, &type
);
462 ok(ret
, "SetupGetFileCompressionInfoEx failed unexpectedly: %d\n", ret
);
463 ok(!lstrcmpA(name
, source
), "got %s, expected %s\n", name
, source
);
464 ok(required_len
== lstrlenA(source
) + 1, "got %d, expected %d\n", required_len
, lstrlenA(source
) + 1);
465 ok(source_size
== sizeof(comp_lzx
), "got %d\n", source_size
);
466 ok(target_size
== sizeof(uncompressed
), "got %d\n", target_size
);
467 ok(type
== FILE_COMPRESSION_WINLZA
, "got %d, expected FILE_COMPRESSION_WINLZA\n", type
);
470 create_source_file(source
, comp_zip
, sizeof(comp_zip
));
472 ret
= pSetupGetFileCompressionInfoExA(source
, name
, sizeof(name
), &required_len
, &source_size
, &target_size
, &type
);
473 ok(ret
, "SetupGetFileCompressionInfoEx failed unexpectedly: %d\n", ret
);
474 ok(!lstrcmpA(name
, source
), "got %s, expected %s\n", name
, source
);
475 ok(required_len
== lstrlenA(source
) + 1, "got %d, expected %d\n", required_len
, lstrlenA(source
) + 1);
476 ok(source_size
== sizeof(comp_zip
), "got %d\n", source_size
);
477 ok(target_size
== sizeof(comp_zip
), "got %d\n", target_size
);
478 ok(type
== FILE_COMPRESSION_NONE
, "got %d, expected FILE_COMPRESSION_NONE\n", type
);
481 create_source_file(source
, comp_cab_lzx
, sizeof(comp_cab_lzx
));
483 ret
= pSetupGetFileCompressionInfoExA(source
, name
, sizeof(name
), &required_len
, &source_size
, &target_size
, &type
);
484 ok(ret
, "SetupGetFileCompressionInfoEx failed unexpectedly: %d\n", ret
);
485 ok(!lstrcmpA(name
, source
), "got %s, expected %s\n", name
, source
);
486 ok(required_len
== lstrlenA(source
) + 1, "got %d, expected %d\n", required_len
, lstrlenA(source
) + 1);
487 ok(source_size
== sizeof(comp_cab_lzx
), "got %d\n", source_size
);
488 ok(target_size
== sizeof(uncompressed
), "got %d\n", target_size
);
489 ok(type
== FILE_COMPRESSION_MSZIP
, "got %d, expected FILE_COMPRESSION_MSZIP\n", type
);
492 create_source_file(source
, comp_cab_zip
, sizeof(comp_cab_zip
));
494 ret
= pSetupGetFileCompressionInfoExA(source
, name
, sizeof(name
), &required_len
, &source_size
, &target_size
, &type
);
495 ok(ret
, "SetupGetFileCompressionInfoEx failed unexpectedly: %d\n", ret
);
496 ok(!lstrcmpA(name
, source
), "got %s, expected %s\n", name
, source
);
497 ok(required_len
== lstrlenA(source
) + 1, "got %d, expected %d\n", required_len
, lstrlenA(source
) + 1);
498 ok(source_size
== sizeof(comp_cab_zip
), "got %d\n", source_size
);
499 ok(target_size
== sizeof(uncompressed
), "got %d\n", target_size
);
500 ok(type
== FILE_COMPRESSION_MSZIP
, "got %d, expected FILE_COMPRESSION_MSZIP\n", type
);
504 static void test_SetupDecompressOrCopyFile(void)
507 char source
[MAX_PATH
], target
[MAX_PATH
], temp
[MAX_PATH
], *p
;
510 GetTempPathA(sizeof(temp
), temp
);
511 GetTempFileNameA(temp
, "doc", 0, source
);
512 GetTempFileNameA(temp
, "doc", 0, target
);
514 /* parameter tests */
516 create_source_file(source
, uncompressed
, sizeof(uncompressed
));
518 ret
= SetupDecompressOrCopyFileA(NULL
, NULL
, NULL
);
519 ok(ret
== ERROR_INVALID_PARAMETER
, "SetupDecompressOrCopyFile failed unexpectedly\n");
521 type
= FILE_COMPRESSION_NONE
;
522 ret
= SetupDecompressOrCopyFileA(NULL
, target
, &type
);
523 ok(ret
== ERROR_INVALID_PARAMETER
, "SetupDecompressOrCopyFile failed unexpectedly\n");
525 ret
= SetupDecompressOrCopyFileA(source
, NULL
, &type
);
526 ok(ret
== ERROR_INVALID_PARAMETER
, "SetupDecompressOrCopyFile failed unexpectedly\n");
528 type
= 5; /* try an invalid compression type */
529 ret
= SetupDecompressOrCopyFileA(source
, target
, &type
);
530 ok(ret
== ERROR_INVALID_PARAMETER
, "SetupDecompressOrCopyFile failed unexpectedly\n");
534 /* no compression tests */
536 ret
= SetupDecompressOrCopyFileA(source
, target
, NULL
);
537 ok(!ret
, "SetupDecompressOrCopyFile failed unexpectedly: %d\n", ret
);
538 ok(compare_file_data(target
, uncompressed
, sizeof(uncompressed
)), "incorrect target file\n");
540 /* try overwriting existing file */
541 ret
= SetupDecompressOrCopyFileA(source
, target
, NULL
);
542 ok(!ret
, "SetupDecompressOrCopyFile failed unexpectedly: %d\n", ret
);
545 type
= FILE_COMPRESSION_NONE
;
546 ret
= SetupDecompressOrCopyFileA(source
, target
, &type
);
547 ok(!ret
, "SetupDecompressOrCopyFile failed unexpectedly: %d\n", ret
);
548 ok(compare_file_data(target
, uncompressed
, sizeof(uncompressed
)), "incorrect target file\n");
551 type
= FILE_COMPRESSION_WINLZA
;
552 ret
= SetupDecompressOrCopyFileA(source
, target
, &type
);
553 ok(!ret
, "SetupDecompressOrCopyFile failed unexpectedly: %d\n", ret
);
554 ok(compare_file_data(target
, uncompressed
, sizeof(uncompressed
)), "incorrect target file\n");
557 /* lz compression tests */
559 create_source_file(source
, comp_lzx
, sizeof(comp_lzx
));
561 ret
= SetupDecompressOrCopyFileA(source
, target
, NULL
);
562 ok(!ret
, "SetupDecompressOrCopyFile failed unexpectedly: %d\n", ret
);
565 /* zip compression tests */
567 create_source_file(source
, comp_zip
, sizeof(comp_zip
));
569 ret
= SetupDecompressOrCopyFileA(source
, target
, NULL
);
570 ok(!ret
, "SetupDecompressOrCopyFile failed unexpectedly: %d\n", ret
);
571 ok(compare_file_data(target
, comp_zip
, sizeof(comp_zip
)), "incorrect target file\n");
574 /* cabinet compression tests */
576 create_source_file(source
, comp_cab_zip
, sizeof(comp_cab_zip
));
578 p
= strrchr(target
, '\\');
579 lstrcpyA(p
+ 1, "wine");
581 ret
= SetupDecompressOrCopyFileA(source
, target
, NULL
);
582 ok(!ret
, "SetupDecompressOrCopyFile failed unexpectedly: %d\n", ret
);
583 ok(compare_file_data(target
, uncompressed
, sizeof(uncompressed
)), "incorrect target file\n");
585 /* try overwriting existing file */
586 ret
= SetupDecompressOrCopyFileA(source
, target
, NULL
);
587 ok(!ret
, "SetupDecompressOrCopyFile failed unexpectedly: %d\n", ret
);
589 /* try zip compression */
590 type
= FILE_COMPRESSION_MSZIP
;
591 ret
= SetupDecompressOrCopyFileA(source
, target
, &type
);
592 ok(!ret
, "SetupDecompressOrCopyFile failed unexpectedly: %d\n", ret
);
593 ok(compare_file_data(target
, uncompressed
, sizeof(uncompressed
)), "incorrect target file\n");
595 /* try no compression */
596 type
= FILE_COMPRESSION_NONE
;
597 ret
= SetupDecompressOrCopyFileA(source
, target
, &type
);
598 ok(!ret
, "SetupDecompressOrCopyFile failed unexpectedly: %d\n", ret
);
599 ok(compare_file_data(target
, comp_cab_zip
, sizeof(comp_cab_zip
)), "incorrect target file\n");
605 static void test_SetupUninstallOEMInf(void)
609 SetLastError(0xdeadbeef);
610 ret
= pSetupUninstallOEMInfA(NULL
, 0, NULL
);
611 ok(!ret
, "Expected failure\n");
612 ok(GetLastError() == ERROR_INVALID_PARAMETER
, "Expected ERROR_INVALID_PARAMETER, got %08x\n", GetLastError());
614 SetLastError(0xdeadbeef);
615 ret
= pSetupUninstallOEMInfA("", 0, NULL
);
618 ok(!ret
, "Expected failure\n");
619 ok(GetLastError() == ERROR_FILE_NOT_FOUND
, "Expected ERROR_FILE_NOT_FOUND, got %08x\n", GetLastError());
622 SetLastError(0xdeadbeef);
623 ret
= pSetupUninstallOEMInfA("nonexistent.inf", 0, NULL
);
626 ok(!ret
, "Expected failure\n");
627 ok(GetLastError() == ERROR_FILE_NOT_FOUND
, "Expected ERROR_FILE_NOT_FOUND, got %08x\n", GetLastError());
633 HMODULE hsetupapi
= GetModuleHandle("setupapi.dll");
635 pSetupGetFileCompressionInfoExA
= (void*)GetProcAddress(hsetupapi
, "SetupGetFileCompressionInfoExA");
636 pSetupCopyOEMInfA
= (void*)GetProcAddress(hsetupapi
, "SetupCopyOEMInfA");
637 pSetupQueryInfOriginalFileInformationA
= (void*)GetProcAddress(hsetupapi
, "SetupQueryInfOriginalFileInformationA");
638 pSetupUninstallOEMInfA
= (void*)GetProcAddress(hsetupapi
, "SetupUninstallOEMInfA");
640 GetCurrentDirectoryA(MAX_PATH
, CURR_DIR
);
642 if (pSetupCopyOEMInfA
)
643 test_SetupCopyOEMInf();
645 win_skip("SetupCopyOEMInfA is not available\n");
647 test_SetupGetFileCompressionInfo();
649 if (pSetupGetFileCompressionInfoExA
)
650 test_SetupGetFileCompressionInfoEx();
652 win_skip("SetupGetFileCompressionInfoExA is not available\n");
654 test_SetupDecompressOrCopyFile();
656 if (pSetupUninstallOEMInfA
)
657 test_SetupUninstallOEMInf();
659 win_skip("SetupUninstallOEMInfA is not available\n");