2 * Function callbacks for the library
4 * Copyright 1997 Alexandre Julliard
12 #include "cursoricon.h"
18 /**********************************************************************
19 * CALLBACK_CallWndProc
21 static LRESULT WINAPI
CALLBACK_CallWndProc( WNDPROC16 proc
, HWND16 hwnd
,
22 UINT16 msg
, WPARAM16 wParam
,
25 return proc( hwnd
, msg
, wParam
, lParam
);
29 /**********************************************************************
30 * CALLBACK_CallRegisterProc
32 static LONG WINAPI
CALLBACK_CallRegisterProc( CONTEXT
*context
, INT offset
)
34 ERR(relay
, "Cannot call a register proc in Winelib\n" );
40 /**********************************************************************
41 * CALLBACK_CallDriverProc
43 static LRESULT WINAPI
CALLBACK_CallDriverProc( DRIVERPROC16 proc
, DWORD dwId
,
44 HDRVR16 hdrvr
, UINT16 msg
,
45 LPARAM lp1
, LPARAM lp2
)
47 return proc( dwId
, hdrvr
, msg
, lp1
, lp2
);
51 /**********************************************************************
52 * CALLBACK_CallDriverCallback
54 static LRESULT WINAPI
CALLBACK_CallDriverCallback( FARPROC16 proc
,
55 HANDLE16 hDev
, UINT16 msg
,
56 DWORD dwUser
, LPARAM lp1
,
59 return proc( hDev
, msg
, dwUser
, lp1
, lp2
);
63 /**********************************************************************
64 * CALLBACK_CallTimeFuncProc
66 static LRESULT WINAPI
CALLBACK_CallTimeFuncProc( FARPROC16 proc
, WORD id
,
67 UINT16 msg
, DWORD dwUser
,
68 LPARAM lp1
, LPARAM lp2
)
70 return proc( id
, msg
, dwUser
, lp1
, lp2
);
74 /**********************************************************************
75 * CALLBACK_CallWindowsExitProc
77 static INT16 WINAPI
CALLBACK_CallWindowsExitProc( FARPROC16 proc
, INT16 type
)
83 /**********************************************************************
84 * CALLBACK_CallWordBreakProc
86 static INT16 WINAPI
CALLBACK_CallWordBreakProc( EDITWORDBREAKPROC16 proc
,
87 SEGPTR text
, INT16 word
,
88 INT16 len
, INT16 action
)
90 return proc( (LPSTR
)text
, word
, len
, action
);
94 /**********************************************************************
95 * CALLBACK_CallBootAppProc
97 static void WINAPI
CALLBACK_CallBootAppProc( FARPROC16 proc
, HANDLE16 module
,
100 proc( module
, file
);
104 /**********************************************************************
105 * CALLBACK_CallLoadAppSegProc
107 static WORD WINAPI
CALLBACK_CallLoadAppSegProc( FARPROC16 proc
,
108 HANDLE16 module
, HFILE16 file
,
111 return proc( module
, file
, seg
);
115 /**********************************************************************
116 * CALLBACK_CallLocalNotifyFunc
118 static WORD WINAPI
CALLBACK_CallLocalNotifyFunc( FARPROC16 proc
,
119 WORD wMsg
, HLOCAL16 hMem
,
122 return proc( wMsg
, hMem
, wArg
);
126 /**********************************************************************
127 * CALLBACK_CallResourceHandlerProc
129 static HGLOBAL16 WINAPI
CALLBACK_CallResourceHandlerProc( FARPROC16 proc
,
134 ERR( relay
, "Cannot call a 16-bit resource handler in Winelib\n" );
140 /**********************************************************************
141 * CALLBACK_CallASPIPostProc
143 static LRESULT WINAPI
CALLBACK_CallASPIPostProc( FARPROC16 proc
, SEGPTR ptr
)
149 /**********************************************************************
150 * CALLBACK_CallWOWCallbackProc
152 static DWORD WINAPI
CALLBACK_CallWOWCallbackProc( FARPROC16 proc
, DWORD dw
)
157 /**********************************************************************
158 * CALLBACK_CallWOWCallback16Ex
160 * WCB16_MAX_CBARGS (16) is the maximum number of args.
162 * Can call functions using CDECL or PASCAL calling conventions. The CDECL
163 * ones are reversed (not 100% sure about that).
165 static BOOL WINAPI
CALLBACK_CallWOWCallback16Ex(
166 FARPROC16 proc
, DWORD dwFlags
, DWORD cbArgs
, LPVOID xargs
,LPDWORD pdwret
168 LPDWORD args
= (LPDWORD
)xargs
;
171 if (dwFlags
== WCB16_CDECL
) {
172 /* swap the arguments */
173 args
= HeapAlloc(GetProcessHeap(),0,cbArgs
*sizeof(DWORD
));
174 for (i
=0;i
<cbArgs
;i
++)
175 args
[i
] = ((DWORD
*)xargs
)[cbArgs
-i
-1];
178 case 0: ret
= proc();break;
179 case 1: ret
= proc(args
[0]);break;
180 case 2: ret
= proc(args
[0],args
[1]);break;
181 case 3: ret
= proc(args
[0],args
[1],args
[2]);break;
182 case 4: ret
= proc(args
[0],args
[1],args
[2],args
[3]);break;
183 case 5: ret
= proc(args
[0],args
[1],args
[2],args
[3],args
[4]);break;
184 case 6: ret
= proc(args
[0],args
[1],args
[2],args
[3],args
[4],args
[5]);
186 case 7: ret
= proc(args
[0],args
[1],args
[2],args
[3],args
[4],args
[5],
190 case 8: ret
= proc(args
[0],args
[1],args
[2],args
[3],args
[4],args
[5],
194 case 9: ret
= proc(args
[0],args
[1],args
[2],args
[3],args
[4],args
[5],
195 args
[6],args
[7],args
[8]
198 case 10:ret
= proc(args
[0],args
[1],args
[2],args
[3],args
[4],args
[5],
199 args
[6],args
[7],args
[8],args
[9]
202 case 11:ret
= proc(args
[0],args
[1],args
[2],args
[3],args
[4],args
[5],
203 args
[6],args
[7],args
[8],args
[9],args
[10]
206 case 12:ret
= proc(args
[0],args
[1],args
[2],args
[3],args
[4],args
[5],
207 args
[6],args
[7],args
[8],args
[9],args
[10],args
[11]
210 case 13:ret
= proc(args
[0],args
[1],args
[2],args
[3],args
[4],args
[5],
211 args
[6],args
[7],args
[8],args
[9],args
[10],args
[11],
215 case 14:ret
= proc(args
[0],args
[1],args
[2],args
[3],args
[4],args
[5],
216 args
[6],args
[7],args
[8],args
[9],args
[10],args
[11],
220 case 15:ret
= proc(args
[0],args
[1],args
[2],args
[3],args
[4],args
[5],
221 args
[6],args
[7],args
[8],args
[9],args
[10],args
[11],
222 args
[12],args
[13],args
[14]
225 case 16:ret
= proc(args
[0],args
[1],args
[2],args
[3],args
[4],args
[5],
226 args
[6],args
[7],args
[8],args
[9],args
[10],args
[11],
227 args
[12],args
[13],args
[14],args
[15]
231 WARN(relay
,"(%ld) arguments not supported.\n",cbArgs
);
232 if (dwFlags
== WCB16_CDECL
)
233 HeapFree(GetProcessHeap(),0,args
);
236 if (dwFlags
== WCB16_CDECL
)
237 HeapFree(GetProcessHeap(),0,args
);
243 /**********************************************************************
244 * CALLBACK_CallUTProc
246 static DWORD WINAPI
CALLBACK_CallUTProc( FARPROC16 proc
, DWORD w1
, DWORD w2
)
248 ERR( relay
, "Cannot call a UT thunk proc in Winelib\n" );
253 /**********************************************************************
254 * CALLBACK_CallTaskRescheduleProc
256 static BOOL WINAPI
CALLBACK_CallTaskRescheduleProc( void )
260 SYSLEVEL_EnterWin16Lock();
261 pending
= TASK_Reschedule();
262 SYSLEVEL_LeaveWin16Lock();
268 /**********************************************************************
269 * CALLBACK_WinelibTable
271 * The callbacks function table for Winelib
273 static const CALLBACKS_TABLE CALLBACK_WinelibTable
=
275 CALLBACK_CallRegisterProc
, /* CallRegisterShortProc */
276 CALLBACK_CallRegisterProc
, /* CallRegisterLongProc */
277 CALLBACK_CallTaskRescheduleProc
, /* CallTaskRescheduleProc */
278 NULL
, /* CallFrom16WndProc */
279 CALLBACK_CallWndProc
, /* CallWndProc */
280 CALLBACK_CallDriverProc
, /* CallDriverProc */
281 CALLBACK_CallDriverCallback
, /* CallDriverCallback */
282 CALLBACK_CallTimeFuncProc
, /* CallTimeFuncProc */
283 CALLBACK_CallWindowsExitProc
, /* CallWindowsExitProc */
284 CALLBACK_CallWordBreakProc
, /* CallWordBreakProc */
285 CALLBACK_CallBootAppProc
, /* CallBootAppProc */
286 CALLBACK_CallLoadAppSegProc
, /* CallLoadAppSegProc */
287 CALLBACK_CallLocalNotifyFunc
, /* CallLocalNotifyFunc */
288 CALLBACK_CallResourceHandlerProc
, /* CallResourceHandlerProc */
289 CALLBACK_CallWOWCallbackProc
, /* CallWOWCallbackProc */
290 CALLBACK_CallWOWCallback16Ex
, /* CallWOWCallback16Ex */
291 CALLBACK_CallUTProc
, /* CallUTProc */
292 CALLBACK_CallASPIPostProc
, /* CallASPIPostProc */
293 /* The graphics driver callbacks are never used in Winelib */
294 NULL
, /* CallDrvControlProc */
295 NULL
, /* CallDrvEnableProc */
296 NULL
, /* CallDrvEnumDFontsProc */
297 NULL
, /* CallDrvEnumObjProc */
298 NULL
, /* CallDrvOutputProc */
299 NULL
, /* CallDrvRealizeProc */
300 NULL
, /* CallDrvStretchBltProc */
301 NULL
, /* CallDrvExtTextOutProc */
302 NULL
, /* CallDrvGetCharWidth */
303 NULL
/* CallDrvAbortProc */
306 const CALLBACKS_TABLE
*Callbacks
= &CALLBACK_WinelibTable
;
309 /**********************************************************************
312 * The callout function table for Winelib
315 CALLOUT_TABLE Callout
=
317 PeekMessage16
, PeekMessageA
, PeekMessageW
,
318 GetMessage16
, GetMessageA
, GetMessageW
,
319 SendMessage16
, SendMessageA
, SendMessageW
,
320 PostMessage16
, PostMessageA
, PostMessageW
,
321 PostAppMessage16
, PostThreadMessageA
, PostThreadMessageW
,
322 TranslateMessage16
, TranslateMessage
,
323 DispatchMessage16
, DispatchMessageA
, DispatchMessageW
,
324 RedrawWindow16
, RedrawWindow
,