2 * Function callbacks for the library
4 * Copyright 1997 Alexandre Julliard
15 /**********************************************************************
16 * CALLBACK_CallWndProc
18 static LRESULT WINAPI
CALLBACK_CallWndProc( WNDPROC16 proc
, HWND16 hwnd
,
19 UINT16 msg
, WPARAM16 wParam
,
22 return proc( hwnd
, msg
, wParam
, lParam
);
26 /**********************************************************************
27 * CALLBACK_CallRegisterProc
29 static LONG WINAPI
CALLBACK_CallRegisterProc( CONTEXT
*context
, INT32 offset
)
31 ERR(relay
, "Cannot call a register proc in Winelib\n" );
37 /**********************************************************************
38 * CALLBACK_CallDriverProc
40 static LRESULT WINAPI
CALLBACK_CallDriverProc( DRIVERPROC16 proc
, DWORD dwId
,
41 HDRVR16 hdrvr
, UINT16 msg
,
42 LPARAM lp1
, LPARAM lp2
)
44 return proc( dwId
, hdrvr
, msg
, lp1
, lp2
);
48 /**********************************************************************
49 * CALLBACK_CallDriverCallback
51 static LRESULT WINAPI
CALLBACK_CallDriverCallback( FARPROC16 proc
,
52 HANDLE16 hDev
, UINT16 msg
,
53 DWORD dwUser
, LPARAM lp1
,
56 return proc( hDev
, msg
, dwUser
, lp1
, lp2
);
60 /**********************************************************************
61 * CALLBACK_CallTimeFuncProc
63 static LRESULT WINAPI
CALLBACK_CallTimeFuncProc( FARPROC16 proc
, WORD id
,
64 UINT16 msg
, DWORD dwUser
,
65 LPARAM lp1
, LPARAM lp2
)
67 return proc( id
, msg
, dwUser
, lp1
, lp2
);
71 /**********************************************************************
72 * CALLBACK_CallWindowsExitProc
74 static INT16 WINAPI
CALLBACK_CallWindowsExitProc( FARPROC16 proc
, INT16 type
)
80 /**********************************************************************
81 * CALLBACK_CallWordBreakProc
83 static INT16 WINAPI
CALLBACK_CallWordBreakProc( EDITWORDBREAKPROC16 proc
,
84 SEGPTR text
, INT16 word
,
85 INT16 len
, INT16 action
)
87 return proc( (LPSTR
)text
, word
, len
, action
);
91 /**********************************************************************
92 * CALLBACK_CallBootAppProc
94 static void WINAPI
CALLBACK_CallBootAppProc( FARPROC16 proc
, HANDLE16 module
,
101 /**********************************************************************
102 * CALLBACK_CallLoadAppSegProc
104 static WORD WINAPI
CALLBACK_CallLoadAppSegProc( FARPROC16 proc
,
105 HANDLE16 module
, HFILE16 file
,
108 return proc( module
, file
, seg
);
112 /**********************************************************************
113 * CALLBACK_CallLocalNotifyFunc
115 static WORD WINAPI
CALLBACK_CallLocalNotifyFunc( FARPROC16 proc
,
116 WORD wMsg
, HLOCAL16 hMem
,
119 return proc( wMsg
, hMem
, wArg
);
123 /**********************************************************************
124 * CALLBACK_CallSystemTimerProc
126 static void WINAPI
CALLBACK_CallSystemTimerProc( FARPROC16 proc
)
131 /**********************************************************************
132 * CALLBACK_CallResourceHandlerProc
134 static HGLOBAL16 WINAPI
CALLBACK_CallResourceHandlerProc( FARPROC16 proc
,
139 return proc( hMemObj
, hModule
, hRsrc
);
143 /**********************************************************************
144 * CALLBACK_CallASPIPostProc
146 static LRESULT WINAPI
CALLBACK_CallASPIPostProc( FARPROC16 proc
, SEGPTR ptr
)
152 /**********************************************************************
153 * CALLBACK_CallWOWCallbackProc
155 static DWORD WINAPI
CALLBACK_CallWOWCallbackProc( FARPROC16 proc
, DWORD dw
)
160 /**********************************************************************
161 * CALLBACK_CallWOWCallback16Ex
163 * WCB16_MAX_CBARGS (16) is the maximum number of args.
165 * Can call functions using CDECL or PASCAL calling conventions. The CDECL
166 * ones are reversed (not 100% sure about that).
168 static BOOL32 WINAPI
CALLBACK_CallWOWCallback16Ex(
169 FARPROC16 proc
, DWORD dwFlags
, DWORD cbArgs
, LPVOID xargs
,LPDWORD pdwret
171 LPDWORD args
= (LPDWORD
)xargs
;
174 if (dwFlags
== WCB16_CDECL
) {
175 /* swap the arguments */
176 args
= HeapAlloc(GetProcessHeap(),0,cbArgs
*sizeof(DWORD
));
177 for (i
=0;i
<cbArgs
;i
++)
178 args
[i
] = ((DWORD
*)xargs
)[cbArgs
-i
-1];
181 case 0: ret
= proc();break;
182 case 1: ret
= proc(args
[0]);break;
183 case 2: ret
= proc(args
[0],args
[1]);break;
184 case 3: ret
= proc(args
[0],args
[1],args
[2]);break;
185 case 4: ret
= proc(args
[0],args
[1],args
[2],args
[3]);break;
186 case 5: ret
= proc(args
[0],args
[1],args
[2],args
[3],args
[4]);break;
187 case 6: ret
= proc(args
[0],args
[1],args
[2],args
[3],args
[4],args
[5]);
189 case 7: ret
= proc(args
[0],args
[1],args
[2],args
[3],args
[4],args
[5],
193 case 8: ret
= proc(args
[0],args
[1],args
[2],args
[3],args
[4],args
[5],
197 case 9: ret
= proc(args
[0],args
[1],args
[2],args
[3],args
[4],args
[5],
198 args
[6],args
[7],args
[8]
201 case 10:ret
= proc(args
[0],args
[1],args
[2],args
[3],args
[4],args
[5],
202 args
[6],args
[7],args
[8],args
[9]
205 case 11:ret
= proc(args
[0],args
[1],args
[2],args
[3],args
[4],args
[5],
206 args
[6],args
[7],args
[8],args
[9],args
[10]
209 case 12:ret
= proc(args
[0],args
[1],args
[2],args
[3],args
[4],args
[5],
210 args
[6],args
[7],args
[8],args
[9],args
[10],args
[11]
213 case 13:ret
= proc(args
[0],args
[1],args
[2],args
[3],args
[4],args
[5],
214 args
[6],args
[7],args
[8],args
[9],args
[10],args
[11],
218 case 14:ret
= proc(args
[0],args
[1],args
[2],args
[3],args
[4],args
[5],
219 args
[6],args
[7],args
[8],args
[9],args
[10],args
[11],
223 case 15:ret
= proc(args
[0],args
[1],args
[2],args
[3],args
[4],args
[5],
224 args
[6],args
[7],args
[8],args
[9],args
[10],args
[11],
225 args
[12],args
[13],args
[14]
228 case 16:ret
= proc(args
[0],args
[1],args
[2],args
[3],args
[4],args
[5],
229 args
[6],args
[7],args
[8],args
[9],args
[10],args
[11],
230 args
[12],args
[13],args
[14],args
[15]
234 WARN(relay
,"(%ld) arguments not supported.\n",cbArgs
);
235 if (dwFlags
== WCB16_CDECL
)
236 HeapFree(GetProcessHeap(),0,args
);
239 if (dwFlags
== WCB16_CDECL
)
240 HeapFree(GetProcessHeap(),0,args
);
246 /**********************************************************************
247 * CALLBACK_CallTaskRescheduleProc
249 static void WINAPI
CALLBACK_CallTaskRescheduleProc( void )
251 SYSLEVEL_EnterWin16Lock();
253 SYSLEVEL_LeaveWin16Lock();
257 /**********************************************************************
258 * CALLBACK_WinelibTable
260 * The callbacks function table for Winelib
262 static const CALLBACKS_TABLE CALLBACK_WinelibTable
=
264 CALLBACK_CallRegisterProc
, /* CallRegisterShortProc */
265 CALLBACK_CallRegisterProc
, /* CallRegisterLongProc */
266 CALLBACK_CallTaskRescheduleProc
, /* CallTaskRescheduleProc */
267 NULL
, /* CallFrom16WndProc */
268 CALLBACK_CallWndProc
, /* CallWndProc */
269 CALLBACK_CallDriverProc
, /* CallDriverProc */
270 CALLBACK_CallDriverCallback
, /* CallDriverCallback */
271 CALLBACK_CallTimeFuncProc
, /* CallTimeFuncProc */
272 CALLBACK_CallWindowsExitProc
, /* CallWindowsExitProc */
273 CALLBACK_CallWordBreakProc
, /* CallWordBreakProc */
274 CALLBACK_CallBootAppProc
, /* CallBootAppProc */
275 CALLBACK_CallLoadAppSegProc
, /* CallLoadAppSegProc */
276 CALLBACK_CallLocalNotifyFunc
, /* CallLocalNotifyFunc */
277 CALLBACK_CallSystemTimerProc
, /* CallSystemTimerProc */
278 CALLBACK_CallResourceHandlerProc
, /* CallResourceHandlerProc */
279 NULL
, /* CallPostAppMessageProc */
280 CALLBACK_CallWOWCallbackProc
, /* CallWOWCallbackProc */
281 CALLBACK_CallWOWCallback16Ex
, /* CallWOWCallback16Ex */
282 CALLBACK_CallASPIPostProc
, /* CallASPIPostProc */
283 /* The graphics driver callbacks are never used in Winelib */
284 NULL
, /* CallDrvControlProc */
285 NULL
, /* CallDrvEnableProc */
286 NULL
, /* CallDrvEnumDFontsProc */
287 NULL
, /* CallDrvEnumObjProc */
288 NULL
, /* CallDrvOutputProc */
289 NULL
, /* CallDrvRealizeProc */
290 NULL
, /* CallDrvStretchBltProc */
291 NULL
, /* CallDrvExtTextOutProc */
292 NULL
, /* CallDrvGetCharWidth */
293 NULL
/* CallDrvAbortProc */
296 const CALLBACKS_TABLE
*Callbacks
= &CALLBACK_WinelibTable
;