Alexandre Julliard | 121bd98 | 1993-07-08 17:37:25 +0000 | [diff] [blame] | 1 | /* |
Alexandre Julliard | ca22b33 | 1996-07-12 19:02:39 +0000 | [diff] [blame] | 2 | * Callback functions |
Alexandre Julliard | fa68b75 | 1995-04-03 16:55:37 +0000 | [diff] [blame] | 3 | * |
| 4 | * Copyright 1995 Alexandre Julliard |
Alexandre Julliard | 121bd98 | 1993-07-08 17:37:25 +0000 | [diff] [blame] | 5 | */ |
| 6 | |
Alexandre Julliard | f1aa303 | 1996-08-05 17:42:43 +0000 | [diff] [blame] | 7 | #ifndef __WINE_CALLBACK_H |
| 8 | #define __WINE_CALLBACK_H |
Alexandre Julliard | 121bd98 | 1993-07-08 17:37:25 +0000 | [diff] [blame] | 9 | |
Jim Aston | 2e1cafa | 1999-03-14 16:35:05 +0000 | [diff] [blame] | 10 | #include "windef.h" |
Alexandre Julliard | 2197901 | 1997-03-05 08:22:35 +0000 | [diff] [blame] | 11 | #include "winnt.h" |
Jeremy White | d3e22d9 | 2000-02-10 19:03:02 +0000 | [diff] [blame] | 12 | #include "wingdi.h" |
Michael Veksler | ca1bc86 | 1999-01-01 18:57:33 +0000 | [diff] [blame] | 13 | #include "wine/winuser16.h" |
Alexandre Julliard | 121bd98 | 1993-07-08 17:37:25 +0000 | [diff] [blame] | 14 | |
Ulrich Weigand | 7e85ea7 | 2000-06-04 01:35:43 +0000 | [diff] [blame] | 15 | extern void SYSDEPS_SwitchToThreadStack( void (*func)(void) ) WINE_NORETURN; |
| 16 | extern int SYSDEPS_CallOnLargeStack( int (*func)(void *), void *arg ); |
Alexandre Julliard | 670cdc4 | 1997-08-24 16:00:30 +0000 | [diff] [blame] | 17 | |
Ulrich Weigand | 7e85ea7 | 2000-06-04 01:35:43 +0000 | [diff] [blame] | 18 | #define CALL_LARGE_STACK( func, arg ) \ |
| 19 | SYSDEPS_CallOnLargeStack( (int (*)(void *))(func), (void *)(arg) ) |
Alexandre Julliard | a2f2e01 | 1995-06-06 16:40:35 +0000 | [diff] [blame] | 20 | |
Huw D M Davies | 304d9a4 | 1999-09-13 15:15:45 +0000 | [diff] [blame] | 21 | typedef void (*RELAY)(); |
| 22 | extern FARPROC THUNK_Alloc( FARPROC16 func, RELAY relay ); |
| 23 | extern void THUNK_Free( FARPROC thunk ); |
Alexandre Julliard | b445952 | 2000-04-15 21:00:55 +0000 | [diff] [blame] | 24 | extern BOOL THUNK_Init(void); |
| 25 | extern void THUNK_InitCallout(void); |
| 26 | |
Alexandre Julliard | 491502b | 1997-11-01 19:08:16 +0000 | [diff] [blame] | 27 | typedef struct |
| 28 | { |
Francois Gouget | ae41e8c | 2000-06-11 20:07:58 +0000 | [diff] [blame] | 29 | LONG CALLBACK (*CallRegisterShortProc)( CONTEXT86 *, INT ); |
| 30 | LONG CALLBACK (*CallRegisterLongProc)( CONTEXT86 *, INT ); |
| 31 | INT16 CALLBACK (*CallWindowsExitProc)( FARPROC16, INT16 ); |
| 32 | INT16 CALLBACK (*CallWordBreakProc)( EDITWORDBREAKPROC16, SEGPTR, INT16, |
Alexandre Julliard | 491502b | 1997-11-01 19:08:16 +0000 | [diff] [blame] | 33 | INT16, INT16 ); |
Francois Gouget | ae41e8c | 2000-06-11 20:07:58 +0000 | [diff] [blame] | 34 | VOID CALLBACK (*CallBootAppProc)( FARPROC16, HANDLE16, HFILE16 ); |
| 35 | WORD CALLBACK (*CallLoadAppSegProc)( FARPROC16, HANDLE16, HFILE16, WORD ); |
| 36 | WORD CALLBACK (*CallLocalNotifyFunc)( FARPROC16, WORD, HLOCAL16, WORD ); |
| 37 | HGLOBAL16 CALLBACK (*CallResourceHandlerProc)( FARPROC16, HGLOBAL16, HMODULE16, HRSRC16 ); |
| 38 | DWORD CALLBACK (*CallUTProc)( FARPROC16, DWORD, DWORD ); |
| 39 | LRESULT CALLBACK (*CallASPIPostProc)( FARPROC16, SEGPTR ); |
Alexandre Julliard | 491502b | 1997-11-01 19:08:16 +0000 | [diff] [blame] | 40 | } CALLBACKS_TABLE; |
Alexandre Julliard | 121bd98 | 1993-07-08 17:37:25 +0000 | [diff] [blame] | 41 | |
Alexandre Julliard | 491502b | 1997-11-01 19:08:16 +0000 | [diff] [blame] | 42 | extern const CALLBACKS_TABLE *Callbacks; |
Alexandre Julliard | fa68b75 | 1995-04-03 16:55:37 +0000 | [diff] [blame] | 43 | |
Ulrich Weigand | 61439d2 | 1998-12-24 15:12:20 +0000 | [diff] [blame] | 44 | typedef struct |
| 45 | { |
| 46 | BOOL16 WINAPI (*PeekMessage16)( LPMSG16 msg, HWND16 hwnd, |
| 47 | UINT16 first, UINT16 last, UINT16 flags ); |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 48 | BOOL WINAPI (*PeekMessageA)( LPMSG lpmsg, HWND hwnd, |
| 49 | UINT min, UINT max, UINT wRemoveMsg ); |
| 50 | BOOL WINAPI (*PeekMessageW)( LPMSG lpmsg, HWND hwnd, |
| 51 | UINT min, UINT max, UINT wRemoveMsg ); |
Ulrich Weigand | 61439d2 | 1998-12-24 15:12:20 +0000 | [diff] [blame] | 52 | |
| 53 | BOOL16 WINAPI (*GetMessage16)( SEGPTR msg, HWND16 hwnd, |
| 54 | UINT16 first, UINT16 last ); |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 55 | BOOL WINAPI (*GetMessageA)( MSG* lpmsg, HWND hwnd, |
| 56 | UINT min, UINT max ); |
| 57 | BOOL WINAPI (*GetMessageW)( MSG* lpmsg, HWND hwnd, |
| 58 | UINT min, UINT max ); |
Ulrich Weigand | 61439d2 | 1998-12-24 15:12:20 +0000 | [diff] [blame] | 59 | |
| 60 | LRESULT WINAPI (*SendMessage16)( HWND16 hwnd, UINT16 msg, |
| 61 | WPARAM16 wParam, LPARAM lParam ); |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 62 | LRESULT WINAPI (*SendMessageA)( HWND hwnd, UINT msg, |
| 63 | WPARAM wParam, LPARAM lParam ); |
| 64 | LRESULT WINAPI (*SendMessageW)( HWND hwnd, UINT msg, |
| 65 | WPARAM wParam, LPARAM lParam ); |
Ulrich Weigand | 61439d2 | 1998-12-24 15:12:20 +0000 | [diff] [blame] | 66 | |
| 67 | BOOL16 WINAPI (*PostMessage16)( HWND16 hwnd, UINT16 message, |
| 68 | WPARAM16 wParam, LPARAM lParam ); |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 69 | BOOL WINAPI (*PostMessageA)( HWND hwnd, UINT message, |
| 70 | WPARAM wParam, LPARAM lParam ); |
| 71 | BOOL WINAPI (*PostMessageW)( HWND hwnd, UINT message, |
| 72 | WPARAM wParam, LPARAM lParam ); |
Ulrich Weigand | 61439d2 | 1998-12-24 15:12:20 +0000 | [diff] [blame] | 73 | |
| 74 | BOOL16 WINAPI (*PostAppMessage16)( HTASK16 hTask, UINT16 message, |
| 75 | WPARAM16 wParam, LPARAM lParam ); |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 76 | BOOL WINAPI (*PostThreadMessageA)( DWORD idThread , UINT message, |
| 77 | WPARAM wParam, LPARAM lParam ); |
| 78 | BOOL WINAPI (*PostThreadMessageW)( DWORD idThread , UINT message, |
| 79 | WPARAM wParam, LPARAM lParam ); |
Ulrich Weigand | 61439d2 | 1998-12-24 15:12:20 +0000 | [diff] [blame] | 80 | |
| 81 | BOOL16 WINAPI (*TranslateMessage16)( const MSG16 *msg ); |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 82 | BOOL WINAPI (*TranslateMessage)( const MSG *msg ); |
Ulrich Weigand | 61439d2 | 1998-12-24 15:12:20 +0000 | [diff] [blame] | 83 | |
| 84 | LONG WINAPI (*DispatchMessage16)( const MSG16* msg ); |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 85 | LONG WINAPI (*DispatchMessageA)( const MSG* msg ); |
| 86 | LONG WINAPI (*DispatchMessageW)( const MSG* msg ); |
Ulrich Weigand | 61439d2 | 1998-12-24 15:12:20 +0000 | [diff] [blame] | 87 | |
| 88 | BOOL16 WINAPI (*RedrawWindow16)( HWND16 hwnd, const RECT16 *rectUpdate, |
| 89 | HRGN16 hrgnUpdate, UINT16 flags ); |
| 90 | |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 91 | BOOL WINAPI (*RedrawWindow)( HWND hwnd, const RECT *rectUpdate, |
| 92 | HRGN hrgnUpdate, UINT flags ); |
Ulrich Weigand | 61439d2 | 1998-12-24 15:12:20 +0000 | [diff] [blame] | 93 | |
Ulrich Weigand | e392a0c | 1999-04-01 11:44:52 +0000 | [diff] [blame] | 94 | WORD WINAPI (*UserSignalProc)( UINT uCode, DWORD dwThreadOrProcessID, |
| 95 | DWORD dwFlags, HMODULE16 hModule ); |
Ulrich Weigand | 98c3053 | 1999-07-27 17:10:06 +0000 | [diff] [blame] | 96 | void WINAPI (*FinalUserInit16)( void ); |
Ulrich Weigand | e392a0c | 1999-04-01 11:44:52 +0000 | [diff] [blame] | 97 | |
Ulrich Weigand | 7366307 | 1999-04-10 16:32:45 +0000 | [diff] [blame] | 98 | INT16 WINAPI (*InitApp16)( HINSTANCE16 hInst ); |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 99 | HQUEUE16 WINAPI (*InitThreadInput16)( WORD unknown, WORD flags ); |
| 100 | void WINAPI (*UserYield16)( void ); |
Ulrich Weigand | e562453 | 1999-03-10 14:06:53 +0000 | [diff] [blame] | 101 | WORD WINAPI (*DestroyIcon32)( HGLOBAL16 handle, UINT16 flags ); |
Peter Ganten | 6619f5a | 2000-01-01 22:38:20 +0000 | [diff] [blame] | 102 | DWORD WINAPI (*WaitForInputIdle)( HANDLE hProcess, DWORD dwTimeOut ); |
Alexandre Julliard | d6c0d86 | 2000-03-24 21:38:30 +0000 | [diff] [blame] | 103 | |
| 104 | INT WINAPI (*MessageBoxA)( HWND hWnd, LPCSTR text, LPCSTR title, UINT type ); |
| 105 | INT WINAPI (*MessageBoxW)( HWND hwnd, LPCWSTR text, LPCWSTR title, UINT type ); |
Ulrich Weigand | 61439d2 | 1998-12-24 15:12:20 +0000 | [diff] [blame] | 106 | |
| 107 | } CALLOUT_TABLE; |
| 108 | |
| 109 | extern CALLOUT_TABLE Callout; |
| 110 | |
Alexandre Julliard | d6c0d86 | 2000-03-24 21:38:30 +0000 | [diff] [blame] | 111 | #include "pshpack1.h" |
| 112 | |
| 113 | typedef struct tagTHUNK |
| 114 | { |
| 115 | BYTE popl_eax; /* 0x58 popl %eax (return address)*/ |
| 116 | BYTE pushl_func; /* 0x68 pushl $proc */ |
| 117 | FARPROC16 proc WINE_PACKED; |
| 118 | BYTE pushl_eax; /* 0x50 pushl %eax */ |
| 119 | BYTE jmp; /* 0xe9 jmp relay (relative jump)*/ |
| 120 | RELAY relay WINE_PACKED; |
| 121 | struct tagTHUNK *next WINE_PACKED; |
| 122 | DWORD magic; |
| 123 | } THUNK; |
| 124 | |
| 125 | #include "poppack.h" |
| 126 | |
| 127 | #define CALLTO16_THUNK_MAGIC 0x54484e4b /* "THNK" */ |
| 128 | |
| 129 | #define DECL_THUNK(aname,aproc,arelay) \ |
| 130 | THUNK aname; \ |
| 131 | aname.popl_eax = 0x58; \ |
| 132 | aname.pushl_func = 0x68; \ |
| 133 | aname.proc = (FARPROC) (aproc); \ |
| 134 | aname.pushl_eax = 0x50; \ |
| 135 | aname.jmp = 0xe9; \ |
| 136 | aname.relay = (RELAY)((char *)(arelay) - (char *)(&(aname).next)); \ |
| 137 | aname.next = NULL; \ |
| 138 | aname.magic = CALLTO16_THUNK_MAGIC; |
Ulrich Weigand | 61439d2 | 1998-12-24 15:12:20 +0000 | [diff] [blame] | 139 | |
Alexandre Julliard | f1aa303 | 1996-08-05 17:42:43 +0000 | [diff] [blame] | 140 | #endif /* __WINE_CALLBACK_H */ |