1 static char RCSId
[] = "$Id: wine.c,v 1.2 1993/07/04 04:04:21 root Exp root $";
2 static char Copyright
[] = "Copyright Robert J. Amstadt, 1993";
9 extern unsigned short SelectorOwners
[];
10 extern unsigned short IF1632_Saved16_ss
;
11 extern unsigned long IF1632_Saved16_esp
;
12 extern struct segment_descriptor_s
*MakeProcThunks
;
17 unsigned char thunk
[10];
20 /**********************************************************************
24 PushOn16(int size
, unsigned int value
)
26 char *p
= (char *) (((unsigned int)IF1632_Saved16_ss
<< 16) +
27 (IF1632_Saved16_esp
& 0xffff));
30 unsigned long *lp
= (unsigned long *) p
- 1;
33 IF1632_Saved16_esp
-= 4;
37 unsigned short *sp
= (unsigned short *) p
- 1;
40 IF1632_Saved16_esp
-= 2;
44 /**********************************************************************
45 * FindDataSegmentForCode
48 FindDataSegmentForCode(unsigned long csip
)
52 seg_idx
= (unsigned short) (csip
>> 19);
53 return SelectorOwners
[seg_idx
];
56 /**********************************************************************
60 CallBack16(void *func
, int n_args
, ...)
64 int arg_type
, arg_value
;
68 for (i
= 0; i
< n_args
; i
++)
70 arg_type
= va_arg(ap
, int);
71 arg_value
= va_arg(ap
, int);
72 PushOn16(arg_type
, arg_value
);
77 return CallTo16((unsigned int) func
,
78 FindDataSegmentForCode((unsigned long) func
));
81 /**********************************************************************
82 * CALLBACK_MakeProcInstance
85 CALLBACK_MakeProcInstance(void *func
, int instance
)
92 tp
= (struct thunk_s
*) MakeProcThunks
->base_addr
;
93 for (i
= 0; i
< 0x10000 / sizeof(*tp
); i
++, tp
++)
101 tp
->thunk
[1] = (unsigned char) instance
;
102 tp
->thunk
[2] = (unsigned char) (instance
>> 8);
106 memcpy(&tp
->thunk
[6], &func
, 4);
111 /**********************************************************************
112 * FreeProcInstance (KERNEL.52)
114 void FreeProcInstance(FARPROC func
)
121 tp
= (struct thunk_s
*) MakeProcThunks
->base_addr
;
122 for (i
= 0; i
< 0x10000 / sizeof(*tp
); i
++, tp
++)
124 if ((void *) tp
->thunk
== (void *) func
)
132 /**********************************************************************
133 * CallWindowProc (USER.122)
135 LONG
CallWindowProc( FARPROC func
, HWND hwnd
, WORD message
,
136 WORD wParam
, LONG lParam
)
138 if ((unsigned int)func
& 0xffff0000)
140 PushOn16( CALLBACK_SIZE_WORD
, hwnd
);
141 PushOn16( CALLBACK_SIZE_WORD
, message
);
142 PushOn16( CALLBACK_SIZE_WORD
, wParam
);
143 PushOn16( CALLBACK_SIZE_LONG
, lParam
);
144 return CallTo16((unsigned int) func
,
145 FindDataSegmentForCode((unsigned long) func
));
148 return WIDGETS_Call32WndProc( func
, hwnd
, message
, wParam
, lParam
);
151 /**********************************************************************
154 void CallLineDDAProc(FARPROC func
, short xPos
, short yPos
, long lParam
)
156 PushOn16( CALLBACK_SIZE_WORD
, xPos
);
157 PushOn16( CALLBACK_SIZE_WORD
, yPos
);
158 PushOn16( CALLBACK_SIZE_LONG
, lParam
);
159 CallTo16((unsigned int) func
,
160 FindDataSegmentForCode((unsigned long) func
));