Modularized CallFrom/To16 routines. Adapted dependent routines,
16-bit snoop/relay debugging, and make rules.
diff --git a/include/builtin16.h b/include/builtin16.h
new file mode 100644
index 0000000..f905bea
--- /dev/null
+++ b/include/builtin16.h
@@ -0,0 +1,63 @@
+/*
+ * Win16 built-in DLLs definitions
+ *
+ * Copyright 1999 Ulrich Weigand
+ */
+
+#ifndef __WINE_BUILTIN16_H
+#define __WINE_BUILTIN16_H
+
+#include "windef.h"
+
+#include "pshpack1.h"
+
+typedef struct
+{
+ WORD pushw_bp; /* pushw %bp */
+ BYTE pushl; /* pushl $target */
+ DWORD target;
+ BYTE lcall; /* lcall __FLATCS__:relay */
+ DWORD relay;
+ WORD flatcs;
+} STD_ENTRYPOINT16;
+
+typedef struct
+{
+ WORD movw_ax; /* movw $<ax>, %ax */
+ WORD ax;
+ WORD movw_dx; /* movw $<dx>, %dx */
+ WORD dx;
+ WORD lret; /* lret $<args> */
+ WORD args;
+ WORD nopnop; /* nop; nop */
+} RET_ENTRYPOINT16;
+
+typedef union
+{
+ STD_ENTRYPOINT16 std;
+ RET_ENTRYPOINT16 ret;
+} ENTRYPOINT16;
+
+#define EP_STD( target, relay ) \
+ { std: { 0x5566, 0x68, (DWORD)(target), 0x9a, (DWORD)(relay), __FLATCS__ } }
+
+#define EP_RET( retval, nargs ) \
+ { ret: { 0xb866, LOWORD(retval), 0xba66, HIWORD(retval), \
+ (nargs)? 0xca66 : 0xcb66, (nargs)? (nargs) : 0x9090, 0x9090 } }
+
+#include "poppack.h"
+
+typedef struct
+{
+ const char *name; /* DLL name */
+ void *module_start; /* 32-bit address of the module data */
+ int module_size; /* Size of the module data */
+ const BYTE *code_start; /* 32-bit address of DLL code */
+ const BYTE *data_start; /* 32-bit address of DLL data */
+} WIN16_DESCRIPTOR;
+
+
+extern void RELAY_Unimplemented16(void);
+
+
+#endif /* __WINE_BUILTIN16_H */
diff --git a/include/callback.h b/include/callback.h
index bb3dae3..34e03b8 100644
--- a/include/callback.h
+++ b/include/callback.h
@@ -20,53 +20,53 @@
typedef struct
{
- LONG (CALLBACK *CallRegisterShortProc)( CONTEXT86 *, INT );
- LONG (CALLBACK *CallRegisterLongProc)( CONTEXT86 *, INT );
- VOID (CALLBACK *CallFrom16WndProc)(void);
- LRESULT (CALLBACK *CallWndProc)( WNDPROC16, HWND16, UINT16,
+ LONG (*CallRegisterShortProc)( CONTEXT86 *, INT );
+ LONG (*CallRegisterLongProc)( CONTEXT86 *, INT );
+ VOID (*CallFrom16WndProc)(void);
+ LRESULT (*CallWndProc)( WNDPROC16, HWND16, UINT16,
WPARAM16, LPARAM );
- LRESULT (CALLBACK *CallDriverProc)( DRIVERPROC16, DWORD, HDRVR16,
+ LRESULT (*CallDriverProc)( DRIVERPROC16, DWORD, HDRVR16,
UINT16, LPARAM, LPARAM );
- LRESULT (CALLBACK *CallDriverCallback)( FARPROC16, HANDLE16, UINT16,
+ LRESULT (*CallDriverCallback)( FARPROC16, HANDLE16, UINT16,
DWORD, LPARAM, LPARAM );
- LRESULT (CALLBACK *CallTimeFuncProc)( FARPROC16, WORD, UINT16,
+ LRESULT (*CallTimeFuncProc)( FARPROC16, WORD, UINT16,
DWORD, LPARAM, LPARAM );
- INT16 (CALLBACK *CallWindowsExitProc)( FARPROC16, INT16 );
- INT16 (CALLBACK *CallWordBreakProc)( EDITWORDBREAKPROC16, SEGPTR, INT16,
+ INT16 (*CallWindowsExitProc)( FARPROC16, INT16 );
+ INT16 (*CallWordBreakProc)( EDITWORDBREAKPROC16, SEGPTR, INT16,
INT16, INT16 );
- VOID (CALLBACK *CallBootAppProc)( FARPROC16, HANDLE16, HFILE16 );
- WORD (CALLBACK *CallLoadAppSegProc)( FARPROC16, HANDLE16, HFILE16, WORD );
- WORD (CALLBACK *CallLocalNotifyFunc)( FARPROC16, WORD, HLOCAL16, WORD );
- HGLOBAL16 (CALLBACK *CallResourceHandlerProc)( FARPROC16, HGLOBAL16, HMODULE16, HRSRC16 );
- DWORD (CALLBACK *CallWOWCallbackProc)( FARPROC16, DWORD );
- BOOL (CALLBACK *CallWOWCallback16Ex)( FARPROC16, DWORD, DWORD, LPVOID,
+ VOID (*CallBootAppProc)( FARPROC16, HANDLE16, HFILE16 );
+ WORD (*CallLoadAppSegProc)( FARPROC16, HANDLE16, HFILE16, WORD );
+ WORD (*CallLocalNotifyFunc)( FARPROC16, WORD, HLOCAL16, WORD );
+ HGLOBAL16 (*CallResourceHandlerProc)( FARPROC16, HGLOBAL16, HMODULE16, HRSRC16 );
+ DWORD (*CallWOWCallbackProc)( FARPROC16, DWORD );
+ BOOL (*CallWOWCallback16Ex)( FARPROC16, DWORD, DWORD, LPVOID,
LPDWORD );
- DWORD (CALLBACK *CallUTProc)( FARPROC16, DWORD, DWORD );
- LRESULT (CALLBACK *CallASPIPostProc)( FARPROC16, SEGPTR );
+ DWORD (*CallUTProc)( FARPROC16, DWORD, DWORD );
+ LRESULT (*CallASPIPostProc)( FARPROC16, SEGPTR );
/* Following are the graphics driver callbacks */
- WORD (CALLBACK *CallDrvControlProc)( FARPROC16, SEGPTR, WORD,
+ WORD (*CallDrvControlProc)( FARPROC16, SEGPTR, WORD,
SEGPTR, SEGPTR );
- WORD (CALLBACK *CallDrvEnableProc)( FARPROC16, SEGPTR, WORD, SEGPTR,
+ WORD (*CallDrvEnableProc)( FARPROC16, SEGPTR, WORD, SEGPTR,
SEGPTR, SEGPTR );
- WORD (CALLBACK *CallDrvEnumDFontsProc)( FARPROC16, SEGPTR, SEGPTR,
+ WORD (*CallDrvEnumDFontsProc)( FARPROC16, SEGPTR, SEGPTR,
FARPROC16, SEGPTR );
- WORD (CALLBACK *CallDrvEnumObjProc)( FARPROC16, SEGPTR, WORD, FARPROC16,
+ WORD (*CallDrvEnumObjProc)( FARPROC16, SEGPTR, WORD, FARPROC16,
SEGPTR );
- WORD (CALLBACK *CallDrvOutputProc)( FARPROC16, SEGPTR, WORD, WORD, SEGPTR,
+ WORD (*CallDrvOutputProc)( FARPROC16, SEGPTR, WORD, WORD, SEGPTR,
SEGPTR, SEGPTR, SEGPTR, SEGPTR );
- DWORD (CALLBACK *CallDrvRealizeProc)( FARPROC16, SEGPTR, WORD, SEGPTR,
+ DWORD (*CallDrvRealizeProc)( FARPROC16, SEGPTR, WORD, SEGPTR,
SEGPTR, SEGPTR );
- WORD (CALLBACK *CallDrvStretchBltProc)( FARPROC16, SEGPTR, WORD, WORD,
+ WORD (*CallDrvStretchBltProc)( FARPROC16, SEGPTR, WORD, WORD,
WORD, WORD, SEGPTR, WORD, WORD,
WORD, WORD, DWORD, SEGPTR, SEGPTR,
SEGPTR );
- DWORD (CALLBACK *CallDrvExtTextOutProc)( FARPROC16, SEGPTR, WORD, WORD,
+ DWORD (*CallDrvExtTextOutProc)( FARPROC16, SEGPTR, WORD, WORD,
SEGPTR, SEGPTR, INT16, SEGPTR,
SEGPTR, SEGPTR, SEGPTR, SEGPTR,
WORD );
- WORD (CALLBACK *CallDrvGetCharWidthProc)( FARPROC16, SEGPTR, SEGPTR, WORD,
+ WORD (*CallDrvGetCharWidthProc)( FARPROC16, SEGPTR, SEGPTR, WORD,
WORD, SEGPTR, SEGPTR, SEGPTR );
- BOOL16 (CALLBACK *CallDrvAbortProc)( FARPROC16, HDC16, INT16 );
+ BOOL16 (*CallDrvAbortProc)( FARPROC16, HDC16, INT16 );
} CALLBACKS_TABLE;
extern const CALLBACKS_TABLE *Callbacks;
diff --git a/include/module.h b/include/module.h
index 10e302e..fdd1c55 100644
--- a/include/module.h
+++ b/include/module.h
@@ -235,7 +235,7 @@
/* if1632/builtin.c */
extern BOOL BUILTIN_Init(void);
extern HMODULE16 BUILTIN_LoadModule( LPCSTR name, BOOL force );
-extern LPCSTR BUILTIN_GetEntryPoint16( WORD cs, WORD ip, WORD *pOrd );
+extern LPCSTR BUILTIN_GetEntryPoint16( WORD cs, WORD ip, LPSTR name, WORD *pOrd );
/* relay32/builtin.c */
extern HMODULE BUILTIN32_LoadImage(LPCSTR name, OFSTRUCT *ofs);
diff --git a/include/stackframe.h b/include/stackframe.h
index 1a08630..a7b9f0b 100644
--- a/include/stackframe.h
+++ b/include/stackframe.h
@@ -32,17 +32,20 @@
typedef struct
{
STACK32FRAME *frame32; /* 00 32-bit frame from last CallTo16() */
- DWORD ebp; /* 04 full 32-bit content of ebp */
- WORD mutex_count; /* 08 Win16Mutex recursion count */
- WORD fs; /* 0a fs */
- WORD entry_ip; /* 0c ip of entry point */
- WORD ds; /* 0e ds */
- WORD entry_cs; /* 10 cs of entry point */
- WORD es; /* 12 es */
- DWORD entry_point; /* 14 32-bit entry point to call */
- WORD bp; /* 18 16-bit bp */
- WORD ip; /* 1a return address */
- WORD cs; /* 1c */
+ DWORD edx; /* 04 saved registers */
+ DWORD ecx; /* 08 */
+ DWORD ebp; /* 0c */
+ WORD ds; /* 10 */
+ WORD es; /* 12 */
+ WORD fs; /* 14 */
+ WORD gs; /* 16 */
+ DWORD relay; /* 18 address of argument relay stub */
+ DWORD entry_ip; /* 1c ip of entry point */
+ DWORD entry_cs; /* 20 cs of entry point */
+ DWORD entry_point; /* 24 API entry point to call, reused as mutex count */
+ WORD bp; /* 28 16-bit stack frame chain */
+ WORD ip; /* 2a return address */
+ WORD cs; /* 2c */
} STACK16FRAME;
#include "poppack.h"