Zebediah Figura : krnl386: Call generated 16-bit entry points from the snoop thunks.
Alexandre Julliard
julliard at winehq.org
Wed Sep 29 15:54:08 CDT 2021
Module: wine
Branch: master
Commit: b035fe601dc61395c782f462d5072c9df87db7a9
URL: https://source.winehq.org/git/wine.git/?a=commit;h=b035fe601dc61395c782f462d5072c9df87db7a9
Author: Zebediah Figura <zfigura at codeweavers.com>
Date: Tue Sep 28 20:39:05 2021 -0500
krnl386: Call generated 16-bit entry points from the snoop thunks.
Instead of manually building a STACK16FRAME.
Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/krnl386.exe16/krnl386.exe16.spec | 4 +++
dlls/krnl386.exe16/snoop.c | 56 ++++++-----------------------------
2 files changed, 13 insertions(+), 47 deletions(-)
diff --git a/dlls/krnl386.exe16/krnl386.exe16.spec b/dlls/krnl386.exe16/krnl386.exe16.spec
index c6ffd9df701..6a55aad78f8 100644
--- a/dlls/krnl386.exe16/krnl386.exe16.spec
+++ b/dlls/krnl386.exe16/krnl386.exe16.spec
@@ -747,3 +747,7 @@
# VxDs
@ cdecl -arch=win32 -private __wine_vxd_open(wstr long ptr)
@ cdecl -arch=win32 -private __wine_vxd_get_proc(long)
+
+# Snoop support
+2001 pascal -register __wine_snoop_entry()
+2002 pascal -register __wine_snoop_return()
diff --git a/dlls/krnl386.exe16/snoop.c b/dlls/krnl386.exe16/snoop.c
index 170796da390..d5c528d3382 100644
--- a/dlls/krnl386.exe16/snoop.c
+++ b/dlls/krnl386.exe16/snoop.c
@@ -34,13 +34,10 @@ WINE_DEFAULT_DEBUG_CHANNEL(snoop);
#include "pshpack1.h"
-static void WINAPI SNOOP16_Entry(FARPROC proc, LPBYTE args, CONTEXT *context);
-static void WINAPI SNOOP16_Return(FARPROC proc, LPBYTE args, CONTEXT *context);
-
typedef struct tagSNOOP16_FUN {
/* code part */
BYTE lcall; /* 0x9a call absolute with segment */
- DWORD snr;
+ FARPROC16 snoop_entry;
/* unreached */
int nrofargs;
FARPROC16 origfun;
@@ -58,7 +55,7 @@ typedef struct tagSNOOP16_DLL {
typedef struct tagSNOOP16_RETURNENTRY {
/* code part */
BYTE lcall; /* 0x9a call absolute with segment */
- DWORD snr;
+ FARPROC16 snoop_return;
/* unreached */
FARPROC16 origreturn;
SNOOP16_DLL *dll;
@@ -73,24 +70,10 @@ typedef struct tagSNOOP16_RETURNENTRIES {
struct tagSNOOP16_RETURNENTRIES *next;
} SNOOP16_RETURNENTRIES;
-typedef struct tagSNOOP16_RELAY {
- WORD pushbp; /* 0x5566 */
- BYTE pusheax; /* 0x50 */
- WORD pushax; /* 0x5066 */
- BYTE pushl; /* 0x68 */
- DWORD realfun; /* SNOOP16_Return */
- BYTE lcall; /* 0x9a call absolute with segment */
- DWORD callfromregs;
- WORD seg;
- WORD lret; /* 0xcb66 */
-} SNOOP16_RELAY;
-
#include "poppack.h"
static SNOOP16_DLL *firstdll = NULL;
static SNOOP16_RETURNENTRIES *firstrets = NULL;
-static SNOOP16_RELAY *snr;
-static HANDLE16 xsnr = 0;
void
SNOOP16_RegisterDLL(HMODULE16 hModule,LPCSTR name) {
@@ -102,29 +85,6 @@ SNOOP16_RegisterDLL(HMODULE16 hModule,LPCSTR name) {
TRACE("hmod=%x, name=%s\n", hModule, name);
- if (!snr) {
- xsnr=GLOBAL_Alloc(GMEM_ZEROINIT,2*sizeof(*snr),0,LDT_FLAGS_CODE | LDT_FLAGS_32BIT);
- snr = GlobalLock16(xsnr);
- snr[0].pushbp = 0x5566;
- snr[0].pusheax = 0x50;
- snr[0].pushax = 0x5066;
- snr[0].pushl = 0x68;
- snr[0].realfun = (DWORD)SNOOP16_Entry;
- snr[0].lcall = 0x9a;
- snr[0].callfromregs = (DWORD)__wine_call_from_16_regs;
- snr[0].seg = get_cs();
- snr[0].lret = 0xcb66;
-
- snr[1].pushbp = 0x5566;
- snr[1].pusheax = 0x50;
- snr[1].pushax = 0x5066;
- snr[1].pushl = 0x68;
- snr[1].realfun = (DWORD)SNOOP16_Return;
- snr[1].lcall = 0x9a;
- snr[1].callfromregs = (DWORD)__wine_call_from_16_regs;
- snr[1].seg = get_cs();
- snr[1].lret = 0xcb66;
- }
while (*dll) {
if ((*dll)->hmod == hModule)
{
@@ -181,7 +141,7 @@ SNOOP16_GetProcAddress16(HMODULE16 hmod,DWORD ordinal,FARPROC16 origfun) {
fun = dll->funs+ordinal;
/* already done? */
fun->lcall = 0x9a;
- fun->snr = MAKELONG(0,xsnr);
+ fun->snoop_entry = GetProcAddress16( GetModuleHandle16( "KERNEL" ), "__wine_snoop_entry" );
fun->origfun = origfun;
if (fun->name)
return (FARPROC16)(SEGPTR)MAKELONG(((char*)fun-(char*)dll->funs),dll->funhandle);
@@ -227,14 +187,15 @@ SNOOP16_GetProcAddress16(HMODULE16 hmod,DWORD ordinal,FARPROC16 origfun) {
}
}
fun->lcall = 0x9a;
- fun->snr = MAKELONG(0,xsnr);
+ fun->snoop_entry = GetProcAddress16( GetModuleHandle16( "KERNEL" ), "__wine_snoop_entry" );
fun->origfun = origfun;
fun->nrofargs = -1;
return (FARPROC16)(SEGPTR)MAKELONG(((char*)fun-(char*)dll->funs),dll->funhandle);
}
#define CALLER1REF (*(DWORD*)(MapSL( MAKESEGPTR(context->SegSs,LOWORD(context->Esp)+4))))
-static void WINAPI SNOOP16_Entry(FARPROC proc, LPBYTE args, CONTEXT *context) {
+void WINAPI __wine_snoop_entry( CONTEXT *context )
+{
DWORD ordinal=0;
DWORD entry=(DWORD)MapSL( MAKESEGPTR(context->SegCs,LOWORD(context->Eip)) )-5;
WORD xcs = context->SegCs;
@@ -273,7 +234,7 @@ static void WINAPI SNOOP16_Entry(FARPROC proc, LPBYTE args, CONTEXT *context) {
}
ret = &((*rets)->entry[i]);
ret->lcall = 0x9a;
- ret->snr = MAKELONG(sizeof(SNOOP16_RELAY),xsnr);
+ ret->snoop_return = GetProcAddress16( GetModuleHandle16( "KERNEL" ), "__wine_snoop_return" );
ret->origreturn = (FARPROC16)CALLER1REF;
CALLER1REF = MAKELONG((char*)&(ret->lcall)-(char*)((*rets)->entry),(*rets)->rethandle);
ret->dll = dll;
@@ -301,7 +262,8 @@ static void WINAPI SNOOP16_Entry(FARPROC proc, LPBYTE args, CONTEXT *context) {
TRACE(") ret=%04x:%04x\n",HIWORD(ret->origreturn),LOWORD(ret->origreturn));
}
-static void WINAPI SNOOP16_Return(FARPROC proc, LPBYTE args, CONTEXT *context) {
+void WINAPI __wine_snoop_return( CONTEXT *context )
+{
SNOOP16_RETURNENTRY *ret = (SNOOP16_RETURNENTRY*)((char *) MapSL( MAKESEGPTR(context->SegCs,LOWORD(context->Eip)) )-5);
/* We haven't found out the nrofargs yet. If we called a cdecl
More information about the wine-cvs
mailing list