Hello, during playing with ie5.5 installer i noticed that the installing of some cab files failed directly after the extract call. Doing exactly the same extract call with the same cabinet file and the same content of the first parameter i got a crash with native cabinet dll. The debugger shows at the end of the function a "ret 8" assembler comand. This means to remove 8 words (not bytes) from the stack because the segment attribute is set to 32 bit (the pop command right before the ret is done for a 32 bit register and does not have the opcode 0x66 in front to change the register length). Therefore the function extract must have 4 parameters instead of two. The bad thing is that the installer throws an exception instead of aborting. ChangeLog -------------- the function ectract has four parameters not two
--- ../wine/dlls/cabinet/cabinet.spec 2003-12-12 23:01:09.000000000 +0100 +++ dlls/cabinet/cabinet.spec 2003-12-26 20:50:22.000000000 +0100 @@ -1,6 +1,6 @@ 1 stub GetDllVersion 2 stdcall DllGetVersion (ptr) CABINET_DllGetVersion -3 stdcall Extract(ptr str) +3 stdcall Extract(ptr str long ptr) 4 stub DeleteExtractedFiles 10 cdecl FCICreate(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr) 11 cdecl FCIAddFile(long ptr ptr long ptr ptr ptr long) --- ../wine/dlls/cabinet/cabinet_main.c 2003-09-11 00:14:05.000000000 +0200 +++ dlls/cabinet/cabinet_main.c 2003-12-26 20:49:01.000000000 +0100 @@ -73,20 +73,26 @@ * to somewhere... * * PARAMS - * unknown [IO] unknown pointer + * unknown [IO] unknown pointer to a buffer of 0x32c bytes containing + * - a unknown number at index 0x18 + * - a (source/dest?) path starting at index 0x1c * what [I] char* describing what to uncompress, I guess. + * unknown2 [IO] unknown pointer/value + * unknown3 [IO] unknown pointer to a buffer of 0x1e8 bytes containing + * - LPSTR of inf filename (terminated by two \0 ?) at idx 0x8 * * RETURNS * Success: S_OK * Failure: E_OUTOFMEMORY (?) */ -HRESULT WINAPI Extract(DWORD unknown, LPCSTR what) +HRESULT WINAPI Extract(DWORD unknown, LPCSTR what, DWORD unknown2, DWORD unknown3) { LPCSTR whatx; LPSTR dir, dirx, lastoption, x; BOOL updatelastoption; - TRACE("(unknown == %0lx, what == %s)\n", unknown, debugstr_a(what)); + TRACE("(unknown == %0lx, what == %s, unknown2 == %0lx, unknown3 == %0lx)\n", + unknown, debugstr_a(what), unknown2, unknown3); dir = LocalAlloc(LPTR, strlen(what)); if (!dir) return E_OUTOFMEMORY;