Release 960913
[wine] / if1632 / thunk.c
1 /*
2  * Emulator thunks
3  *
4  * Copyright 1996 Alexandre Julliard
5  */
6
7 #include "windows.h"
8 #include "callback.h"
9 #include "stddebug.h"
10 #include "debug.h"
11 #include "heap.h"
12
13 typedef void (*RELAY)();
14
15 typedef struct
16 {
17     BYTE       popl_eax;           /* 0x58  popl  %eax (return address) */
18     BYTE       pushl_func;         /* 0x68  pushl $proc */
19     FARPROC32  proc WINE_PACKED;
20     BYTE       pushl_eax;          /* 0x50  pushl %eax */
21     BYTE       jmp;                /* 0xe9  jmp   relay (relative jump)*/
22     RELAY      relay WINE_PACKED;
23 } THUNK;
24
25 #define DECL_THUNK(name,proc,relay) \
26     THUNK name = { 0x58, 0x68, (FARPROC32)(proc), 0x50, 0xe9, \
27                     (RELAY)((char *)(relay) - (char *)(&(name) + 1)) }
28
29
30 /***********************************************************************
31  *           THUNK_Alloc
32  */
33 static THUNK *THUNK_Alloc( FARPROC32 func, RELAY relay )
34 {
35     THUNK *thunk = HeapAlloc( SystemHeap, 0, sizeof(*thunk) );
36     if (thunk)
37     {
38         thunk->popl_eax   = 0x58;
39         thunk->pushl_func = 0x68;
40         thunk->proc       = func;
41         thunk->pushl_eax  = 0x50;
42         thunk->jmp        = 0xe9;
43         thunk->relay      = relay;
44     }
45     return thunk;
46 }
47
48
49 /***********************************************************************
50  *           THUNK_Free
51  */
52 static void THUNK_Free( THUNK *thunk )
53 {
54     HeapFree( SystemHeap, 0, thunk );
55 }
56
57
58 /***********************************************************************
59  *           THUNK_EnumObjects16   (GDI.71)
60  */
61 INT16 THUNK_EnumObjects16( HDC16 hdc, INT16 nObjType,
62                            GOBJENUMPROC16 func, LPARAM lParam )
63 {
64     DECL_THUNK( thunk, func, CallTo16_word_ll );
65     return EnumObjects( hdc, nObjType, (GOBJENUMPROC16)&thunk, lParam );
66 }
67
68
69 /*************************************************************************
70  *           THUNK_EnumFonts16   (GDI.70)
71  */
72 INT16 THUNK_EnumFonts16( HDC16 hdc, LPCSTR lpFaceName,
73                          FONTENUMPROC16 func, LPARAM lParam )
74 {
75     DECL_THUNK( thunk, func, CallTo16_word_llwl );
76     return EnumFonts( hdc, lpFaceName, (FONTENUMPROC16)&thunk, lParam );
77 }
78
79
80 /******************************************************************
81  *           THUNK_EnumMetaFile16   (GDI.175)
82  */
83 BOOL16 THUNK_EnumMetaFile16( HDC16 hdc, HMETAFILE16 hmf,
84                              MFENUMPROC16 func, LPARAM lParam )
85 {
86     DECL_THUNK( thunk, func, CallTo16_word_wllwl );
87     return EnumMetaFile( hdc, hmf, (MFENUMPROC16)&thunk, lParam );
88 }
89
90
91 /*************************************************************************
92  *           THUNK_EnumFontFamilies16   (GDI.330)
93  */
94 INT16 THUNK_EnumFontFamilies16( HDC16 hdc, LPCSTR lpszFamily,
95                                 FONTENUMPROC16 func, LPARAM lParam )
96 {
97     DECL_THUNK( thunk, func, CallTo16_word_llwl );
98     return EnumFontFamilies( hdc, lpszFamily, (FONTENUMPROC16)&thunk, lParam );
99 }
100
101
102 /**********************************************************************
103  *           THUNK_LineDDA16   (GDI.100)
104  */
105 void THUNK_LineDDA16( INT16 nXStart, INT16 nYStart, INT16 nXEnd, INT16 nYEnd,
106                       LINEDDAPROC16 func, LPARAM lParam )
107 {
108     DECL_THUNK( thunk, func, CallTo16_word_wwl );
109     LineDDA16( nXStart, nYStart, nXEnd, nYEnd, (LINEDDAPROC16)&thunk, lParam );
110 }
111
112
113 /**********************************************************************
114  *           THUNK_LineDDA32   (GDI32.248)
115  */
116 BOOL32 THUNK_LineDDA32( INT32 nXStart, INT32 nYStart, INT32 nXEnd, INT32 nYEnd,
117                         LINEDDAPROC32 func, LPARAM lParam )
118 {
119     DECL_THUNK( thunk, func, CallTo32_3 );
120     return LineDDA32( nXStart, nYStart, nXEnd, nYEnd,
121                       (LINEDDAPROC32)&thunk, lParam );
122 }
123
124
125 /*******************************************************************
126  *           THUNK_EnumWindows16   (USER.54)
127  */
128 BOOL16 THUNK_EnumWindows16( WNDENUMPROC16 func, LPARAM lParam )
129 {
130     DECL_THUNK( thunk, func, CallTo16_word_wl );
131     return EnumWindows16( (WNDENUMPROC16)&thunk, lParam );
132 }
133
134
135 /*******************************************************************
136  *           THUNK_EnumWindows32   (USER32.192)
137  */
138 BOOL32 THUNK_EnumWindows32( WNDENUMPROC32 func, LPARAM lParam )
139 {
140     DECL_THUNK( thunk, func, CallTo32_2 );
141     return EnumWindows32( (WNDENUMPROC32)&thunk, lParam );
142 }
143
144
145 /**********************************************************************
146  *           THUNK_EnumChildWindows16   (USER.55)
147  */
148 BOOL16 THUNK_EnumChildWindows16( HWND16 parent, WNDENUMPROC16 func,
149                                  LPARAM lParam )
150 {
151     DECL_THUNK( thunk, func, CallTo16_word_wl );
152     return EnumChildWindows16( parent, (WNDENUMPROC16)&thunk, lParam );
153 }
154
155
156 /**********************************************************************
157  *           THUNK_EnumChildWindows32   (USER32.177)
158  */
159 BOOL32 THUNK_EnumChildWindows32( HWND32 parent, WNDENUMPROC32 func,
160                                  LPARAM lParam )
161 {
162     DECL_THUNK( thunk, func, CallTo32_2 );
163     return EnumChildWindows32( parent, (WNDENUMPROC32)&thunk, lParam );
164 }
165
166
167 /**********************************************************************
168  *           THUNK_EnumTaskWindows16   (USER.225)
169  */
170 BOOL16 THUNK_EnumTaskWindows16( HTASK16 hTask, WNDENUMPROC16 func,
171                                 LPARAM lParam )
172 {
173     DECL_THUNK( thunk, func, CallTo16_word_wl );
174     return EnumTaskWindows16( hTask, (WNDENUMPROC16)&thunk, lParam );
175 }
176
177
178 /**********************************************************************
179  *           THUNK_EnumThreadWindows   (USER32.189)
180  */
181 BOOL32 THUNK_EnumThreadWindows( DWORD id, WNDENUMPROC32 func, LPARAM lParam )
182 {
183     DECL_THUNK( thunk, func, CallTo32_2 );
184     return EnumThreadWindows( id, (WNDENUMPROC32)&thunk, lParam );
185 }
186
187
188 /***********************************************************************
189  *           THUNK_EnumProps16   (USER.27)
190  */
191 INT16 THUNK_EnumProps16( HWND16 hwnd, PROPENUMPROC16 func )
192 {
193     DECL_THUNK( thunk, func, CallTo16_word_wlw );
194     return EnumProps16( hwnd, (PROPENUMPROC16)&thunk );
195 }
196
197
198 /***********************************************************************
199  *           THUNK_EnumProps32A   (USER32.185)
200  */
201 INT32 THUNK_EnumProps32A( HWND32 hwnd, PROPENUMPROC32A func )
202 {
203     DECL_THUNK( thunk, func, CallTo32_3 );
204     return EnumProps32A( hwnd, (PROPENUMPROC32A)&thunk );
205 }
206
207
208 /***********************************************************************
209  *           THUNK_EnumProps32W   (USER32.188)
210  */
211 INT32 THUNK_EnumProps32W( HWND32 hwnd, PROPENUMPROC32W func )
212 {
213     DECL_THUNK( thunk, func, CallTo32_3 );
214     return EnumProps32W( hwnd, (PROPENUMPROC32W)&thunk );
215 }
216
217
218 /***********************************************************************
219  *           THUNK_EnumPropsEx32A   (USER32.186)
220  */
221 INT32 THUNK_EnumPropsEx32A( HWND32 hwnd, PROPENUMPROCEX32A func, LPARAM lParam)
222 {
223     DECL_THUNK( thunk, func, CallTo32_4 );
224     return EnumPropsEx32A( hwnd, (PROPENUMPROCEX32A)&thunk, lParam );
225 }
226
227
228 /***********************************************************************
229  *           THUNK_EnumPropsEx32W   (USER32.187)
230  */
231 INT32 THUNK_EnumPropsEx32W( HWND32 hwnd, PROPENUMPROCEX32W func, LPARAM lParam)
232 {
233     DECL_THUNK( thunk, func, CallTo32_4 );
234     return EnumPropsEx32W( hwnd, (PROPENUMPROCEX32W)&thunk, lParam );
235 }
236
237
238 /***********************************************************************
239  *           THUNK_GrayString16   (USER.185)
240  */
241 BOOL16 THUNK_GrayString16( HDC16 hdc, HBRUSH16 hbr, GRAYSTRINGPROC16 func,
242                            LPARAM lParam, INT16 cch, INT16 x, INT16 y,
243                            INT16 cx, INT16 cy )
244 {
245     DECL_THUNK( thunk, func, CallTo16_word_wlw );
246     if (!func)
247         return GrayString( hdc, hbr, NULL, lParam, cch, x, y, cx, cy );
248     else
249         return GrayString( hdc, hbr, (GRAYSTRINGPROC16)&thunk, lParam, cch,
250                            x, y, cx, cy );
251 }
252
253
254 struct thunkstruct
255 {
256         char    magic[4];
257         DWORD   x1;
258         DWORD   x2;
259 };
260
261 UINT32 ThunkConnect32( struct thunkstruct *ths, LPSTR thunkfun16,
262                        LPSTR module16, LPSTR module32, HMODULE32 hmod32,
263                        DWORD dllinitarg1 )
264 {
265         HINSTANCE16     hmm;
266
267         fprintf(stdnimp,"ThunkConnect32(<struct>,%s,%s,%s,%x,%lx)\n",
268                 thunkfun16,module32,module16,hmod32,dllinitarg1
269         );
270         fprintf(stdnimp,"       magic = %c%c%c%c\n",
271                 ths->magic[0],
272                 ths->magic[1],
273                 ths->magic[2],
274                 ths->magic[3]
275         );
276         fprintf(stdnimp,"       x1 = %lx\n",ths->x1);
277         fprintf(stdnimp,"       x2 = %lx\n",ths->x2);
278         hmm=LoadModule(module16,NULL);
279         return TRUE;
280 }