cabinet.Extract

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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;

[Index of Archives]     [Gimp for Windows]     [Red Hat]     [Samba]     [Yosemite Camping]     [Graphics Cards]     [Wine Home]

  Powered by Linux