Make snoop code take ordinal base into account.
diff --git a/include/snoop.h b/include/snoop.h index 76d1cf3..6fd85b1 100644 --- a/include/snoop.h +++ b/include/snoop.h
@@ -6,7 +6,7 @@ #include "module.h" -extern void SNOOP_RegisterDLL(HMODULE,LPCSTR,DWORD); +extern void SNOOP_RegisterDLL(HMODULE,LPCSTR,DWORD,DWORD); extern FARPROC SNOOP_GetProcAddress(HMODULE,LPCSTR,DWORD,FARPROC); extern void SNOOP16_RegisterDLL(NE_MODULE*,LPCSTR); extern FARPROC16 SNOOP16_GetProcAddress16(HMODULE16,DWORD,FARPROC16);
diff --git a/loader/elf.c b/loader/elf.c index 47b1128..4729531 100644 --- a/loader/elf.c +++ b/loader/elf.c
@@ -162,7 +162,7 @@ hmod = ELF_CreateDummyModule( t, modname ); - SNOOP_RegisterDLL(hmod,libname,STUBSIZE/sizeof(ELF_STDCALL_STUB)); + SNOOP_RegisterDLL(hmod,libname,0,STUBSIZE/sizeof(ELF_STDCALL_STUB)); wm = PE_CreateModule( hmod, libname, 0, 0, FALSE ); wm->find_export = ELF_FindExportedFunction;
diff --git a/loader/pe_image.c b/loader/pe_image.c index a704354..001b3df 100644 --- a/loader/pe_image.c +++ b/loader/pe_image.c
@@ -115,13 +115,13 @@ } } -/* Look up the specified function or ordinal in the exportlist: +/* Look up the specified function or ordinal in the export list: * If it is a string: - * - look up the name in the Name list. + * - look up the name in the name list. * - look up the ordinal with that index. * - use the ordinal as offset into the functionlist - * If it is a ordinal: - * - use ordinal-pe_export->Base as offset into the functionlist + * If it is an ordinal: + * - use ordinal-pe_export->Base as offset into the function list */ static FARPROC PE_FindExportedFunction( WINE_MODREF *wm, /* [in] WINE modreference */ @@ -656,7 +656,7 @@ } if (pe_export) - SNOOP_RegisterDLL( hModule, wm->modname, pe_export->NumberOfFunctions ); + SNOOP_RegisterDLL( hModule, wm->modname, pe_export->Base, pe_export->NumberOfFunctions ); /* Send DLL load event */ /* we don't need to send a dll event for the main exe */
diff --git a/relay32/snoop.c b/relay32/snoop.c index 97c1c5b..56c9fea 100644 --- a/relay32/snoop.c +++ b/relay32/snoop.c
@@ -59,6 +59,7 @@ HMODULE hmod; SNOOP_FUN *funs; LPCSTR name; + DWORD ordbase; DWORD nrofordinals; struct tagSNOOP_DLL *next; } SNOOP_DLL; @@ -126,7 +127,7 @@ } void -SNOOP_RegisterDLL(HMODULE hmod,LPCSTR name,DWORD nrofordinals) { +SNOOP_RegisterDLL(HMODULE hmod,LPCSTR name,DWORD ordbase,DWORD nrofordinals) { SNOOP_DLL **dll = &(firstdll); char *s; @@ -139,6 +140,7 @@ *dll = (SNOOP_DLL*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(SNOOP_DLL)); (*dll)->next = NULL; (*dll)->hmod = hmod; + (*dll)->ordbase = ordbase; (*dll)->nrofordinals = nrofordinals; (*dll)->name = HEAP_strdupA(GetProcessHeap(),0,name); if ((s=strrchr((*dll)->name,'.'))) @@ -322,7 +324,7 @@ context->Eip = (DWORD)fun->origfun; - DPRINTF("%08lx:CALL %s.%ld: %s(",GetCurrentThreadId(),dll->name,ordinal,fun->name); + DPRINTF("%08lx:CALL %s.%ld: %s(",GetCurrentThreadId(),dll->name,dll->ordbase+ordinal,fun->name); if (fun->nrofargs>0) { max = fun->nrofargs; if (max>16) max=16; for (i=0;i<max;i++) @@ -355,7 +357,7 @@ DPRINTF("%08lx:RET %s.%ld: %s(", GetCurrentThreadId(), - ret->dll->name,ret->ordinal,ret->dll->funs[ret->ordinal].name); + ret->dll->name,ret->dll->ordbase+ret->ordinal,ret->dll->funs[ret->ordinal].name); max = ret->dll->funs[ret->ordinal].nrofargs; if (max>16) max=16; @@ -368,7 +370,7 @@ } else DPRINTF("%08lx:RET %s.%ld: %s() retval = %08lx ret=%08lx tid=%08lx\n", GetCurrentThreadId(), - ret->dll->name,ret->ordinal,ret->dll->funs[ret->ordinal].name, + ret->dll->name,ret->dll->ordbase+ret->ordinal,ret->dll->funs[ret->ordinal].name, context->Eax, (DWORD)ret->origreturn, GetCurrentThreadId()); ret->origreturn = NULL; /* mark as empty */ }