Release 0.3.0
[wine/multimedia.git] / if1632 / callback.c
blobdd5d03511a05c21e7a1ce34b25ba5b538e76aec5
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";
4 #include "windows.h"
5 #include "callback.h"
6 #include "wine.h"
7 #include "segmem.h"
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;
14 struct thunk_s
16 int used;
17 unsigned char thunk[10];
20 /**********************************************************************
21 * PushOn16
23 static void
24 PushOn16(int size, unsigned int value)
26 char *p = (char *) (((unsigned int)IF1632_Saved16_ss << 16) +
27 (IF1632_Saved16_esp & 0xffff));
28 if (size)
30 unsigned long *lp = (unsigned long *) p - 1;
32 *lp = value;
33 IF1632_Saved16_esp -= 4;
35 else
37 unsigned short *sp = (unsigned short *) p - 1;
39 *sp = value;
40 IF1632_Saved16_esp -= 2;
44 /**********************************************************************
45 * FindDataSegmentForCode
47 static unsigned short
48 FindDataSegmentForCode(unsigned long csip)
50 unsigned int seg_idx;
52 seg_idx = (unsigned short) (csip >> 19);
53 return SelectorOwners[seg_idx];
56 /**********************************************************************
57 * CallBack16
59 int
60 CallBack16(void *func, int n_args, ...)
62 va_list ap;
63 int i;
64 int arg_type, arg_value;
66 va_start(ap, n_args);
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);
75 va_end(ap);
77 return CallTo16((unsigned int) func,
78 FindDataSegmentForCode((unsigned long) func));
81 /**********************************************************************
82 * CALLBACK_MakeProcInstance
84 void *
85 CALLBACK_MakeProcInstance(void *func, int instance)
87 int handle;
88 void *new_func;
89 struct thunk_s *tp;
90 int i;
92 tp = (struct thunk_s *) MakeProcThunks->base_addr;
93 for (i = 0; i < 0x10000 / sizeof(*tp); i++, tp++)
94 if (!tp->used)
95 break;
97 if (tp->used)
98 return (void *) 0;
100 tp->thunk[0] = 0xb8;
101 tp->thunk[1] = (unsigned char) instance;
102 tp->thunk[2] = (unsigned char) (instance >> 8);
103 tp->thunk[3] = 0x8e;
104 tp->thunk[4] = 0xd8;
105 tp->thunk[5] = 0xea;
106 memcpy(&tp->thunk[6], &func, 4);
108 return tp->thunk;
111 /**********************************************************************
112 * FreeProcInstance (KERNEL.52)
114 void FreeProcInstance(FARPROC func)
116 int handle;
117 void *new_func;
118 struct thunk_s *tp;
119 int i;
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)
126 tp->used = 0;
127 break;
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));
147 else
148 return WIDGETS_Call32WndProc( func, hwnd, message, wParam, lParam );
151 /**********************************************************************
152 * CallLineDDAProc
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));