From: Rémi Bernon rbernon@codeweavers.com
--- programs/winetest/Makefile.in | 3 ++- programs/winetest/main.c | 46 ++++++++++++++++++++++++++++++++++- tools/makedep.c | 2 +- 3 files changed, 48 insertions(+), 3 deletions(-)
diff --git a/programs/winetest/Makefile.in b/programs/winetest/Makefile.in index 46198ea1017..6f58e2eda48 100644 --- a/programs/winetest/Makefile.in +++ b/programs/winetest/Makefile.in @@ -1,5 +1,6 @@ MODULE = winetest.exe -IMPORTS = uuid comctl32 version user32 gdi32 advapi32 wsock32 msvcrt +IMPORTS = uuid comctl32 version user32 gdi32 advapi32 wsock32 msvcrt $(ZLIB_PE_LIBS) +EXTRAINCL = $(ZLIB_PE_CFLAGS) DELAYIMPORTS = ole32
EXTRADLLFLAGS = -mconsole diff --git a/programs/winetest/main.c b/programs/winetest/main.c index dc4fc4b3581..f1d9e213940 100644 --- a/programs/winetest/main.c +++ b/programs/winetest/main.c @@ -32,6 +32,7 @@ #include <commctrl.h> #include <winternl.h> #include <mshtml.h> +#include <zlib.h>
#include "winetest.h" #include "resource.h" @@ -655,11 +656,45 @@ static void* extract_rcdata (LPCSTR name, LPCSTR type, DWORD* size) return addr; }
+static void *zalloc( void *priv, unsigned int items, unsigned int sz ) +{ + return malloc( items * sz ); +} + +static void zfree( void *priv, void *addr ) +{ + free( addr ); +} + +static void *decompress( const char *res_name, UINT size, + const void *comp, UINT comp_size ) +{ + z_stream z = {.next_in = (BYTE *)comp, .avail_in = comp_size, + .zalloc = zalloc, .zfree = zfree}; + BYTE *data = malloc( size ); + int res; + + res = inflateInit( &z ); + if (res != Z_OK) + report( R_FATAL, "Can't decompress test resource %s: %d", + res_name, GetLastError() ); + + do + { + z.next_out = data + z.total_out; + z.avail_out = size - z.total_out; + res = inflate( &z, Z_FINISH ); + } while (z.avail_in && res == Z_STREAM_END); + + if (res != Z_STREAM_END) inflateEnd( &z ); + return data; +} + /* Fills in the name and exename fields */ static void extract_test (struct wine_test *test, const char *dir, LPSTR res_name) { - BYTE* code; + BYTE* code, *buffer = NULL; DWORD size; char *exepos; HANDLE hfile; @@ -668,6 +703,14 @@ extract_test (struct wine_test *test, const char *dir, LPSTR res_name) code = extract_rcdata (res_name, "TESTRES", &size); if (!code) report (R_FATAL, "Can't find test resource %s: %d", res_name, GetLastError ()); + if (*(DWORD *)code == 0) + { + DWORD comp_size = size - 8; + size = *(DWORD *)(code + 4); + buffer = decompress( res_name, size, code + 8, comp_size ); + code = buffer; + } + test->name = xstrdup( res_name ); test->exename = strmake (NULL, "%s\%s", dir, test->name); exepos = strstr (test->name, testexe); @@ -685,6 +728,7 @@ extract_test (struct wine_test *test, const char *dir, LPSTR res_name) report (R_FATAL, "Failed to write file %s.", test->exename);
CloseHandle(hfile); + free( buffer ); }
static HANDLE get_admin_token(void) diff --git a/tools/makedep.c b/tools/makedep.c index e8ffd2c8395..422a4514eeb 100644 --- a/tools/makedep.c +++ b/tools/makedep.c @@ -3670,7 +3670,7 @@ static void output_test_module( struct makefile *make, unsigned int arch )
output( "programs/winetest/%s%s_test.res: %s\n", arch_dirs[arch], basemodule, obj_dir_path( make, stripped )); - output( "\t%secho "%s_test.exe TESTRES \"%s\"" | %s -u -o $@\n", cmd_prefix( "WRC" ), + output( "\t%secho "%s_test.exe TESTRES \"%s\"" | %s -z -u -o $@\n", cmd_prefix( "WRC" ), basemodule, obj_dir_path( make, stripped ), tools_path( make, "wrc" ));
if (make->disabled[arch] || (parent && parent->disabled[arch]))