4 * Copyright 1996 Alexandre Julliard
13 typedef void (*RELAY)();
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;
25 #define DECL_THUNK(name,proc,relay) \
26 THUNK name = { 0x58, 0x68, (FARPROC32)(proc), 0x50, 0xe9, \
27 (RELAY)((char *)(relay) - (char *)(&(name) + 1)) }
30 /***********************************************************************
33 static THUNK *THUNK_Alloc( FARPROC32 func, RELAY relay )
35 THUNK *thunk = HeapAlloc( SystemHeap, 0, sizeof(*thunk) );
38 thunk->popl_eax = 0x58;
39 thunk->pushl_func = 0x68;
41 thunk->pushl_eax = 0x50;
49 /***********************************************************************
52 static void THUNK_Free( THUNK *thunk )
54 HeapFree( SystemHeap, 0, thunk );
58 /***********************************************************************
59 * THUNK_EnumObjects16 (GDI.71)
61 INT16 THUNK_EnumObjects16( HDC16 hdc, INT16 nObjType,
62 GOBJENUMPROC16 func, LPARAM lParam )
64 DECL_THUNK( thunk, func, CallTo16_word_ll );
65 return EnumObjects( hdc, nObjType, (GOBJENUMPROC16)&thunk, lParam );
69 /*************************************************************************
70 * THUNK_EnumFonts16 (GDI.70)
72 INT16 THUNK_EnumFonts16( HDC16 hdc, LPCSTR lpFaceName,
73 FONTENUMPROC16 func, LPARAM lParam )
75 DECL_THUNK( thunk, func, CallTo16_word_llwl );
76 return EnumFonts( hdc, lpFaceName, (FONTENUMPROC16)&thunk, lParam );
80 /******************************************************************
81 * THUNK_EnumMetaFile16 (GDI.175)
83 BOOL16 THUNK_EnumMetaFile16( HDC16 hdc, HMETAFILE16 hmf,
84 MFENUMPROC16 func, LPARAM lParam )
86 DECL_THUNK( thunk, func, CallTo16_word_wllwl );
87 return EnumMetaFile( hdc, hmf, (MFENUMPROC16)&thunk, lParam );
91 /*************************************************************************
92 * THUNK_EnumFontFamilies16 (GDI.330)
94 INT16 THUNK_EnumFontFamilies16( HDC16 hdc, LPCSTR lpszFamily,
95 FONTENUMPROC16 func, LPARAM lParam )
97 DECL_THUNK( thunk, func, CallTo16_word_llwl );
98 return EnumFontFamilies( hdc, lpszFamily, (FONTENUMPROC16)&thunk, lParam );
102 /**********************************************************************
103 * THUNK_LineDDA16 (GDI.100)
105 void THUNK_LineDDA16( INT16 nXStart, INT16 nYStart, INT16 nXEnd, INT16 nYEnd,
106 LINEDDAPROC16 func, LPARAM lParam )
108 DECL_THUNK( thunk, func, CallTo16_word_wwl );
109 LineDDA16( nXStart, nYStart, nXEnd, nYEnd, (LINEDDAPROC16)&thunk, lParam );
113 /**********************************************************************
114 * THUNK_LineDDA32 (GDI32.248)
116 BOOL32 THUNK_LineDDA32( INT32 nXStart, INT32 nYStart, INT32 nXEnd, INT32 nYEnd,
117 LINEDDAPROC32 func, LPARAM lParam )
119 DECL_THUNK( thunk, func, CallTo32_3 );
120 return LineDDA32( nXStart, nYStart, nXEnd, nYEnd,
121 (LINEDDAPROC32)&thunk, lParam );
125 /*******************************************************************
126 * THUNK_EnumWindows16 (USER.54)
128 BOOL16 THUNK_EnumWindows16( WNDENUMPROC16 func, LPARAM lParam )
130 DECL_THUNK( thunk, func, CallTo16_word_wl );
131 return EnumWindows16( (WNDENUMPROC16)&thunk, lParam );
135 /*******************************************************************
136 * THUNK_EnumWindows32 (USER32.192)
138 BOOL32 THUNK_EnumWindows32( WNDENUMPROC32 func, LPARAM lParam )
140 DECL_THUNK( thunk, func, CallTo32_2 );
141 return EnumWindows32( (WNDENUMPROC32)&thunk, lParam );
145 /**********************************************************************
146 * THUNK_EnumChildWindows16 (USER.55)
148 BOOL16 THUNK_EnumChildWindows16( HWND16 parent, WNDENUMPROC16 func,
151 DECL_THUNK( thunk, func, CallTo16_word_wl );
152 return EnumChildWindows16( parent, (WNDENUMPROC16)&thunk, lParam );
156 /**********************************************************************
157 * THUNK_EnumChildWindows32 (USER32.177)
159 BOOL32 THUNK_EnumChildWindows32( HWND32 parent, WNDENUMPROC32 func,
162 DECL_THUNK( thunk, func, CallTo32_2 );
163 return EnumChildWindows32( parent, (WNDENUMPROC32)&thunk, lParam );
167 /**********************************************************************
168 * THUNK_EnumTaskWindows16 (USER.225)
170 BOOL16 THUNK_EnumTaskWindows16( HTASK16 hTask, WNDENUMPROC16 func,
173 DECL_THUNK( thunk, func, CallTo16_word_wl );
174 return EnumTaskWindows16( hTask, (WNDENUMPROC16)&thunk, lParam );
178 /**********************************************************************
179 * THUNK_EnumThreadWindows (USER32.189)
181 BOOL32 THUNK_EnumThreadWindows( DWORD id, WNDENUMPROC32 func, LPARAM lParam )
183 DECL_THUNK( thunk, func, CallTo32_2 );
184 return EnumThreadWindows( id, (WNDENUMPROC32)&thunk, lParam );
188 /***********************************************************************
189 * THUNK_EnumProps16 (USER.27)
191 INT16 THUNK_EnumProps16( HWND16 hwnd, PROPENUMPROC16 func )
193 DECL_THUNK( thunk, func, CallTo16_word_wlw );
194 return EnumProps16( hwnd, (PROPENUMPROC16)&thunk );
198 /***********************************************************************
199 * THUNK_EnumProps32A (USER32.185)
201 INT32 THUNK_EnumProps32A( HWND32 hwnd, PROPENUMPROC32A func )
203 DECL_THUNK( thunk, func, CallTo32_3 );
204 return EnumProps32A( hwnd, (PROPENUMPROC32A)&thunk );
208 /***********************************************************************
209 * THUNK_EnumProps32W (USER32.188)
211 INT32 THUNK_EnumProps32W( HWND32 hwnd, PROPENUMPROC32W func )
213 DECL_THUNK( thunk, func, CallTo32_3 );
214 return EnumProps32W( hwnd, (PROPENUMPROC32W)&thunk );
218 /***********************************************************************
219 * THUNK_EnumPropsEx32A (USER32.186)
221 INT32 THUNK_EnumPropsEx32A( HWND32 hwnd, PROPENUMPROCEX32A func, LPARAM lParam)
223 DECL_THUNK( thunk, func, CallTo32_4 );
224 return EnumPropsEx32A( hwnd, (PROPENUMPROCEX32A)&thunk, lParam );
228 /***********************************************************************
229 * THUNK_EnumPropsEx32W (USER32.187)
231 INT32 THUNK_EnumPropsEx32W( HWND32 hwnd, PROPENUMPROCEX32W func, LPARAM lParam)
233 DECL_THUNK( thunk, func, CallTo32_4 );
234 return EnumPropsEx32W( hwnd, (PROPENUMPROCEX32W)&thunk, lParam );
238 /***********************************************************************
239 * THUNK_GrayString16 (USER.185)
241 BOOL16 THUNK_GrayString16( HDC16 hdc, HBRUSH16 hbr, GRAYSTRINGPROC16 func,
242 LPARAM lParam, INT16 cch, INT16 x, INT16 y,
245 DECL_THUNK( thunk, func, CallTo16_word_wlw );
247 return GrayString( hdc, hbr, NULL, lParam, cch, x, y, cx, cy );
249 return GrayString( hdc, hbr, (GRAYSTRINGPROC16)&thunk, lParam, cch,
261 UINT32 ThunkConnect32( struct thunkstruct *ths, LPSTR thunkfun16,
262 LPSTR module16, LPSTR module32, HMODULE32 hmod32,
267 fprintf(stdnimp,"ThunkConnect32(<struct>,%s,%s,%s,%x,%lx)\n",
268 thunkfun16,module32,module16,hmod32,dllinitarg1
270 fprintf(stdnimp," magic = %c%c%c%c\n",
276 fprintf(stdnimp," x1 = %lx\n",ths->x1);
277 fprintf(stdnimp," x2 = %lx\n",ths->x2);
278 hmm=LoadModule(module16,NULL);