Mercurial > mplayer.hg
annotate loader/win32.c @ 4542:e67d400b6fde
mysql also goes haywire from sneaky-sucky-fucky gcc2.100-4
author | gabucino |
---|---|
date | Tue, 05 Feb 2002 22:01:49 +0000 |
parents | a1d27234018f |
children | 0eccc60c97b4 |
rev | line source |
---|---|
1 | 1 /*********************************************************** |
2 | |
3465 | 3 Win32 emulation code. Functions that emulate |
4 responses from corresponding Win32 API calls. | |
5 Since we are not going to be able to load | |
6 virtually any DLL, we can only implement this | |
7 much, adding needed functions with each new codec. | |
8 | |
9 Basic principle of implementation: it's not good | |
10 for DLL to know too much about its environment. | |
1 | 11 |
12 ************************************************************/ | |
13 | |
2069 | 14 #include "config.h" |
1 | 15 |
2069 | 16 #include "wine/winbase.h" |
17 #include "wine/winreg.h" | |
18 #include "wine/winnt.h" | |
19 #include "wine/winerror.h" | |
20 #include "wine/debugtools.h" | |
21 #include "wine/module.h" | |
2139 | 22 |
23 #include <stdio.h> | |
1 | 24 #include "win32.h" |
2069 | 25 |
2139 | 26 #include "registry.h" |
27 #include "loader.h" | |
28 #include "com.h" | |
29 | |
2069 | 30 #include <stdlib.h> |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
31 #include <assert.h> |
2139 | 32 #include <stdarg.h> |
2069 | 33 #include <ctype.h> |
1 | 34 #include <pthread.h> |
128 | 35 #include <errno.h> |
1 | 36 #ifdef HAVE_MALLOC_H |
37 #include <malloc.h> | |
38 #endif | |
39 #include <time.h> | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
40 #include <math.h> |
128 | 41 #include <unistd.h> |
42 #include <fcntl.h> | |
1 | 43 #include <sys/types.h> |
44 #include <sys/time.h> | |
45 #include <sys/timeb.h> | |
2069 | 46 #ifdef HAVE_KSTAT |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
47 #include <kstat.h> |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
48 #endif |
1 | 49 |
2906
2ec3ec904cd4
Try to provide a vsscanf() implementation, if the system does not have
jkeil
parents:
2780
diff
changeset
|
50 #if HAVE_VSSCANF |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
51 int vsscanf( const char *str, const char *format, va_list ap); |
2906
2ec3ec904cd4
Try to provide a vsscanf() implementation, if the system does not have
jkeil
parents:
2780
diff
changeset
|
52 #else |
2ec3ec904cd4
Try to provide a vsscanf() implementation, if the system does not have
jkeil
parents:
2780
diff
changeset
|
53 /* system has no vsscanf. try to provide one */ |
2ec3ec904cd4
Try to provide a vsscanf() implementation, if the system does not have
jkeil
parents:
2780
diff
changeset
|
54 static int vsscanf( const char *str, const char *format, va_list ap) |
2ec3ec904cd4
Try to provide a vsscanf() implementation, if the system does not have
jkeil
parents:
2780
diff
changeset
|
55 { |
3465 | 56 long p1 = va_arg(ap, long); |
57 long p2 = va_arg(ap, long); | |
58 long p3 = va_arg(ap, long); | |
59 long p4 = va_arg(ap, long); | |
60 long p5 = va_arg(ap, long); | |
61 return sscanf(str, format, p1, p2, p3, p4, p5); | |
2906
2ec3ec904cd4
Try to provide a vsscanf() implementation, if the system does not have
jkeil
parents:
2780
diff
changeset
|
62 } |
2ec3ec904cd4
Try to provide a vsscanf() implementation, if the system does not have
jkeil
parents:
2780
diff
changeset
|
63 #endif |
1416 | 64 |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
65 char* def_path = WIN32_PATH; |
128 | 66 |
1923
40084ad62591
do_cpuid stored the results of the cpuid instruction in the wrong place
jkeil
parents:
1679
diff
changeset
|
67 static void do_cpuid(unsigned int ax, unsigned int *regs) |
128 | 68 { |
3465 | 69 __asm__ __volatile__ |
70 ( | |
71 "pushl %%ebx; pushl %%ecx; pushl %%edx;" | |
72 ".byte 0x0f, 0xa2;" | |
73 "movl %%eax, (%2);" | |
74 "movl %%ebx, 4(%2);" | |
75 "movl %%ecx, 8(%2);" | |
76 "movl %%edx, 12(%2);" | |
77 "popl %%edx; popl %%ecx; popl %%ebx;" | |
78 : "=a" (ax) | |
79 : "0" (ax), "S" (regs) | |
2069 | 80 ); |
128 | 81 } |
82 static unsigned int c_localcount_tsc() | |
1 | 83 { |
84 int a; | |
3465 | 85 __asm__ __volatile__ |
86 ( | |
87 "rdtsc\n\t" | |
88 :"=a"(a) | |
89 : | |
90 :"edx" | |
91 ); | |
1 | 92 return a; |
93 } | |
128 | 94 static void c_longcount_tsc(long long* z) |
1 | 95 { |
3465 | 96 __asm__ __volatile__ |
97 ( | |
98 "pushl %%ebx\n\t" | |
99 "movl %%eax, %%ebx\n\t" | |
100 "rdtsc\n\t" | |
101 "movl %%eax, 0(%%ebx)\n\t" | |
102 "movl %%edx, 4(%%ebx)\n\t" | |
103 "popl %%ebx\n\t" | |
104 ::"a"(z) | |
105 ); | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
106 } |
128 | 107 static unsigned int c_localcount_notsc() |
1 | 108 { |
109 struct timeval tv; | |
110 unsigned limit=~0; | |
111 limit/=1000000; | |
112 gettimeofday(&tv, 0); | |
113 return limit*tv.tv_usec; | |
114 } | |
128 | 115 static void c_longcount_notsc(long long* z) |
1 | 116 { |
117 struct timeval tv; | |
118 unsigned long long result; | |
119 unsigned limit=~0; | |
120 if(!z)return; | |
121 limit/=1000000; | |
122 gettimeofday(&tv, 0); | |
123 result=tv.tv_sec; | |
124 result<<=32; | |
125 result+=limit*tv.tv_usec; | |
126 *z=result; | |
127 } | |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
128 static unsigned int localcount_stub(void); |
2069 | 129 static void longcount_stub(long long*); |
128 | 130 static unsigned int (*localcount)()=localcount_stub; |
131 static void (*longcount)(long long*)=longcount_stub; | |
1 | 132 |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
133 static pthread_mutex_t memmut; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
134 |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
135 static unsigned int localcount_stub(void) |
128 | 136 { |
137 unsigned int regs[4]; | |
1923
40084ad62591
do_cpuid stored the results of the cpuid instruction in the wrong place
jkeil
parents:
1679
diff
changeset
|
138 do_cpuid(1, regs); |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
139 if ((regs[3] & 0x00000010) != 0) |
128 | 140 { |
141 localcount=c_localcount_tsc; | |
142 longcount=c_longcount_tsc; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
143 } |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
144 else |
128 | 145 { |
3465 | 146 localcount=c_localcount_notsc; |
128 | 147 longcount=c_longcount_notsc; |
148 } | |
149 return localcount(); | |
150 } | |
151 static void longcount_stub(long long* z) | |
1 | 152 { |
128 | 153 unsigned int regs[4]; |
1923
40084ad62591
do_cpuid stored the results of the cpuid instruction in the wrong place
jkeil
parents:
1679
diff
changeset
|
154 do_cpuid(1, regs); |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
155 if ((regs[3] & 0x00000010) != 0) |
128 | 156 { |
157 localcount=c_localcount_tsc; | |
158 longcount=c_longcount_tsc; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
159 } |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
160 else |
128 | 161 { |
3465 | 162 localcount=c_localcount_notsc; |
128 | 163 longcount=c_longcount_notsc; |
164 } | |
165 longcount(z); | |
166 } | |
2780 | 167 |
2069 | 168 int LOADER_DEBUG=1; // active only if compiled with -DDETAILED_OUT |
3128 | 169 //#define DETAILED_OUT |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
170 static inline void dbgprintf(char* fmt, ...) |
128 | 171 { |
235 | 172 #ifdef DETAILED_OUT |
128 | 173 if(LOADER_DEBUG) |
174 { | |
175 FILE* f; | |
176 va_list va; | |
3465 | 177 va_start(va, fmt); |
128 | 178 f=fopen("./log", "a"); |
3134 | 179 vprintf(fmt, va); |
3465 | 180 fflush(stdout); |
181 if(f) | |
128 | 182 { |
183 vfprintf(f, fmt, va); | |
184 fsync(fileno(f)); | |
3465 | 185 fclose(f); |
128 | 186 } |
187 va_end(va); | |
188 } | |
235 | 189 #endif |
3469 | 190 #if 0 |
191 // al3x: it break divx audio. btw it should be if(verbose>2){ ... } anyway... | |
192 // #ifdef MPLAYER | |
3435 | 193 #include "../mp_msg.h" |
194 { | |
195 char buf[1024]; | |
196 va_list va; | |
197 | |
198 va_start(va, fmt); | |
199 vsnprintf((char *)&buf[0], 1023, fmt, va); | |
200 mp_dbg(MSGT_WIN32, MSGL_DBG3, (char *)&buf[0]); | |
201 va_end(va); | |
202 } | |
203 #endif | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
204 } |
3128 | 205 |
206 | |
3465 | 207 char export_names[300][32]={ |
208 "name1", | |
209 //"name2", | |
210 //"name3" | |
1 | 211 }; |
212 //#define min(x,y) ((x)<(y)?(x):(y)) | |
213 | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
214 void destroy_event(void* event); |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
215 |
3134 | 216 struct th_list_t; |
217 typedef struct th_list_t{ | |
218 int id; | |
219 void* thread; | |
220 struct th_list_t* next; | |
221 struct th_list_t* prev; | |
222 } th_list; | |
223 | |
224 | |
225 // have to be cleared by GARBAGE COLLECTOR | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
226 static unsigned char* heap=NULL; |
1 | 227 static int heap_counter=0; |
3134 | 228 static tls_t* g_tls=NULL; |
229 static th_list* list=NULL; | |
230 | |
2069 | 231 static void test_heap(void) |
1 | 232 { |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
233 int offset=0; |
1 | 234 if(heap==0) |
235 return; | |
236 while(offset<heap_counter) | |
237 { | |
238 if(*(int*)(heap+offset)!=0x433476) | |
239 { | |
240 printf("Heap corruption at address %d\n", offset); | |
241 return; | |
242 } | |
243 offset+=8+*(int*)(heap+offset+4); | |
244 } | |
245 for(;offset<min(offset+1000, 20000000); offset++) | |
246 if(heap[offset]!=0xCC) | |
3465 | 247 { |
248 printf("Free heap corruption at address %d\n", offset); | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
249 } |
1 | 250 } |
251 #undef MEMORY_DEBUG | |
252 | |
253 #ifdef MEMORY_DEBUG | |
254 | |
255 void* my_mreq(int size, int to_zero) | |
256 { | |
257 static int test=0; | |
258 test++; | |
259 if(test%10==0)printf("Memory: %d bytes allocated\n", heap_counter); | |
3465 | 260 // test_heap(); |
1 | 261 if(heap==NULL) |
262 { | |
263 heap=malloc(20000000); | |
264 memset(heap, 0xCC,20000000); | |
265 } | |
266 if(heap==0) | |
267 { | |
268 printf("No enough memory\n"); | |
269 return 0; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
270 } |
1 | 271 if(heap_counter+size>20000000) |
272 { | |
273 printf("No enough memory\n"); | |
274 return 0; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
275 } |
1 | 276 *(int*)(heap+heap_counter)=0x433476; |
277 heap_counter+=4; | |
278 *(int*)(heap+heap_counter)=size; | |
279 heap_counter+=4; | |
280 printf("Allocated %d bytes of memory: sys %d, user %d-%d\n", size, heap_counter-8, heap_counter, heap_counter+size); | |
281 if(to_zero) | |
3465 | 282 memset(heap+heap_counter, 0, size); |
1543 | 283 else |
2139 | 284 memset(heap+heap_counter, 0xcc, size); // make crash reproducable |
1 | 285 heap_counter+=size; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
286 return heap+heap_counter-size; |
1 | 287 } |
2069 | 288 int my_release(char* memory) |
1 | 289 { |
3465 | 290 // test_heap(); |
1 | 291 if(memory==NULL) |
292 { | |
293 printf("ERROR: free(0)\n"); | |
294 return 0; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
295 } |
1 | 296 if(*(int*)(memory-8)!=0x433476) |
297 { | |
298 printf("MEMORY CORRUPTION !!!!!!!!!!!!!!!!!!!\n"); | |
299 return 0; | |
300 } | |
301 printf("Freed %d bytes of memory\n", *(int*)(memory-4)); | |
3465 | 302 // memset(memory-8, *(int*)(memory-4), 0xCC); |
1 | 303 return 0; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
304 } |
1 | 305 |
306 #else | |
128 | 307 #define GARBAGE |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
308 typedef struct alloc_header_t alloc_header; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
309 struct alloc_header_t |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
310 { |
3465 | 311 // let's keep allocated data 16 byte aligned |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
312 alloc_header* prev; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
313 alloc_header* next; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
314 long deadbeef; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
315 long size; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
316 long type; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
317 long reserved1; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
318 long reserved2; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
319 long reserved3; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
320 }; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
321 |
128 | 322 #ifdef GARBAGE |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
323 static alloc_header* last_alloc = NULL; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
324 static int alccnt = 0; |
128 | 325 #endif |
326 | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
327 #define AREATYPE_CLIENT 0 |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
328 #define AREATYPE_EVENT 1 |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
329 #define AREATYPE_MUTEX 2 |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
330 #define AREATYPE_COND 3 |
3134 | 331 #define AREATYPE_CRITSECT 4 |
332 | |
333 /* -- critical sections -- */ | |
334 struct CRITSECT | |
335 { | |
336 pthread_t id; | |
337 pthread_mutex_t mutex; | |
338 int locked; | |
339 }; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
340 |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
341 void* mreq_private(int size, int to_zero, int type); |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
342 void* mreq_private(int size, int to_zero, int type) |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
343 { |
3465 | 344 int nsize = size + sizeof(alloc_header); |
345 alloc_header* header = malloc(nsize); | |
346 if (!header) | |
347 return 0; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
348 if (to_zero) |
3465 | 349 memset(header, 0, nsize); |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
350 #ifdef GARBAGE |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
351 if (!last_alloc) |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
352 { |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
353 pthread_mutex_init(&memmut, NULL); |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
354 pthread_mutex_lock(&memmut); |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
355 } |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
356 else |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
357 { |
3465 | 358 pthread_mutex_lock(&memmut); |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
359 last_alloc->next = header; /* set next */ |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
360 } |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
361 |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
362 header->prev = last_alloc; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
363 header->next = 0; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
364 last_alloc = header; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
365 alccnt++; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
366 pthread_mutex_unlock(&memmut); |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
367 #endif |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
368 header->deadbeef = 0xdeadbeef; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
369 header->size = size; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
370 header->type = type; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
371 |
3128 | 372 //if (alccnt < 40000) printf("MY_REQ: %p\t%d t:%d (cnt:%d)\n", header, size, type, alccnt); |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
373 return header + 1; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
374 } |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
375 |
597 | 376 int my_release(void* memory) |
1 | 377 { |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
378 alloc_header* header = (alloc_header*) memory - 1; |
128 | 379 #ifdef GARBAGE |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
380 alloc_header* prevmem; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
381 alloc_header* nextmem; |
3134 | 382 |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
383 if (memory == 0) |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
384 return 0; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
385 |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
386 if (header->deadbeef != 0xdeadbeef) |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
387 { |
3128 | 388 printf("FATAL releasing corrupted memory! %p 0x%lx (%d)\n", header, header->deadbeef, alccnt); |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
389 return 0; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
390 } |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
391 |
3128 | 392 pthread_mutex_lock(&memmut); |
393 | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
394 switch(header->type) |
128 | 395 { |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
396 case AREATYPE_EVENT: |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
397 destroy_event(memory); |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
398 break; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
399 case AREATYPE_COND: |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
400 pthread_cond_destroy((pthread_cond_t*)memory); |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
401 break; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
402 case AREATYPE_MUTEX: |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
403 pthread_mutex_destroy((pthread_mutex_t*)memory); |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
404 break; |
3134 | 405 case AREATYPE_CRITSECT: |
406 pthread_mutex_destroy(&((struct CRITSECT*)memory)->mutex); | |
407 break; | |
408 default: | |
409 //memset(memory, 0xcc, header->size); | |
4384 | 410 ; |
128 | 411 } |
3128 | 412 |
3465 | 413 header->deadbeef = 0; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
414 prevmem = header->prev; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
415 nextmem = header->next; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
416 |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
417 if (prevmem) |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
418 prevmem->next = nextmem; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
419 if (nextmem) |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
420 nextmem->prev = prevmem; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
421 |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
422 if (header == last_alloc) |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
423 last_alloc = prevmem; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
424 |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
425 alccnt--; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
426 |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
427 if (last_alloc) |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
428 pthread_mutex_unlock(&memmut); |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
429 else |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
430 pthread_mutex_destroy(&memmut); |
3465 | 431 |
3128 | 432 //if (alccnt < 40000) printf("MY_RELEASE: %p\t%ld (%d)\n", header, header->size, alccnt); |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
433 #else |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
434 if (memory == 0) |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
435 return 0; |
128 | 436 #endif |
3465 | 437 //memset(header + 1, 0xcc, header->size); |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
438 free(header); |
1 | 439 return 0; |
440 } | |
441 #endif | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
442 |
3465 | 443 inline void* my_mreq(int size, int to_zero) |
444 { | |
445 return mreq_private(size, to_zero, AREATYPE_CLIENT); | |
446 } | |
447 | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
448 static inline int my_size(void* memory) |
2069 | 449 { |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
450 return ((alloc_header*)memory)[-1].size; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
451 } |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
452 |
3465 | 453 static void* my_realloc(void* memory, int size) |
1 | 454 { |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
455 void *ans = memory; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
456 int osize = my_size(memory); |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
457 if (memory == NULL) |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
458 return my_mreq(size, 0); |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
459 if (osize < size) |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
460 { |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
461 ans = my_mreq(size, 0); |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
462 memcpy(ans, memory, osize); |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
463 my_release(memory); |
2069 | 464 } |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
465 return ans; |
2069 | 466 } |
1 | 467 |
3465 | 468 /* |
469 * | |
470 * WINE API - native implementation for several win32 libraries | |
471 * | |
472 */ | |
473 | |
474 static int WINAPI ext_unknown() | |
1 | 475 { |
476 printf("Unknown func called\n"); | |
477 return 0; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
478 } |
3465 | 479 |
480 static int WINAPI expIsBadWritePtr(void* ptr, unsigned int count) | |
1 | 481 { |
3465 | 482 int result = (count == 0 || ptr != 0) ? 0 : 1; |
128 | 483 dbgprintf("IsBadWritePtr(0x%x, 0x%x) => %d\n", ptr, count, result); |
484 return result; | |
1 | 485 } |
3465 | 486 static int WINAPI expIsBadReadPtr(void* ptr, unsigned int count) |
1 | 487 { |
3465 | 488 int result = (count == 0 || ptr != 0) ? 0 : 1; |
128 | 489 dbgprintf("IsBadReadPtr(0x%x, 0x%x) => %d\n", ptr, count, result); |
490 return result; | |
1 | 491 } |
3465 | 492 static int WINAPI expDisableThreadLibraryCalls(int module) |
1 | 493 { |
128 | 494 dbgprintf("DisableThreadLibraryCalls(0x%x) => 0\n", module); |
1 | 495 return 0; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
496 } |
3465 | 497 |
498 static HMODULE WINAPI expGetDriverModuleHandle(DRVR* pdrv) | |
1 | 499 { |
2069 | 500 HMODULE result; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
501 if (pdrv==NULL) |
2069 | 502 result=0; |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
503 else |
3465 | 504 result=pdrv->hDriverModule; |
2069 | 505 dbgprintf("GetDriverModuleHandle(%p) => %p\n", pdrv, result); |
128 | 506 return result; |
1 | 507 } |
508 | |
2069 | 509 #define MODULE_HANDLE_kernel32 ((HMODULE)0x120) |
510 | |
3465 | 511 static HMODULE WINAPI expGetModuleHandleA(const char* name) |
1 | 512 { |
3465 | 513 WINE_MODREF* wm; |
514 HMODULE result; | |
515 if(!name) | |
516 result=0; | |
517 else | |
518 { | |
519 wm=MODULE_FindModule(name); | |
520 if(wm==0)result=0; | |
128 | 521 else |
3465 | 522 result=(HMODULE)(wm->module); |
523 } | |
524 if(!result) | |
525 { | |
3672
1d48df12001b
fixes for vdub plugin support - by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
3547
diff
changeset
|
526 if(name && strcasecmp(name, "kernel32")==0) |
3465 | 527 result=MODULE_HANDLE_kernel32; |
528 } | |
529 dbgprintf("GetModuleHandleA('%s') => 0x%x\n", name, result); | |
530 return result; | |
1 | 531 } |
128 | 532 |
1 | 533 |
3465 | 534 static void* WINAPI expCreateThread(void* pSecAttr, long dwStackSize, |
535 void* lpStartAddress, void* lpParameter, | |
536 long dwFlags, long* dwThreadId) | |
1 | 537 { |
538 pthread_t *pth; | |
3465 | 539 // printf("CreateThread:"); |
1 | 540 pth=my_mreq(sizeof(pthread_t), 0); |
541 pthread_create(pth, NULL, (void*(*)(void*))lpStartAddress, lpParameter); | |
542 if(dwFlags) | |
128 | 543 printf( "WARNING: CreateThread flags not supported\n"); |
1 | 544 if(dwThreadId) |
545 *dwThreadId=(long)pth; | |
546 if(list==NULL) | |
547 { | |
548 list=my_mreq(sizeof(th_list), 1); | |
549 list->next=list->prev=NULL; | |
550 } | |
551 else | |
552 { | |
553 list->next=my_mreq(sizeof(th_list), 0); | |
554 list->next->prev=list; | |
555 list->next->next=NULL; | |
556 list=list->next; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
557 } |
1 | 558 list->thread=pth; |
128 | 559 dbgprintf("CreateThread(0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x) => 0x%x\n", |
3465 | 560 pSecAttr, dwStackSize, lpStartAddress, lpParameter, dwFlags, dwThreadId, pth); |
1 | 561 return pth; |
562 } | |
563 | |
564 struct mutex_list_t; | |
565 | |
566 struct mutex_list_t | |
567 { | |
128 | 568 char type; |
1 | 569 pthread_mutex_t *pm; |
128 | 570 pthread_cond_t *pc; |
571 char state; | |
572 char reset; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
573 char name[128]; |
128 | 574 int semaphore; |
1 | 575 struct mutex_list_t* next; |
576 struct mutex_list_t* prev; | |
577 }; | |
578 typedef struct mutex_list_t mutex_list; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
579 static mutex_list* mlist=NULL; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
580 |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
581 void destroy_event(void* event) |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
582 { |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
583 mutex_list* pp=mlist; |
3465 | 584 // printf("garbage collector: destroy_event(%x)\n", event); |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
585 while(pp) |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
586 { |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
587 if(pp==(mutex_list*)event) |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
588 { |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
589 if(pp->next) |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
590 pp->next->prev=pp->prev; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
591 if(pp->prev) |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
592 pp->prev->next=pp->next; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
593 if(mlist==(mutex_list*)event) |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
594 mlist=mlist->prev; |
3465 | 595 /* |
596 pp=mlist; | |
597 while(pp) | |
598 { | |
599 printf("%x => ", pp); | |
600 pp=pp->prev; | |
601 } | |
602 printf("0\n"); | |
603 */ | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
604 return; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
605 } |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
606 pp=pp->prev; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
607 } |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
608 } |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
609 |
3465 | 610 static void* WINAPI expCreateEventA(void* pSecAttr, char bManualReset, |
611 char bInitialState, const char* name) | |
1 | 612 { |
613 pthread_mutex_t *pm; | |
128 | 614 pthread_cond_t *pc; |
3465 | 615 /* |
616 mutex_list* pp; | |
617 pp=mlist; | |
618 while(pp) | |
619 { | |
620 printf("%x => ", pp); | |
621 pp=pp->prev; | |
622 } | |
623 printf("0\n"); | |
624 */ | |
1 | 625 if(mlist!=NULL) |
626 { | |
627 mutex_list* pp=mlist; | |
628 if(name!=NULL) | |
3465 | 629 do |
1 | 630 { |
128 | 631 if((strcmp(pp->name, name)==0) && (pp->type==0)) |
632 { | |
633 dbgprintf("CreateEventA(0x%x, 0x%x, 0x%x, 0x%x='%s') => 0x%x\n", | |
3465 | 634 pSecAttr, bManualReset, bInitialState, name, name, pp->pm); |
1 | 635 return pp->pm; |
128 | 636 } |
2069 | 637 }while((pp=pp->prev) != NULL); |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
638 } |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
639 pm=mreq_private(sizeof(pthread_mutex_t), 0, AREATYPE_MUTEX); |
1 | 640 pthread_mutex_init(pm, NULL); |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
641 pc=mreq_private(sizeof(pthread_cond_t), 0, AREATYPE_COND); |
128 | 642 pthread_cond_init(pc, NULL); |
1 | 643 if(mlist==NULL) |
644 { | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
645 mlist=mreq_private(sizeof(mutex_list), 00, AREATYPE_EVENT); |
1 | 646 mlist->next=mlist->prev=NULL; |
647 } | |
648 else | |
649 { | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
650 mlist->next=mreq_private(sizeof(mutex_list), 00, AREATYPE_EVENT); |
128 | 651 mlist->next->prev=mlist; |
1 | 652 mlist->next->next=NULL; |
653 mlist=mlist->next; | |
654 } | |
128 | 655 mlist->type=0; /* Type Event */ |
1 | 656 mlist->pm=pm; |
128 | 657 mlist->pc=pc; |
658 mlist->state=bInitialState; | |
659 mlist->reset=bManualReset; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
660 if(name) |
3465 | 661 strncpy(mlist->name, name, 127); |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
662 else |
1 | 663 mlist->name[0]=0; |
664 if(pm==NULL) | |
665 dbgprintf("ERROR::: CreateEventA failure\n"); | |
3465 | 666 /* |
667 if(bInitialState) | |
668 pthread_mutex_lock(pm); | |
669 */ | |
128 | 670 if(name) |
3465 | 671 dbgprintf("CreateEventA(0x%x, 0x%x, 0x%x, 0x%x='%s') => 0x%x\n", |
672 pSecAttr, bManualReset, bInitialState, name, name, mlist); | |
128 | 673 else |
3465 | 674 dbgprintf("CreateEventA(0x%x, 0x%x, 0x%x, NULL) => 0x%x\n", |
675 pSecAttr, bManualReset, bInitialState, mlist); | |
128 | 676 return mlist; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
677 } |
1 | 678 |
3465 | 679 static void* WINAPI expSetEvent(void* event) |
1 | 680 { |
128 | 681 mutex_list *ml = (mutex_list *)event; |
682 dbgprintf("SetEvent(%x) => 0x1\n", event); | |
683 pthread_mutex_lock(ml->pm); | |
684 if (ml->state == 0) { | |
685 ml->state = 1; | |
686 pthread_cond_signal(ml->pc); | |
687 } | |
688 pthread_mutex_unlock(ml->pm); | |
689 | |
690 return (void *)1; | |
1 | 691 } |
3465 | 692 static void* WINAPI expResetEvent(void* event) |
1 | 693 { |
128 | 694 mutex_list *ml = (mutex_list *)event; |
695 dbgprintf("ResetEvent(0x%x) => 0x1\n", event); | |
696 pthread_mutex_lock(ml->pm); | |
697 ml->state = 0; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
698 pthread_mutex_unlock(ml->pm); |
128 | 699 |
700 return (void *)1; | |
1 | 701 } |
702 | |
3465 | 703 static void* WINAPI expWaitForSingleObject(void* object, int duration) |
1 | 704 { |
128 | 705 mutex_list *ml = (mutex_list *)object; |
2069 | 706 // FIXME FIXME FIXME - this value is sometime unititialize !!! |
707 int ret = WAIT_FAILED; | |
128 | 708 mutex_list* pp=mlist; |
2779 | 709 if(object == (void*)0xcfcf9898) |
710 { | |
3465 | 711 /** |
712 From GetCurrentThread() documentation: | |
713 A pseudo handle is a special constant that is interpreted as the current thread handle. The calling thread can use this handle to specify itself whenever a thread handle is required. Pseudo handles are not inherited by child processes. | |
714 | |
715 This handle has the maximum possible access to the thread object. For systems that support security descriptors, this is the maximum access allowed by the security descriptor for the calling process. For systems that do not support security descriptors, this is THREAD_ALL_ACCESS. | |
716 | |
717 The function cannot be used by one thread to create a handle that can be used by other threads to refer to the first thread. The handle is always interpreted as referring to the thread that is using it. A thread can create a "real" handle to itself that can be used by other threads, or inherited by other processes, by specifying the pseudo handle as the source handle in a call to the DuplicateHandle function. | |
718 **/ | |
2779 | 719 dbgprintf("WaitForSingleObject(thread_handle) called\n"); |
3128 | 720 return (void*)WAIT_FAILED; |
2779 | 721 } |
2069 | 722 dbgprintf("WaitForSingleObject(0x%x, duration %d) =>\n",object, duration); |
723 | |
718 | 724 // loop below was slightly fixed - its used just for checking if |
725 // this object really exists in our list | |
726 if (!ml) | |
3465 | 727 return (void*) ret; |
718 | 728 while (pp && (pp->pm != ml->pm)) |
2069 | 729 pp = pp->prev; |
718 | 730 if (!pp) { |
2069 | 731 dbgprintf("WaitForSingleObject: NotFound\n"); |
732 return (void*)ret; | |
718 | 733 } |
128 | 734 |
735 pthread_mutex_lock(ml->pm); | |
736 | |
737 switch(ml->type) { | |
3465 | 738 case 0: /* Event */ |
128 | 739 if (duration == 0) { /* Check Only */ |
3465 | 740 if (ml->state == 1) ret = WAIT_FAILED; |
741 else ret = WAIT_OBJECT_0; | |
128 | 742 } |
743 if (duration == -1) { /* INFINITE */ | |
3465 | 744 if (ml->state == 0) |
745 pthread_cond_wait(ml->pc,ml->pm); | |
746 if (ml->reset) | |
747 ml->state = 0; | |
748 ret = WAIT_OBJECT_0; | |
128 | 749 } |
750 if (duration > 0) { /* Timed Wait */ | |
3465 | 751 struct timespec abstime; |
752 struct timeval now; | |
753 gettimeofday(&now, 0); | |
754 abstime.tv_sec = now.tv_sec + (now.tv_usec+duration)/1000000; | |
755 abstime.tv_nsec = ((now.tv_usec+duration)%1000000)*1000; | |
756 if (ml->state == 0) | |
757 ret=pthread_cond_timedwait(ml->pc,ml->pm,&abstime); | |
758 if (ret == ETIMEDOUT) ret = WAIT_TIMEOUT; | |
759 else ret = WAIT_OBJECT_0; | |
760 if (ml->reset) | |
761 ml->state = 0; | |
128 | 762 } |
3465 | 763 break; |
764 case 1: /* Semaphore */ | |
765 if (duration == 0) { | |
766 if(ml->semaphore==0) ret = WAIT_FAILED; | |
767 else { | |
768 ml->semaphore++; | |
769 ret = WAIT_OBJECT_0; | |
770 } | |
771 } | |
128 | 772 if (duration == -1) { |
3465 | 773 if (ml->semaphore==0) |
774 pthread_cond_wait(ml->pc,ml->pm); | |
775 ml->semaphore--; | |
128 | 776 } |
3465 | 777 break; |
128 | 778 } |
779 pthread_mutex_unlock(ml->pm); | |
780 | |
781 dbgprintf("WaitForSingleObject(0x%x, %d): 0x%x => 0x%x \n",object,duration,ml,ret); | |
782 return (void *)ret; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
783 } |
1 | 784 |
785 static BYTE PF[64] = {0,}; | |
786 | |
3465 | 787 static WIN_BOOL WINAPI expIsProcessorFeaturePresent(DWORD v) |
128 | 788 { |
789 WIN_BOOL result; | |
790 if(v>63)result=0; | |
791 else result=PF[v]; | |
792 dbgprintf("IsProcessorFeaturePresent(0x%x) => 0x%x\n", v, result); | |
793 return result; | |
794 } | |
795 | |
796 static void DumpSystemInfo(const SYSTEM_INFO* si) | |
797 { | |
798 dbgprintf(" Processor architecture %d\n", si->u.s.wProcessorArchitecture); | |
799 dbgprintf(" Page size: %d\n", si->dwPageSize); | |
800 dbgprintf(" Minimum app address: %d\n", si->lpMinimumApplicationAddress); | |
801 dbgprintf(" Maximum app address: %d\n", si->lpMaximumApplicationAddress); | |
802 dbgprintf(" Active processor mask: 0x%x\n", si->dwActiveProcessorMask); | |
803 dbgprintf(" Number of processors: %d\n", si->dwNumberOfProcessors); | |
804 dbgprintf(" Processor type: 0x%x\n", si->dwProcessorType); | |
805 dbgprintf(" Allocation granularity: 0x%x\n", si->dwAllocationGranularity); | |
806 dbgprintf(" Processor level: 0x%x\n", si->wProcessorLevel); | |
807 dbgprintf(" Processor revision: 0x%x\n", si->wProcessorRevision); | |
808 } | |
809 | |
3465 | 810 static void WINAPI expGetSystemInfo(SYSTEM_INFO* si) |
1 | 811 { |
3465 | 812 /* FIXME: better values for the two entries below... */ |
813 static int cache = 0; | |
814 static SYSTEM_INFO cachedsi; | |
815 unsigned int regs[4]; | |
816 dbgprintf("GetSystemInfo(%p) =>\n", si); | |
817 | |
818 if (cache) { | |
819 memcpy(si,&cachedsi,sizeof(*si)); | |
820 DumpSystemInfo(si); | |
821 return; | |
822 } | |
823 memset(PF,0,sizeof(PF)); | |
824 | |
825 cachedsi.u.s.wProcessorArchitecture = PROCESSOR_ARCHITECTURE_INTEL; | |
826 cachedsi.dwPageSize = getpagesize(); | |
827 | |
828 /* FIXME: better values for the two entries below... */ | |
829 cachedsi.lpMinimumApplicationAddress = (void *)0x00000000; | |
830 cachedsi.lpMaximumApplicationAddress = (void *)0x7FFFFFFF; | |
831 cachedsi.dwActiveProcessorMask = 1; | |
832 cachedsi.dwNumberOfProcessors = 1; | |
833 cachedsi.dwProcessorType = PROCESSOR_INTEL_386; | |
834 cachedsi.dwAllocationGranularity = 0x10000; | |
835 cachedsi.wProcessorLevel = 5; /* pentium */ | |
836 cachedsi.wProcessorRevision = 0x0101; | |
837 | |
838 #ifdef MPLAYER | |
839 /* mplayer's way to detect PF's */ | |
840 { | |
841 #include "../cpudetect.h" | |
842 extern CpuCaps gCpuCaps; | |
843 | |
844 if (gCpuCaps.hasMMX) | |
845 PF[PF_MMX_INSTRUCTIONS_AVAILABLE] = TRUE; | |
846 if (gCpuCaps.hasSSE) | |
847 PF[PF_XMMI_INSTRUCTIONS_AVAILABLE] = TRUE; | |
848 if (gCpuCaps.has3DNow) | |
849 PF[PF_AMD3D_INSTRUCTIONS_AVAILABLE] = TRUE; | |
3404 | 850 |
851 switch(gCpuCaps.cpuType) | |
852 { | |
853 case CPUTYPE_I686: | |
854 case CPUTYPE_I586: | |
855 cachedsi.dwProcessorType = PROCESSOR_INTEL_PENTIUM; | |
856 cachedsi.wProcessorLevel = 5; | |
857 break; | |
858 case CPUTYPE_I486: | |
859 cachedsi.dwProcessorType = PROCESSOR_INTEL_486; | |
860 cachedsi.wProcessorLevel = 4; | |
861 break; | |
862 case CPUTYPE_I386: | |
863 default: | |
864 cachedsi.dwProcessorType = PROCESSOR_INTEL_386; | |
865 cachedsi.wProcessorLevel = 3; | |
866 break; | |
867 } | |
868 cachedsi.wProcessorRevision = gCpuCaps.cpuStepping; | |
869 cachedsi.dwNumberOfProcessors = 1; /* hardcoded */ | |
3465 | 870 |
871 } | |
3405 | 872 #endif |
3128 | 873 |
3404 | 874 /* disable cpuid based detection (mplayer's cpudetect.c does this - see above) */ |
3465 | 875 #ifndef MPLAYER |
1038
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J«ärgen Keil <jk@tools.de>
arpi_esp
parents:
718
diff
changeset
|
876 #if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__svr4__) |
3465 | 877 do_cpuid(1, regs); |
878 switch ((regs[0] >> 8) & 0xf) { // cpu family | |
879 case 3: cachedsi.dwProcessorType = PROCESSOR_INTEL_386; | |
880 cachedsi.wProcessorLevel= 3; | |
881 break; | |
882 case 4: cachedsi.dwProcessorType = PROCESSOR_INTEL_486; | |
883 cachedsi.wProcessorLevel= 4; | |
884 break; | |
885 case 5: cachedsi.dwProcessorType = PROCESSOR_INTEL_PENTIUM; | |
886 cachedsi.wProcessorLevel= 5; | |
887 break; | |
888 case 6: cachedsi.dwProcessorType = PROCESSOR_INTEL_PENTIUM; | |
889 cachedsi.wProcessorLevel= 5; | |
890 break; | |
891 default:cachedsi.dwProcessorType = PROCESSOR_INTEL_PENTIUM; | |
892 cachedsi.wProcessorLevel= 5; | |
893 break; | |
894 } | |
895 cachedsi.wProcessorRevision = regs[0] & 0xf; // stepping | |
896 if (regs[3] & (1 << 8)) | |
897 PF[PF_COMPARE_EXCHANGE_DOUBLE] = TRUE; | |
898 if (regs[3] & (1 << 23)) | |
899 PF[PF_MMX_INSTRUCTIONS_AVAILABLE] = TRUE; | |
900 if (regs[3] & (1 << 25)) | |
901 PF[PF_XMMI_INSTRUCTIONS_AVAILABLE] = TRUE; | |
902 if (regs[3] & (1 << 31)) | |
903 PF[PF_AMD3D_INSTRUCTIONS_AVAILABLE] = TRUE; | |
904 cachedsi.dwNumberOfProcessors=1; | |
3404 | 905 #endif |
3465 | 906 #endif /* MPLAYER */ |
3404 | 907 |
3405 | 908 /* MPlayer: linux detection enabled (based on proc/cpuinfo) for checking |
909 fdiv_bug and fpu emulation flags -- alex/MPlayer */ | |
3404 | 910 #ifdef __linux__ |
3465 | 911 { |
1 | 912 char buf[20]; |
913 char line[200]; | |
914 FILE *f = fopen ("/proc/cpuinfo", "r"); | |
915 | |
916 if (!f) | |
3465 | 917 return; |
1 | 918 while (fgets(line,200,f)!=NULL) { |
3465 | 919 char *s,*value; |
920 | |
921 /* NOTE: the ':' is the only character we can rely on */ | |
922 if (!(value = strchr(line,':'))) | |
923 continue; | |
924 /* terminate the valuename */ | |
925 *value++ = '\0'; | |
926 /* skip any leading spaces */ | |
927 while (*value==' ') value++; | |
928 if ((s=strchr(value,'\n'))) | |
929 *s='\0'; | |
930 | |
931 /* 2.1 method */ | |
932 if (!lstrncmpiA(line, "cpu family",strlen("cpu family"))) { | |
933 if (isdigit (value[0])) { | |
934 switch (value[0] - '0') { | |
935 case 3: cachedsi.dwProcessorType = PROCESSOR_INTEL_386; | |
936 cachedsi.wProcessorLevel= 3; | |
937 break; | |
938 case 4: cachedsi.dwProcessorType = PROCESSOR_INTEL_486; | |
939 cachedsi.wProcessorLevel= 4; | |
940 break; | |
941 case 5: cachedsi.dwProcessorType = PROCESSOR_INTEL_PENTIUM; | |
942 cachedsi.wProcessorLevel= 5; | |
943 break; | |
944 case 6: cachedsi.dwProcessorType = PROCESSOR_INTEL_PENTIUM; | |
945 cachedsi.wProcessorLevel= 5; | |
946 break; | |
947 default:cachedsi.dwProcessorType = PROCESSOR_INTEL_PENTIUM; | |
948 cachedsi.wProcessorLevel= 5; | |
949 break; | |
950 } | |
1 | 951 } |
3465 | 952 /* set the CPU type of the current processor */ |
953 sprintf(buf,"CPU %ld",cachedsi.dwProcessorType); | |
954 continue; | |
955 } | |
956 /* old 2.0 method */ | |
957 if (!lstrncmpiA(line, "cpu",strlen("cpu"))) { | |
958 if ( isdigit (value[0]) && value[1] == '8' && | |
959 value[2] == '6' && value[3] == 0 | |
960 ) { | |
961 switch (value[0] - '0') { | |
962 case 3: cachedsi.dwProcessorType = PROCESSOR_INTEL_386; | |
963 cachedsi.wProcessorLevel= 3; | |
964 break; | |
965 case 4: cachedsi.dwProcessorType = PROCESSOR_INTEL_486; | |
966 cachedsi.wProcessorLevel= 4; | |
967 break; | |
968 case 5: cachedsi.dwProcessorType = PROCESSOR_INTEL_PENTIUM; | |
969 cachedsi.wProcessorLevel= 5; | |
970 break; | |
971 case 6: cachedsi.dwProcessorType = PROCESSOR_INTEL_PENTIUM; | |
972 cachedsi.wProcessorLevel= 5; | |
973 break; | |
974 default:cachedsi.dwProcessorType = PROCESSOR_INTEL_PENTIUM; | |
975 cachedsi.wProcessorLevel= 5; | |
976 break; | |
977 } | |
1 | 978 } |
3465 | 979 /* set the CPU type of the current processor */ |
980 sprintf(buf,"CPU %ld",cachedsi.dwProcessorType); | |
981 continue; | |
982 } | |
983 if (!lstrncmpiA(line,"fdiv_bug",strlen("fdiv_bug"))) { | |
984 if (!lstrncmpiA(value,"yes",3)) | |
985 PF[PF_FLOATING_POINT_PRECISION_ERRATA] = TRUE; | |
986 | |
987 continue; | |
988 } | |
989 if (!lstrncmpiA(line,"fpu",strlen("fpu"))) { | |
990 if (!lstrncmpiA(value,"no",2)) | |
991 PF[PF_FLOATING_POINT_EMULATED] = TRUE; | |
992 | |
993 continue; | |
994 } | |
995 if (!lstrncmpiA(line,"processor",strlen("processor"))) { | |
996 /* processor number counts up...*/ | |
997 int x; | |
998 | |
999 if (sscanf(value,"%d",&x)) | |
1000 if (x+1>cachedsi.dwNumberOfProcessors) | |
1001 cachedsi.dwNumberOfProcessors=x+1; | |
1002 | |
1003 /* Create a new processor subkey on a multiprocessor | |
1004 * system | |
1005 */ | |
1006 sprintf(buf,"%d",x); | |
1007 } | |
1008 if (!lstrncmpiA(line,"stepping",strlen("stepping"))) { | |
1009 int x; | |
1010 | |
1011 if (sscanf(value,"%d",&x)) | |
1012 cachedsi.wProcessorRevision = x; | |
1013 } | |
1014 if | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1015 ( (!lstrncmpiA(line,"flags",strlen("flags"))) |
3465 | 1016 || (!lstrncmpiA(line,"features",strlen("features"))) ) |
1017 { | |
1018 if (strstr(value,"cx8")) | |
1019 PF[PF_COMPARE_EXCHANGE_DOUBLE] = TRUE; | |
1020 if (strstr(value,"mmx")) | |
1021 PF[PF_MMX_INSTRUCTIONS_AVAILABLE] = TRUE; | |
1022 if (strstr(value,"tsc")) | |
1023 PF[PF_RDTSC_INSTRUCTION_AVAILABLE] = TRUE; | |
1024 if (strstr(value,"xmm")) | |
1025 PF[PF_XMMI_INSTRUCTIONS_AVAILABLE] = TRUE; | |
1026 if (strstr(value,"3dnow")) | |
1027 PF[PF_AMD3D_INSTRUCTIONS_AVAILABLE] = TRUE; | |
1028 } | |
1 | 1029 } |
1030 fclose (f); | |
3465 | 1031 /* |
1032 * ad hoc fix for smp machines. | |
1033 * some problems on WaitForSingleObject,CreateEvent,SetEvent | |
1034 * CreateThread ...etc.. | |
1035 * | |
1036 */ | |
1037 cachedsi.dwNumberOfProcessors=1; | |
1038 } | |
3404 | 1039 #endif /* __linux__ */ |
3465 | 1040 cache = 1; |
1041 memcpy(si,&cachedsi,sizeof(*si)); | |
1042 DumpSystemInfo(si); | |
1 | 1043 } |
1044 | |
3465 | 1045 static long WINAPI expGetVersion() |
1 | 1046 { |
128 | 1047 dbgprintf("GetVersion() => 0xC0000004\n"); |
1048 return 0xC0000004;//Windows 95 | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1049 } |
1 | 1050 |
3465 | 1051 static HANDLE WINAPI expHeapCreate(long flags, long init_size, long max_size) |
1 | 1052 { |
3465 | 1053 // printf("HeapCreate:"); |
128 | 1054 HANDLE result; |
1 | 1055 if(init_size==0) |
3465 | 1056 result=(HANDLE)my_mreq(0x110000, 0); |
1 | 1057 else |
3465 | 1058 result=(HANDLE)my_mreq((init_size + 0xfff) & 0x7ffff000 , 0); |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1059 dbgprintf("HeapCreate(flags 0x%x, initial size %d, maximum size %d) => 0x%x\n", flags, init_size, max_size, result); |
128 | 1060 return result; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1061 } |
3128 | 1062 |
1063 // this is another dirty hack | |
3465 | 1064 // VP31 is releasing one allocated Heap chunk twice |
3128 | 1065 // we will silently ignore this second call... |
1066 static void* heapfreehack = 0; | |
1067 static int heapfreehackshown = 0; | |
3465 | 1068 //extern void trapbug(void); |
1069 static void* WINAPI expHeapAlloc(HANDLE heap, int flags, int size) | |
1 | 1070 { |
1071 void* z; | |
3465 | 1072 /** |
1073 Morgan's m3jpeg32.dll v. 2.0 encoder expects that request for | |
1074 HeapAlloc returns area larger than size argument :-/ | |
1075 | |
1076 actually according to M$ Doc HeapCreate size should be rounded | |
1077 to page boundaries thus we should simulate this | |
1078 **/ | |
1079 //if (size == 22276) trapbug(); | |
1080 z=my_mreq((size + 0xfff) & 0x7ffff000, (flags & HEAP_ZERO_MEMORY)); | |
1 | 1081 if(z==0) |
1082 printf("HeapAlloc failure\n"); | |
3465 | 1083 dbgprintf("HeapAlloc(heap 0x%x, flags 0x%x, size %d) => 0x%x\n", heap, flags, size, z); |
3128 | 1084 heapfreehack = 0; // reset |
1 | 1085 return z; |
1086 } | |
3465 | 1087 static long WINAPI expHeapDestroy(void* heap) |
1 | 1088 { |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1089 dbgprintf("HeapDestroy(heap 0x%x) => 1\n", heap); |
1 | 1090 my_release(heap); |
1091 return 1; | |
1092 } | |
1093 | |
3465 | 1094 static long WINAPI expHeapFree(int arg1, int arg2, void* ptr) |
1 | 1095 { |
128 | 1096 dbgprintf("HeapFree(0x%x, 0x%x, pointer 0x%x) => 1\n", arg1, arg2, ptr); |
3134 | 1097 if (heapfreehack != ptr && ptr != (void*)0xffffffff) |
3128 | 1098 my_release(ptr); |
1099 else | |
1100 { | |
3465 | 1101 if (!heapfreehackshown++) |
3128 | 1102 printf("Info: HeapFree deallocating same memory twice! (%p)\n", ptr); |
1103 } | |
1104 heapfreehack = ptr; | |
1 | 1105 return 1; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1106 } |
3465 | 1107 static long WINAPI expHeapSize(int heap, int flags, void* pointer) |
1 | 1108 { |
128 | 1109 long result=my_size(pointer); |
1110 dbgprintf("HeapSize(heap 0x%x, flags 0x%x, pointer 0x%x) => %d\n", heap, flags, pointer, result); | |
1111 return result; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1112 } |
3465 | 1113 static void* WINAPI expHeapReAlloc(HANDLE heap,int flags,void *lpMem,int size) |
2069 | 1114 { |
3465 | 1115 long orgsize = my_size(lpMem); |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1116 dbgprintf("HeapReAlloc() Size %ld org %d\n",orgsize,size); |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1117 return my_realloc(lpMem, size); |
2069 | 1118 } |
3465 | 1119 static long WINAPI expGetProcessHeap(void) |
1 | 1120 { |
128 | 1121 dbgprintf("GetProcessHeap() => 1\n"); |
1 | 1122 return 1; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1123 } |
3465 | 1124 static void* WINAPI expVirtualAlloc(void* v1, long v2, long v3, long v4) |
1 | 1125 { |
3465 | 1126 void* z = VirtualAlloc(v1, v2, v3, v4); |
1 | 1127 if(z==0) |
1128 printf("VirtualAlloc failure\n"); | |
128 | 1129 dbgprintf("VirtualAlloc(0x%x, %d, %d, %d) => 0x%x \n",v1,v2,v3,v4, z); |
1 | 1130 return z; |
1131 } | |
3465 | 1132 static int WINAPI expVirtualFree(void* v1, int v2, int v3) |
1 | 1133 { |
3465 | 1134 int result = VirtualFree(v1,v2,v3); |
128 | 1135 dbgprintf("VirtualFree(0x%x, %d, %d) => %d\n",v1,v2,v3, result); |
1136 return result; | |
3128 | 1137 } |
2579 | 1138 |
1139 /* we're building a table of critical sections. cs_win pointer uses the DLL | |
3465 | 1140 cs_unix is the real structure, we're using cs_win only to identifying cs_unix */ |
2579 | 1141 struct critsecs_list_t |
1142 { | |
1143 CRITICAL_SECTION *cs_win; | |
1144 struct CRITSECT *cs_unix; | |
1145 }; | |
1146 | |
3457 | 1147 /* 'NEWTYPE' is working with VIVO and 3ivX dll (no more segfaults) -- alex */ |
3465 | 1148 #undef CRITSECS_NEWTYPE |
1149 //#define CRITSECS_NEWTYPE 1 | |
3128 | 1150 |
1151 #ifdef CRITSECS_NEWTYPE | |
2579 | 1152 #define CRITSECS_LIST_MAX 20 |
1153 static struct critsecs_list_t critsecs_list[CRITSECS_LIST_MAX]; | |
1154 | |
3465 | 1155 static int critsecs_get_pos(CRITICAL_SECTION *cs_win) |
2579 | 1156 { |
1157 int i; | |
3128 | 1158 |
2579 | 1159 for (i=0; i < CRITSECS_LIST_MAX; i++) |
1160 if (critsecs_list[i].cs_win == cs_win) | |
1161 return(i); | |
1162 return(-1); | |
1163 } | |
1164 | |
3465 | 1165 static int critsecs_get_unused(void) |
2579 | 1166 { |
1167 int i; | |
3128 | 1168 |
2579 | 1169 for (i=0; i < CRITSECS_LIST_MAX; i++) |
1170 if (critsecs_list[i].cs_win == NULL) | |
1171 return(i); | |
1172 return(-1); | |
1173 } | |
1174 | |
1175 #if 0 | |
1176 #define critsecs_get_unix(cs_win) (critsecs_list[critsecs_get_pos(cs_win)].cs_win) | |
1177 #else | |
1178 struct CRITSECT *critsecs_get_unix(CRITICAL_SECTION *cs_win) | |
1179 { | |
1180 int i; | |
3128 | 1181 |
2579 | 1182 for (i=0; i < CRITSECS_LIST_MAX; i++) |
2670 | 1183 if (critsecs_list[i].cs_win == cs_win && critsecs_list[i].cs_unix) |
2579 | 1184 return(critsecs_list[i].cs_unix); |
1185 return(NULL); | |
1186 } | |
1187 #endif | |
3128 | 1188 #endif |
2579 | 1189 |
3465 | 1190 static void WINAPI expInitializeCriticalSection(CRITICAL_SECTION* c) |
1 | 1191 { |
128 | 1192 dbgprintf("InitializeCriticalSection(0x%x)\n", c); |
3465 | 1193 /* if(sizeof(pthread_mutex_t)>sizeof(CRITICAL_SECTION)) |
1194 { | |
1195 printf(" ERROR:::: sizeof(pthread_mutex_t) is %d, expected <=%d!\n", | |
1196 sizeof(pthread_mutex_t), sizeof(CRITICAL_SECTION)); | |
1197 return; | |
1198 }*/ | |
1199 /* pthread_mutex_init((pthread_mutex_t*)c, NULL); */ | |
2579 | 1200 #ifdef CRITSECS_NEWTYPE |
1201 { | |
3465 | 1202 struct CRITSECT *cs; |
1203 int i = critsecs_get_unused(); | |
1204 | |
1205 if (i < 0) | |
1206 { | |
1207 printf("InitializeCriticalSection(%p) - no more space in list\n", c); | |
1208 return; | |
1209 } | |
1210 printf("got unused space at %d\n", i); | |
1211 cs = expmalloc(sizeof(struct CRITSECT)); | |
1212 if (!cs) | |
1213 { | |
1214 printf("InitializeCriticalSection(%p) - out of memory\n", c); | |
1215 return; | |
1216 } | |
1217 pthread_mutex_init(&cs->mutex, NULL); | |
1218 cs->locked = 0; | |
1219 critsecs_list[i].cs_win = c; | |
1220 critsecs_list[i].cs_unix = cs; | |
1221 dbgprintf("InitializeCriticalSection -> itemno=%d, cs_win=%p, cs_unix=%p\n", | |
1222 i, c, cs); | |
2579 | 1223 } |
3465 | 1224 #else |
2670 | 1225 { |
3465 | 1226 struct CRITSECT* cs = mreq_private(sizeof(struct CRITSECT), 0, AREATYPE_CRITSECT); |
1227 pthread_mutex_init(&cs->mutex, NULL); | |
1228 cs->locked=0; | |
1229 *(void**)c = cs; | |
2670 | 1230 } |
2579 | 1231 #endif |
1 | 1232 return; |
2579 | 1233 } |
1234 | |
3465 | 1235 static void WINAPI expEnterCriticalSection(CRITICAL_SECTION* c) |
1 | 1236 { |
2579 | 1237 #ifdef CRITSECS_NEWTYPE |
1238 struct CRITSECT* cs = critsecs_get_unix(c); | |
1239 #else | |
128 | 1240 struct CRITSECT* cs=*(struct CRITSECT**)c; |
2579 | 1241 #endif |
128 | 1242 dbgprintf("EnterCriticalSection(0x%x)\n",c); |
2069 | 1243 if (!cs) |
1244 { | |
3465 | 1245 printf("entered uninitialized critisec!\n"); |
2069 | 1246 expInitializeCriticalSection(c); |
2579 | 1247 #ifdef CRITSECS_NEWTYPE |
1248 cs=critsecs_get_unix(c); | |
1249 #else | |
2069 | 1250 cs=*(struct CRITSECT**)c; |
2579 | 1251 #endif |
2069 | 1252 printf("Win32 Warning: Accessed uninitialized Critical Section (%p)!\n", c); |
1253 } | |
1 | 1254 if(cs->locked) |
1255 if(cs->id==pthread_self()) | |
1256 return; | |
1257 pthread_mutex_lock(&(cs->mutex)); | |
1258 cs->locked=1; | |
1259 cs->id=pthread_self(); | |
1260 return; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1261 } |
3465 | 1262 static void WINAPI expLeaveCriticalSection(CRITICAL_SECTION* c) |
1 | 1263 { |
2579 | 1264 #ifdef CRITSECS_NEWTYPE |
1265 struct CRITSECT* cs = critsecs_get_unix(c); | |
1266 #else | |
128 | 1267 struct CRITSECT* cs=*(struct CRITSECT**)c; |
2579 | 1268 #endif |
3465 | 1269 // struct CRITSECT* cs=(struct CRITSECT*)c; |
128 | 1270 dbgprintf("LeaveCriticalSection(0x%x)\n",c); |
2069 | 1271 if (!cs) |
1272 { | |
1273 printf("Win32 Warning: Leaving noninitialized Critical Section %p!!\n", c); | |
1274 return; | |
1275 } | |
1 | 1276 cs->locked=0; |
1277 pthread_mutex_unlock(&(cs->mutex)); | |
1278 return; | |
1279 } | |
3465 | 1280 static void WINAPI expDeleteCriticalSection(CRITICAL_SECTION *c) |
1 | 1281 { |
2579 | 1282 #ifdef CRITSECS_NEWTYPE |
1283 struct CRITSECT* cs = critsecs_get_unix(c); | |
1284 #else | |
128 | 1285 struct CRITSECT* cs=*(struct CRITSECT**)c; |
2579 | 1286 #endif |
3465 | 1287 // struct CRITSECT* cs=(struct CRITSECT*)c; |
128 | 1288 dbgprintf("DeleteCriticalSection(0x%x)\n",c); |
3465 | 1289 |
1290 #ifndef GARBAGE | |
128 | 1291 pthread_mutex_destroy(&(cs->mutex)); |
3465 | 1292 // released by GarbageCollector in my_relase otherwise |
1293 #endif | |
1294 my_release(cs); | |
2579 | 1295 #ifdef CRITSECS_NEWTYPE |
1296 { | |
3465 | 1297 int i = critsecs_get_pos(c); |
1298 | |
1299 if (i < 0) | |
1300 { | |
1301 printf("DeleteCriticalSection(%p) error (critsec not found)\n", c); | |
1302 return; | |
1303 } | |
1304 | |
1305 critsecs_list[i].cs_win = NULL; | |
1306 expfree(critsecs_list[i].cs_unix); | |
1307 critsecs_list[i].cs_unix = NULL; | |
1308 dbgprintf("DeleteCriticalSection -> itemno=%d\n", i); | |
2579 | 1309 } |
1310 #endif | |
1 | 1311 return; |
1312 } | |
3465 | 1313 static int WINAPI expGetCurrentThreadId() |
1 | 1314 { |
128 | 1315 dbgprintf("GetCurrentThreadId() => %d\n", getpid()); |
1316 return getpid(); | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1317 } |
3465 | 1318 static int WINAPI expGetCurrentProcess() |
128 | 1319 { |
1320 dbgprintf("GetCurrentProcess() => %d\n", getpid()); | |
1 | 1321 return getpid(); |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1322 } |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1323 |
2779 | 1324 extern void* fs_seg; |
1325 | |
3128 | 1326 #if 0 |
1327 // this version is required for Quicktime codecs (.qtx/.qts) to work. | |
1328 // (they assume some pointers at FS: segment) | |
1329 | |
2779 | 1330 //static int tls_count; |
1331 static int tls_use_map[64]; | |
3465 | 1332 static int WINAPI expTlsAlloc() |
2779 | 1333 { |
1334 int i; | |
1335 for(i=0; i<64; i++) | |
1336 if(tls_use_map[i]==0) | |
1337 { | |
1338 tls_use_map[i]=1; | |
1339 return i; | |
1340 } | |
1341 return -1; | |
1342 } | |
1343 | |
3465 | 1344 static int WINAPI expTlsSetValue(void idx, void* value) |
2779 | 1345 { |
3465 | 1346 int index = (int) idx; |
2779 | 1347 if((index<0) || (index>64)) |
1348 return 0; | |
1349 *(void**)((char*)fs_seg+0x88+4*index) = value; | |
1350 return 1; | |
1351 } | |
1352 | |
3465 | 1353 static void* WINAPI expTlsGetValue(int idx) |
2779 | 1354 { |
3465 | 1355 int index = (int) idx; |
2779 | 1356 if((index<0) || (index>64)) |
1357 return 0; | |
1358 return *(void**)((char*)fs_seg+0x88+index); | |
1359 } | |
1360 | |
3465 | 1361 static int WINAPI expTlsFree(int idx) |
2779 | 1362 { |
3465 | 1363 int index = (int) idx; |
2779 | 1364 if((index<0) || (index>64)) |
1365 return 0; | |
1366 tls_use_map[index]=0; | |
1367 return 1; | |
1368 } | |
1369 | |
1370 #else | |
2069 | 1371 struct tls_s { |
1 | 1372 void* value; |
1373 int used; | |
1374 struct tls_s* prev; | |
1375 struct tls_s* next; | |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1376 }; |
2069 | 1377 |
3465 | 1378 static void* WINAPI expTlsAlloc() |
1 | 1379 { |
1380 if(g_tls==NULL) | |
1381 { | |
1382 g_tls=my_mreq(sizeof(tls_t), 0); | |
1383 g_tls->next=g_tls->prev=NULL; | |
1384 } | |
1385 else | |
1386 { | |
1387 g_tls->next=my_mreq(sizeof(tls_t), 0); | |
1388 g_tls->next->prev=g_tls; | |
1389 g_tls->next->next=NULL; | |
1390 g_tls=g_tls->next; | |
1391 } | |
128 | 1392 dbgprintf("TlsAlloc() => 0x%x\n", g_tls); |
2670 | 1393 if (g_tls) |
1394 g_tls->value=0; /* XXX For Divx.dll */ | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1395 return g_tls; |
1 | 1396 } |
1397 | |
3465 | 1398 static int WINAPI expTlsSetValue(void* idx, void* value) |
1 | 1399 { |
3465 | 1400 tls_t* index = (tls_t*) idx; |
128 | 1401 int result; |
1 | 1402 if(index==0) |
128 | 1403 result=0; |
1404 else | |
1405 { | |
1406 index->value=value; | |
1407 result=1; | |
1408 } | |
1409 dbgprintf("TlsSetValue(index 0x%x, value 0x%x) => %d \n", index, value, result ); | |
1410 return result; | |
1 | 1411 } |
3465 | 1412 static void* WINAPI expTlsGetValue(void* idx) |
1 | 1413 { |
3465 | 1414 tls_t* index = (tls_t*) idx; |
128 | 1415 void* result; |
1 | 1416 if(index==0) |
128 | 1417 result=0; |
1418 else | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1419 result=index->value; |
128 | 1420 dbgprintf("TlsGetValue(index 0x%x) => 0x%x\n", index, result); |
1421 return result; | |
1 | 1422 } |
3465 | 1423 static int WINAPI expTlsFree(void* idx) |
1 | 1424 { |
3465 | 1425 tls_t* index = (tls_t*) idx; |
128 | 1426 int result; |
1 | 1427 if(index==0) |
128 | 1428 result=0; |
1429 else | |
1430 { | |
1431 if(index->next) | |
1432 index->next->prev=index->prev; | |
1433 if(index->prev) | |
3465 | 1434 index->prev->next=index->next; |
128 | 1435 my_release((void*)index); |
1436 result=1; | |
1437 } | |
1438 dbgprintf("TlsFree(index 0x%x) => %d\n", index, result); | |
1439 return result; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1440 } |
2779 | 1441 #endif |
1442 | |
3465 | 1443 static void* WINAPI expLocalAlloc(int flags, int size) |
1 | 1444 { |
3465 | 1445 void* z = my_mreq(size, (flags & GMEM_ZEROINIT)); |
1446 if (z == 0) | |
1 | 1447 printf("LocalAlloc() failed\n"); |
128 | 1448 dbgprintf("LocalAlloc(%d, flags 0x%x) => 0x%x\n", size, flags, z); |
1 | 1449 return z; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1450 } |
2069 | 1451 |
3465 | 1452 static void* WINAPI expLocalReAlloc(int handle,int size, int flags) |
2069 | 1453 { |
3465 | 1454 void *newpointer; |
1455 int oldsize; | |
1456 | |
1457 newpointer=NULL; | |
1458 if (flags & LMEM_MODIFY) { | |
1459 dbgprintf("LocalReAlloc MODIFY\n"); | |
1460 return (void *)handle; | |
1461 } | |
1462 oldsize = my_size((void *)handle); | |
1463 newpointer = my_realloc((void *)handle,size); | |
1464 dbgprintf("LocalReAlloc(%x %d(old %d), flags 0x%x) => 0x%x\n", handle,size,oldsize, flags,newpointer); | |
1465 | |
1466 return newpointer; | |
2069 | 1467 } |
1468 | |
3465 | 1469 static void* WINAPI expLocalLock(void* z) |
1 | 1470 { |
128 | 1471 dbgprintf("LocalLock(0x%x) => 0x%x\n", z, z); |
1 | 1472 return z; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1473 } |
128 | 1474 |
3465 | 1475 static void* WINAPI expGlobalAlloc(int flags, int size) |
1 | 1476 { |
1477 void* z; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1478 dbgprintf("GlobalAlloc(%d, flags 0x%X)\n", size, flags); |
3465 | 1479 |
1480 z=my_mreq(size, (flags & GMEM_ZEROINIT)); | |
1481 //z=calloc(size, 1); | |
1482 //z=malloc(size); | |
1 | 1483 if(z==0) |
128 | 1484 printf("GlobalAlloc() failed\n"); |
1485 dbgprintf("GlobalAlloc(%d, flags 0x%x) => 0x%x\n", size, flags, z); | |
1 | 1486 return z; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1487 } |
3465 | 1488 static void* WINAPI expGlobalLock(void* z) |
1 | 1489 { |
128 | 1490 dbgprintf("GlobalLock(0x%x) => 0x%x\n", z, z); |
1 | 1491 return z; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1492 } |
3128 | 1493 // pvmjpg20 - but doesn't work anyway |
3465 | 1494 static int WINAPI expGlobalSize(void* amem) |
3128 | 1495 { |
1496 int size = 100000; | |
1497 #ifdef GARBAGE | |
1498 alloc_header* header = last_alloc; | |
1499 alloc_header* mem = (alloc_header*) amem - 1; | |
1500 if (amem == 0) | |
3465 | 1501 return 0; |
3128 | 1502 pthread_mutex_lock(&memmut); |
1503 while (header) | |
1504 { | |
3465 | 1505 if (header->deadbeef != 0xdeadbeef) |
1506 { | |
1507 printf("FATAL found corrupted memory! %p 0x%lx (%d)\n", header, header->deadbeef, alccnt); | |
1508 break; | |
1509 } | |
1510 | |
1511 if (header == mem) | |
1512 { | |
1513 size = header->size; | |
1514 break; | |
1515 } | |
1516 | |
1517 header = header->prev; | |
3128 | 1518 } |
1519 pthread_mutex_unlock(&memmut); | |
1520 #endif | |
1521 | |
1522 dbgprintf("GlobalSize(0x%x)\n", amem); | |
1523 return size; | |
1524 } | |
3465 | 1525 static int WINAPI expLoadStringA(long instance, long id, void* buf, long size) |
1 | 1526 { |
128 | 1527 int result=LoadStringA(instance, id, buf, size); |
3465 | 1528 // if(buf) |
128 | 1529 dbgprintf("LoadStringA(instance 0x%x, id 0x%x, buffer 0x%x, size %d) => %d ( %s )\n", |
3465 | 1530 instance, id, buf, size, result, buf); |
1531 // else | |
1532 // dbgprintf("LoadStringA(instance 0x%x, id 0x%x, buffer 0x%x, size %d) => %d\n", | |
1533 // instance, id, buf, size, result); | |
128 | 1534 return result; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1535 } |
1 | 1536 |
3465 | 1537 static long WINAPI expMultiByteToWideChar(long v1, long v2, char* s1, long siz1, short* s2, int siz2) |
1 | 1538 { |
1539 #warning FIXME | |
128 | 1540 int i; |
1541 int result; | |
1 | 1542 if(s2==0) |
3465 | 1543 result=1; |
128 | 1544 else |
1545 { | |
3465 | 1546 if(siz1>siz2/2)siz1=siz2/2; |
1547 for(i=1; i<=siz1; i++) | |
1548 { | |
1549 *s2=*s1; | |
1550 if(!*s1)break; | |
1551 s2++; | |
1552 s1++; | |
1553 } | |
1554 result=i; | |
128 | 1555 } |
1556 if(s1) | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1557 dbgprintf("MultiByteToWideChar(codepage %d, flags 0x%x, string 0x%x='%s'," |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1558 "size %d, dest buffer 0x%x, dest size %d) => %d\n", |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1559 v1, v2, s1, s1, siz1, s2, siz2, result); |
128 | 1560 else |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1561 dbgprintf("MultiByteToWideChar(codepage %d, flags 0x%x, string NULL," |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1562 "size %d, dest buffer 0x%x, dest size %d) =>\n", |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1563 v1, v2, siz1, s2, siz2, result); |
128 | 1564 return result; |
1565 } | |
1566 static void wch_print(const short* str) | |
1567 { | |
1568 dbgprintf(" src: "); | |
1569 while(*str)dbgprintf("%c", *str++); | |
1570 dbgprintf("\n"); | |
1 | 1571 } |
3465 | 1572 static long WINAPI expWideCharToMultiByte(long v1, long v2, short* s1, long siz1, |
1573 char* s2, int siz2, char* c3, int* siz3) | |
1 | 1574 { |
1575 int result; | |
128 | 1576 dbgprintf("WideCharToMultiByte(codepage %d, flags 0x%x, src 0x%x, src size %d, " |
3465 | 1577 "dest 0x%x, dest size %d, defch 0x%x, used_defch 0x%x)", v1, v2, s1, siz1, s2, siz2, c3, siz3); |
1 | 1578 result=WideCharToMultiByte(v1, v2, s1, siz1, s2, siz2, c3, siz3); |
1579 dbgprintf("=> %d\n", result); | |
2069 | 1580 //if(s1)wch_print(s1); |
128 | 1581 if(s2)dbgprintf(" dest: %s\n", s2); |
1 | 1582 return result; |
1583 } | |
3465 | 1584 static long WINAPI expGetVersionExA(OSVERSIONINFOA* c) |
1 | 1585 { |
128 | 1586 dbgprintf("GetVersionExA(0x%x) => 1\n"); |
1587 c->dwOSVersionInfoSize=sizeof(*c); | |
1 | 1588 c->dwMajorVersion=4; |
128 | 1589 c->dwMinorVersion=0; |
1590 c->dwBuildNumber=0x4000457; | |
2069 | 1591 #if 0 |
1592 // leave it here for testing win9x-only codecs | |
1 | 1593 c->dwPlatformId=VER_PLATFORM_WIN32_WINDOWS; |
128 | 1594 strcpy(c->szCSDVersion, " B"); |
2069 | 1595 #else |
1596 c->dwPlatformId=VER_PLATFORM_WIN32_NT; // let's not make DLL assume that it can read CR* registers | |
1597 strcpy(c->szCSDVersion, "Service Pack 3"); | |
1598 #endif | |
128 | 1599 dbgprintf(" Major version: 4\n Minor version: 0\n Build number: 0x4000457\n" |
3465 | 1600 " Platform Id: VER_PLATFORM_WIN32_NT\n Version string: 'Service Pack 3'\n"); |
1 | 1601 return 1; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1602 } |
3465 | 1603 static HANDLE WINAPI expCreateSemaphoreA(char* v1, long init_count, |
1604 long max_count, char* name) | |
1 | 1605 { |
128 | 1606 pthread_mutex_t *pm; |
1607 pthread_cond_t *pc; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1608 mutex_list* pp; |
3465 | 1609 /* |
1610 printf("CreateSemaphoreA(%p = %s)\n", name, (name ? name : "<null>")); | |
1611 pp=mlist; | |
1612 while(pp) | |
1613 { | |
1614 printf("%p => ", pp); | |
1615 pp=pp->prev; | |
1616 } | |
1617 printf("0\n"); | |
1618 */ | |
128 | 1619 if(mlist!=NULL) |
1 | 1620 { |
128 | 1621 mutex_list* pp=mlist; |
1622 if(name!=NULL) | |
3465 | 1623 do |
128 | 1624 { |
1625 if((strcmp(pp->name, name)==0) && (pp->type==1)) | |
1626 { | |
3465 | 1627 dbgprintf("CreateSemaphoreA(0x%x, init_count %d, max_count %d, name 0x%x='%s') => 0x%x\n", |
1628 v1, init_count, max_count, name, name, mlist); | |
128 | 1629 return (HANDLE)mlist; |
1630 } | |
2069 | 1631 }while((pp=pp->prev) != NULL); |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1632 } |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1633 pm=mreq_private(sizeof(pthread_mutex_t), 0, AREATYPE_MUTEX); |
128 | 1634 pthread_mutex_init(pm, NULL); |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1635 pc=mreq_private(sizeof(pthread_cond_t), 0, AREATYPE_COND); |
128 | 1636 pthread_cond_init(pc, NULL); |
1637 if(mlist==NULL) | |
1638 { | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1639 mlist=mreq_private(sizeof(mutex_list), 00, AREATYPE_EVENT); |
128 | 1640 mlist->next=mlist->prev=NULL; |
1641 } | |
1642 else | |
1 | 1643 { |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1644 mlist->next=mreq_private(sizeof(mutex_list), 00, AREATYPE_EVENT); |
128 | 1645 mlist->next->prev=mlist; |
1646 mlist->next->next=NULL; | |
1647 mlist=mlist->next; | |
3465 | 1648 // printf("new semaphore %p\n", mlist); |
1 | 1649 } |
128 | 1650 mlist->type=1; /* Type Semaphore */ |
1651 mlist->pm=pm; | |
1652 mlist->pc=pc; | |
1653 mlist->state=0; | |
1654 mlist->reset=0; | |
1655 mlist->semaphore=init_count; | |
1656 if(name!=NULL) | |
3465 | 1657 strncpy(mlist->name, name, 64); |
128 | 1658 else |
1659 mlist->name[0]=0; | |
1660 if(pm==NULL) | |
1661 dbgprintf("ERROR::: CreateSemaphoreA failure\n"); | |
1662 if(name) | |
3465 | 1663 dbgprintf("CreateSemaphoreA(0x%x, init_count %d, max_count %d, name 0x%x='%s') => 0x%x\n", |
1664 v1, init_count, max_count, name, name, mlist); | |
128 | 1665 else |
3465 | 1666 dbgprintf("CreateSemaphoreA(0x%x, init_count %d, max_count %d, name 0) => 0x%x\n", |
1667 v1, init_count, max_count, mlist); | |
128 | 1668 return (HANDLE)mlist; |
1 | 1669 } |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1670 |
3465 | 1671 static long WINAPI expReleaseSemaphore(long hsem, long increment, long* prev_count) |
1 | 1672 { |
3465 | 1673 // The state of a semaphore object is signaled when its count |
1674 // is greater than zero and nonsignaled when its count is equal to zero | |
1675 // Each time a waiting thread is released because of the semaphore's signaled | |
1676 // state, the count of the semaphore is decreased by one. | |
128 | 1677 mutex_list *ml = (mutex_list *)hsem; |
1 | 1678 |
128 | 1679 pthread_mutex_lock(ml->pm); |
1680 if (prev_count != 0) *prev_count = ml->semaphore; | |
1681 if (ml->semaphore == 0) pthread_cond_signal(ml->pc); | |
1682 ml->semaphore += increment; | |
1683 pthread_mutex_unlock(ml->pm); | |
1684 dbgprintf("ReleaseSemaphore(semaphore 0x%x, increment %d, prev_count 0x%x) => 1\n", | |
3465 | 1685 hsem, increment, prev_count); |
128 | 1686 return 1; |
1 | 1687 } |
1688 | |
1689 | |
3465 | 1690 static long WINAPI expRegOpenKeyExA(long key, const char* subkey, long reserved, long access, int* newkey) |
1 | 1691 { |
128 | 1692 long result=RegOpenKeyExA(key, subkey, reserved, access, newkey); |
1693 dbgprintf("RegOpenKeyExA(key 0x%x, subkey %s, reserved %d, access 0x%x, pnewkey 0x%x) => %d\n", | |
3465 | 1694 key, subkey, reserved, access, newkey, result); |
128 | 1695 if(newkey)dbgprintf(" New key: 0x%x\n", *newkey); |
1696 return result; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1697 } |
3465 | 1698 static long WINAPI expRegCloseKey(long key) |
1 | 1699 { |
128 | 1700 long result=RegCloseKey(key); |
1701 dbgprintf("RegCloseKey(0x%x) => %d\n", key, result); | |
1702 return result; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1703 } |
3465 | 1704 static long WINAPI expRegQueryValueExA(long key, const char* value, int* reserved, int* type, int* data, int* count) |
1 | 1705 { |
128 | 1706 long result=RegQueryValueExA(key, value, reserved, type, data, count); |
1707 dbgprintf("RegQueryValueExA(key 0x%x, value %s, reserved 0x%x, data 0x%x, count 0x%x)" | |
3465 | 1708 " => 0x%x\n", key, value, reserved, data, count, result); |
128 | 1709 if(data && count)dbgprintf(" read %d bytes: '%s'\n", *count, data); |
1710 return result; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1711 } |
3465 | 1712 static long WINAPI expRegCreateKeyExA(long key, const char* name, long reserved, |
1713 void* classs, long options, long security, | |
1714 void* sec_attr, int* newkey, int* status) | |
1 | 1715 { |
128 | 1716 long result=RegCreateKeyExA(key, name, reserved, classs, options, security, sec_attr, newkey, status); |
1717 dbgprintf("RegCreateKeyExA(key 0x%x, name 0x%x='%s', reserved=0x%x," | |
3465 | 1718 " 0x%x, 0x%x, 0x%x, newkey=0x%x, status=0x%x) => %d\n", |
1719 key, name, name, reserved, classs, options, security, sec_attr, newkey, status, result); | |
128 | 1720 if(!result && newkey) dbgprintf(" New key: 0x%x\n", *newkey); |
1721 if(!result && status) dbgprintf(" New key status: 0x%x\n", *status); | |
1722 return result; | |
1 | 1723 } |
3465 | 1724 static long WINAPI expRegSetValueExA(long key, const char* name, long v1, long v2, void* data, long size) |
1 | 1725 { |
128 | 1726 long result=RegSetValueExA(key, name, v1, v2, data, size); |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1727 dbgprintf("RegSetValueExA(key 0x%x, name '%s', 0x%x, 0x%x, data 0x%x -> 0x%x '%s', size=%d) => %d", |
3465 | 1728 key, name, v1, v2, data, *(int*)data, data, size, result); |
128 | 1729 return result; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1730 } |
1 | 1731 |
3465 | 1732 static long WINAPI expRegOpenKeyA (long hKey, LPCSTR lpSubKey, int* phkResult) |
3134 | 1733 { |
128 | 1734 long result=RegOpenKeyExA(hKey, lpSubKey, 0, 0, phkResult); |
1735 dbgprintf("RegOpenKeyExA(key 0x%x, subkey '%s', 0x%x) => %d\n", | |
3465 | 1736 hKey, lpSubKey, phkResult, result); |
128 | 1737 if(!result && phkResult) dbgprintf(" New key: 0x%x\n", *phkResult); |
1738 return result; | |
1 | 1739 } |
1740 | |
3465 | 1741 static DWORD WINAPI expRegEnumValueA(HKEY hkey, DWORD index, LPSTR value, LPDWORD val_count, |
1742 LPDWORD reserved, LPDWORD type, LPBYTE data, LPDWORD count) | |
2069 | 1743 { |
1744 return RegEnumValueA(hkey, index, value, val_count, | |
1745 reserved, type, data, count); | |
1746 } | |
1747 | |
3465 | 1748 static DWORD WINAPI expRegEnumKeyExA(HKEY hKey, DWORD dwIndex, LPSTR lpName, LPDWORD lpcbName, |
1749 LPDWORD lpReserved, LPSTR lpClass, LPDWORD lpcbClass, | |
1750 LPFILETIME lpftLastWriteTime) | |
1751 { | |
1752 return RegEnumKeyExA(hKey, dwIndex, lpName, lpcbName, lpReserved, lpClass, | |
1753 lpcbClass, lpftLastWriteTime); | |
1754 } | |
1755 | |
1756 static long WINAPI expQueryPerformanceCounter(long long* z) | |
1 | 1757 { |
1758 longcount(z); | |
128 | 1759 dbgprintf("QueryPerformanceCounter(0x%x) => 1 ( %Ld )\n", z, *z); |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1760 return 1; |
1 | 1761 } |
1762 | |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1763 /* |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1764 * return CPU clock (in kHz), using linux's /proc filesystem (/proc/cpuinfo) |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1765 */ |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1766 static double linux_cpuinfo_freq() |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1767 { |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1768 double freq=-1; |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1769 FILE *f; |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1770 char line[200]; |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1771 char *s,*value; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1772 |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1773 f = fopen ("/proc/cpuinfo", "r"); |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1774 if (f != NULL) { |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1775 while (fgets(line,sizeof(line),f)!=NULL) { |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1776 /* NOTE: the ':' is the only character we can rely on */ |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1777 if (!(value = strchr(line,':'))) |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1778 continue; |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1779 /* terminate the valuename */ |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1780 *value++ = '\0'; |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1781 /* skip any leading spaces */ |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1782 while (*value==' ') value++; |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1783 if ((s=strchr(value,'\n'))) |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1784 *s='\0'; |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1785 |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1786 if (!strncasecmp(line, "cpu MHz",strlen("cpu MHz")) |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1787 && sscanf(value, "%lf", &freq) == 1) { |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1788 freq*=1000; |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1789 break; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1790 } |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1791 } |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1792 fclose(f); |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1793 } |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1794 return freq; |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1795 } |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1796 |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1797 |
3465 | 1798 static double solaris_kstat_freq() |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1799 { |
1679
73c8f54305b1
Add a few ifdefs, so that the code compiles on old solaris releases (2.6 and 7)
jkeil
parents:
1543
diff
changeset
|
1800 #if defined(HAVE_LIBKSTAT) && defined(KSTAT_DATA_INT32) |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1801 /* |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1802 * try to extract the CPU speed from the solaris kernel's kstat data |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1803 */ |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1804 kstat_ctl_t *kc; |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1805 kstat_t *ksp; |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1806 kstat_named_t *kdata; |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1807 int mhz = 0; |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1808 |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1809 kc = kstat_open(); |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1810 if (kc != NULL) |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1811 { |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1812 ksp = kstat_lookup(kc, "cpu_info", 0, "cpu_info0"); |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1813 |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1814 /* kstat found and name/value pairs? */ |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1815 if (ksp != NULL && ksp->ks_type == KSTAT_TYPE_NAMED) |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1816 { |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1817 /* read the kstat data from the kernel */ |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1818 if (kstat_read(kc, ksp, NULL) != -1) |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1819 { |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1820 /* |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1821 * lookup desired "clock_MHz" entry, check the expected |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1822 * data type |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1823 */ |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1824 kdata = (kstat_named_t *)kstat_data_lookup(ksp, "clock_MHz"); |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1825 if (kdata != NULL && kdata->data_type == KSTAT_DATA_INT32) |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1826 mhz = kdata->value.i32; |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1827 } |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1828 } |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1829 kstat_close(kc); |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1830 } |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1831 |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1832 if (mhz > 0) |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1833 return mhz * 1000.; |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1834 #endif /* HAVE_LIBKSTAT */ |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1835 return -1; // kstat stuff is not available, CPU freq is unknown |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1836 } |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1837 |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1838 /* |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1839 * Measure CPU freq using the pentium's time stamp counter register (TSC) |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1840 */ |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1841 static double tsc_freq() |
1 | 1842 { |
128 | 1843 static double ofreq=0.0; |
1844 int i; | |
1 | 1845 int x,y; |
128 | 1846 i=time(NULL); |
1847 if (ofreq != 0.0) return ofreq; | |
1 | 1848 while(i==time(NULL)); |
1849 x=localcount(); | |
1850 i++; | |
1851 while(i==time(NULL)); | |
1852 y=localcount(); | |
128 | 1853 ofreq = (double)(y-x)/1000.; |
1854 return ofreq; | |
1 | 1855 } |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1856 |
1 | 1857 static double CPU_Freq() |
1858 { | |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1859 double freq; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1860 |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1861 if ((freq = linux_cpuinfo_freq()) > 0) |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1862 return freq; |
1 | 1863 |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1864 if ((freq = solaris_kstat_freq()) > 0) |
1 | 1865 return freq; |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1866 |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1867 return tsc_freq(); |
1 | 1868 } |
1869 | |
3465 | 1870 static long WINAPI expQueryPerformanceFrequency(long long* z) |
1 | 1871 { |
1872 *z=(long long)CPU_Freq(); | |
128 | 1873 dbgprintf("QueryPerformanceFrequency(0x%x) => 1 ( %Ld )\n", z, *z); |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1874 return 1; |
1 | 1875 } |
3465 | 1876 static long WINAPI exptimeGetTime() |
1 | 1877 { |
1878 struct timeval t; | |
128 | 1879 long result; |
1 | 1880 gettimeofday(&t, 0); |
128 | 1881 result=1000*t.tv_sec+t.tv_usec/1000; |
1882 dbgprintf("timeGetTime() => %d\n", result); | |
1883 return result; | |
1 | 1884 } |
3465 | 1885 static void* WINAPI expLocalHandle(void* v) |
1 | 1886 { |
128 | 1887 dbgprintf("LocalHandle(0x%x) => 0x%x\n", v, v); |
1 | 1888 return v; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1889 } |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1890 |
3465 | 1891 static void* WINAPI expGlobalHandle(void* v) |
1 | 1892 { |
128 | 1893 dbgprintf("GlobalHandle(0x%x) => 0x%x\n", v, v); |
1 | 1894 return v; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1895 } |
3465 | 1896 static int WINAPI expGlobalUnlock(void* v) |
1 | 1897 { |
128 | 1898 dbgprintf("GlobalUnlock(0x%x) => 1\n", v); |
1 | 1899 return 1; |
1900 } | |
3465 | 1901 static void* WINAPI expGlobalFree(void* v) |
1 | 1902 { |
128 | 1903 dbgprintf("GlobalFree(0x%x) => 0\n", v); |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1904 my_release(v); |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1905 //free(v); |
1 | 1906 return 0; |
128 | 1907 } |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1908 |
3465 | 1909 static void* WINAPI expGlobalReAlloc(void* v, int size, int flags) |
128 | 1910 { |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1911 void* result=my_realloc(v, size); |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1912 //void* result=realloc(v, size); |
128 | 1913 dbgprintf("GlobalReAlloc(0x%x, size %d, flags 0x%x) => 0x%x\n", v,size,flags,result); |
1914 return result; | |
1915 } | |
1 | 1916 |
3465 | 1917 static int WINAPI expLocalUnlock(void* v) |
1 | 1918 { |
128 | 1919 dbgprintf("LocalUnlock(0x%x) => 1\n", v); |
1 | 1920 return 1; |
1921 } | |
3465 | 1922 // |
1923 static void* WINAPI expLocalFree(void* v) | |
1 | 1924 { |
128 | 1925 dbgprintf("LocalFree(0x%x) => 0\n", v); |
1 | 1926 my_release(v); |
1927 return 0; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1928 } |
3465 | 1929 static HRSRC WINAPI expFindResourceA(HMODULE module, char* name, char* type) |
1 | 1930 { |
3465 | 1931 HRSRC result; |
1932 | |
1933 result=FindResourceA(module, name, type); | |
1934 dbgprintf("FindResourceA(module 0x%x, name 0x%x(%s), type 0x%x(%s)) => 0x%x\n", module, HIWORD(name) ? name : "UNICODE", HIWORD(type) ? type : "UNICODE", result); | |
128 | 1935 return result; |
1 | 1936 } |
3465 | 1937 |
128 | 1938 extern HRSRC WINAPI LoadResource(HMODULE, HRSRC); |
3465 | 1939 static HGLOBAL WINAPI expLoadResource(HMODULE module, HRSRC res) |
1 | 1940 { |
128 | 1941 HGLOBAL result=LoadResource(module, res); |
1942 dbgprintf("LoadResource(module 0x%x, resource 0x%x) => 0x%x\n", module, res, result); | |
1943 return result; | |
1 | 1944 } |
3465 | 1945 static void* WINAPI expLockResource(long res) |
1 | 1946 { |
128 | 1947 void* result=LockResource(res); |
1948 dbgprintf("LockResource(0x%x) => 0x%x\n", res, result); | |
1949 return result; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1950 } |
3465 | 1951 static int WINAPI expFreeResource(long res) |
1 | 1952 { |
128 | 1953 int result=FreeResource(res); |
1954 dbgprintf("FreeResource(0x%x) => %d\n", res, result); | |
1955 return result; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1956 } |
1 | 1957 //bool fun(HANDLE) |
1958 //!0 on success | |
3465 | 1959 static int WINAPI expCloseHandle(long v1) |
1 | 1960 { |
128 | 1961 dbgprintf("CloseHandle(0x%x) => 1\n", v1); |
1 | 1962 return 1; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1963 } |
1 | 1964 |
3465 | 1965 static const char* WINAPI expGetCommandLineA() |
1 | 1966 { |
128 | 1967 dbgprintf("GetCommandLineA() => \"c:\\aviplay.exe\"\n"); |
1 | 1968 return "c:\\aviplay.exe"; |
1969 } | |
128 | 1970 static short envs[]={'p', 'a', 't', 'h', ' ', 'c', ':', '\\', 0, 0}; |
3465 | 1971 static LPWSTR WINAPI expGetEnvironmentStringsW() |
1 | 1972 { |
3465 | 1973 dbgprintf("GetEnvironmentStringsW() => 0\n", envs); |
1974 return 0; | |
1 | 1975 } |
3465 | 1976 static void * WINAPI expRtlZeroMemory(void *p, size_t len) |
121 | 1977 { |
1978 void* result=memset(p,0,len); | |
1979 dbgprintf("RtlZeroMemory(0x%x, len %d) => 0x%x\n",p,len,result); | |
1980 return result; | |
1981 } | |
3465 | 1982 static void * WINAPI expRtlMoveMemory(void *dst, void *src, size_t len) |
121 | 1983 { |
1984 void* result=memmove(dst,src,len); | |
1985 dbgprintf("RtlMoveMemory (dest 0x%x, src 0x%x, len %d) => 0x%x\n",dst,src,len,result); | |
1986 return result; | |
1987 } | |
1988 | |
3465 | 1989 static void * WINAPI expRtlFillMemory(void *p, int ch, size_t len) |
121 | 1990 { |
1991 void* result=memset(p,ch,len); | |
1992 dbgprintf("RtlFillMemory(0x%x, char 0x%x, len %d) => 0x%x\n",p,ch,len,result); | |
1993 return result; | |
1994 } | |
3465 | 1995 static int WINAPI expFreeEnvironmentStringsW(short* strings) |
1 | 1996 { |
128 | 1997 dbgprintf("FreeEnvironmentStringsW(0x%x) => 1\n", strings); |
1 | 1998 return 1; |
1999 } | |
3465 | 2000 static int WINAPI expFreeEnvironmentStringsA(char* strings) |
128 | 2001 { |
3465 | 2002 dbgprintf("FreeEnvironmentStringsA(0x%x) => 1\n", strings); |
2003 return 1; | |
128 | 2004 } |
3465 | 2005 |
128 | 2006 static const char ch_envs[]= |
3465 | 2007 "__MSVCRT_HEAP_SELECT=__GLOBAL_HEAP_SELECTED,1\r\n" |
2008 "PATH=C:\\;C:\\windows\\;C:\\windows\\system\r\n"; | |
2009 static LPCSTR WINAPI expGetEnvironmentStrings() | |
1 | 2010 { |
128 | 2011 dbgprintf("GetEnvironmentStrings() => 0x%x\n", ch_envs); |
2012 return (LPCSTR)ch_envs; | |
3465 | 2013 // dbgprintf("GetEnvironmentStrings() => 0\n"); |
2014 // return 0; | |
1 | 2015 } |
2016 | |
3465 | 2017 static int WINAPI expGetStartupInfoA(STARTUPINFOA *s) |
1 | 2018 { |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2019 int i; |
128 | 2020 dbgprintf("GetStartupInfoA(0x%x) => 1\n"); |
1 | 2021 memset(s, 0, sizeof(*s)); |
2022 s->cb=sizeof(*s); | |
3465 | 2023 // s->lpReserved="Reserved"; |
2024 // s->lpDesktop="Desktop"; | |
2025 // s->lpTitle="Title"; | |
2026 // s->dwX=s->dwY=0; | |
2027 // s->dwXSize=s->dwYSize=200; | |
2028 s->dwFlags=s->wShowWindow=1; | |
2029 // s->hStdInput=s->hStdOutput=s->hStdError=0x1234; | |
128 | 2030 dbgprintf(" cb=%d\n", s->cb); |
2031 dbgprintf(" lpReserved='%s'\n", s->lpReserved); | |
2032 dbgprintf(" lpDesktop='%s'\n", s->lpDesktop); | |
2033 dbgprintf(" lpTitle='%s'\n", s->lpTitle); | |
2034 dbgprintf(" dwX=%d dwY=%d dwXSize=%d dwYSize=%d\n", | |
3465 | 2035 s->dwX, s->dwY, s->dwXSize, s->dwYSize); |
128 | 2036 dbgprintf(" dwXCountChars=%d dwYCountChars=%d dwFillAttribute=%d\n", |
3465 | 2037 s->dwXCountChars, s->dwYCountChars, s->dwFillAttribute); |
128 | 2038 dbgprintf(" dwFlags=0x%x wShowWindow=0x%x cbReserved2=0x%x\n", |
3465 | 2039 s->dwFlags, s->wShowWindow, s->cbReserved2); |
128 | 2040 dbgprintf(" lpReserved2=0x%x hStdInput=0x%x hStdOutput=0x%x hStdError=0x%x\n", |
3465 | 2041 s->lpReserved2, s->hStdInput, s->hStdOutput, s->hStdError); |
1 | 2042 return 1; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2043 } |
1 | 2044 |
3465 | 2045 static int WINAPI expGetStdHandle(int z) |
1 | 2046 { |
3465 | 2047 dbgprintf("GetStdHandle(0x%x) => 0x%x\n", z+0x1234); |
2048 return z+0x1234; | |
1 | 2049 } |
3465 | 2050 static int WINAPI expGetFileType(int handle) |
1 | 2051 { |
3465 | 2052 dbgprintf("GetFileType(0x%x) => 0x3 = pipe\n", handle); |
2053 return 0x3; | |
1 | 2054 } |
3465 | 2055 static int WINAPI expSetHandleCount(int count) |
1 | 2056 { |
128 | 2057 dbgprintf("SetHandleCount(0x%x) => 1\n", count); |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2058 return 1; |
1 | 2059 } |
3465 | 2060 static int WINAPI expGetACP() |
1 | 2061 { |
128 | 2062 dbgprintf("GetACP() => 0\n"); |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2063 return 0; |
1 | 2064 } |
2065 extern WINE_MODREF *MODULE32_LookupHMODULE(HMODULE m); | |
3465 | 2066 static int WINAPI expGetModuleFileNameA(int module, char* s, int len) |
1 | 2067 { |
2068 WINE_MODREF *mr; | |
128 | 2069 int result; |
3465 | 2070 // printf("File name of module %X requested\n", module); |
1 | 2071 if(s==0) |
128 | 2072 result=0; |
2073 else | |
3465 | 2074 if(len<35) |
2075 result=0; | |
128 | 2076 else |
3465 | 2077 { |
2078 result=1; | |
2079 strcpy(s, "c:\\windows\\system\\"); | |
2080 mr=MODULE32_LookupHMODULE(module); | |
2081 if(mr==0)//oops | |
2082 strcat(s, "aviplay.dll"); | |
2083 else | |
2084 if(strrchr(mr->filename, '/')==NULL) | |
2085 strcat(s, mr->filename); | |
2086 else | |
2087 strcat(s, strrchr(mr->filename, '/')+1); | |
2088 } | |
128 | 2089 if(!s) |
3465 | 2090 dbgprintf("GetModuleFileNameA(0x%x, 0x%x, %d) => %d\n", |
2091 module, s, len, result); | |
1 | 2092 else |
3465 | 2093 dbgprintf("GetModuleFileNameA(0x%x, 0x%x, %d) => %d ( '%s' )\n", |
2094 module, s, len, result, s); | |
128 | 2095 return result; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2096 } |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2097 |
3465 | 2098 static int WINAPI expSetUnhandledExceptionFilter(void* filter) |
1 | 2099 { |
128 | 2100 dbgprintf("SetUnhandledExceptionFilter(0x%x) => 1\n", filter); |
1 | 2101 return 1;//unsupported and probably won't ever be supported |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2102 } |
2069 | 2103 |
3465 | 2104 static int WINAPI expLoadLibraryA(char* name) |
1 | 2105 { |
2069 | 2106 int result = 0; |
713 | 2107 char* lastbc; |
2069 | 2108 int i; |
713 | 2109 if (!name) |
2110 return -1; | |
2111 // we skip to the last backslash | |
2112 // this is effectively eliminating weird characters in | |
2113 // the text output windows | |
2069 | 2114 |
713 | 2115 lastbc = strrchr(name, '\\'); |
2116 if (lastbc) | |
2117 { | |
3465 | 2118 int i; |
2119 lastbc++; | |
713 | 2120 for (i = 0; 1 ;i++) |
2121 { | |
2122 name[i] = *lastbc++; | |
2123 if (!name[i]) | |
2124 break; | |
2125 } | |
2126 } | |
2069 | 2127 if(strncmp(name, "c:\\windows\\", 11)==0) name += 11; |
1416 | 2128 if(strncmp(name, ".\\", 2)==0) name += 2; |
2069 | 2129 |
2130 dbgprintf("Entering LoadLibraryA(%s)\n", name); | |
3465 | 2131 |
3440 | 2132 // PIMJ and VIVO audio are loading kernel32.dll |
2133 if (strcasecmp(name, "kernel32.dll") == 0 || strcasecmp(name, "kernel32") == 0) | |
3457 | 2134 // return MODULE_HANDLE_kernel32; |
2135 return ERROR_SUCCESS; /* yeah, we have also the kernel32 calls */ | |
2136 /* exported -> do not return failed! */ | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2137 |
2069 | 2138 result=LoadLibraryA(name); |
2139 dbgprintf("Returned LoadLibraryA(0x%x='%s'), def_path=%s => 0x%x\n", name, name, def_path, result); | |
2140 | |
128 | 2141 return result; |
2069 | 2142 } |
3465 | 2143 static int WINAPI expFreeLibrary(int module) |
1 | 2144 { |
128 | 2145 int result=FreeLibrary(module); |
2146 dbgprintf("FreeLibrary(0x%x) => %d\n", module, result); | |
2147 return result; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2148 } |
3465 | 2149 static void* WINAPI expGetProcAddress(HMODULE mod, char* name) |
1 | 2150 { |
2069 | 2151 void* result; |
2152 if(mod!=MODULE_HANDLE_kernel32) | |
128 | 2153 result=GetProcAddress(mod, name); |
2154 else | |
2155 result=LookupExternalByName("kernel32.dll", name); | |
2156 dbgprintf("GetProcAddress(0x%x, '%s') => 0x%x\n", mod, name, result); | |
2157 return result; | |
2069 | 2158 } |
1 | 2159 |
3465 | 2160 static long WINAPI expCreateFileMappingA(int hFile, void* lpAttr, |
2161 long flProtect, long dwMaxHigh, | |
2162 long dwMaxLow, const char* name) | |
1 | 2163 { |
128 | 2164 long result=CreateFileMappingA(hFile, lpAttr, flProtect, dwMaxHigh, dwMaxLow, name); |
2165 if(!name) | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2166 dbgprintf("CreateFileMappingA(file 0x%x, lpAttr 0x%x," |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2167 "flProtect 0x%x, dwMaxHigh 0x%x, dwMaxLow 0x%x, name 0) => %d\n", |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2168 hFile, lpAttr, flProtect, dwMaxHigh, dwMaxLow, result); |
128 | 2169 else |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2170 dbgprintf("CreateFileMappingA(file 0x%x, lpAttr 0x%x," |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2171 "flProtect 0x%x, dwMaxHigh 0x%x, dwMaxLow 0x%x, name 0x%x='%s') => %d\n", |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2172 hFile, lpAttr, flProtect, dwMaxHigh, dwMaxLow, name, name, result); |
128 | 2173 return result; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2174 } |
1 | 2175 |
3465 | 2176 static long WINAPI expOpenFileMappingA(long hFile, long hz, const char* name) |
1 | 2177 { |
128 | 2178 long result=OpenFileMappingA(hFile, hz, name); |
2179 if(!name) | |
2180 dbgprintf("OpenFileMappingA(0x%x, 0x%x, 0) => %d\n", | |
3465 | 2181 hFile, hz, result); |
128 | 2182 else |
2183 dbgprintf("OpenFileMappingA(0x%x, 0x%x, 0x%x='%s') => %d\n", | |
3465 | 2184 hFile, hz, name, name, result); |
128 | 2185 return result; |
1 | 2186 } |
2187 | |
3465 | 2188 static void* WINAPI expMapViewOfFile(HANDLE file, DWORD mode, DWORD offHigh, |
2189 DWORD offLow, DWORD size) | |
1 | 2190 { |
128 | 2191 dbgprintf("MapViewOfFile(0x%x, 0x%x, 0x%x, 0x%x, size %d) => 0x%x\n", |
3465 | 2192 file,mode,offHigh,offLow,size,(char*)file+offLow); |
1 | 2193 return (char*)file+offLow; |
2194 } | |
2195 | |
3465 | 2196 static void* WINAPI expUnmapViewOfFile(void* view) |
1 | 2197 { |
128 | 2198 dbgprintf("UnmapViewOfFile(0x%x) => 0\n", view); |
1 | 2199 return 0; |
2200 } | |
2201 | |
3465 | 2202 static void* WINAPI expSleep(int time) |
2203 { | |
2204 #if HAVE_NANOSLEEP | |
2205 /* solaris doesn't have thread safe usleep */ | |
2206 struct timespec tsp; | |
2207 tsp.tv_sec = time / 1000000; | |
2208 tsp.tv_nsec = (time % 1000000) * 1000; | |
2209 nanosleep(&tsp, NULL); | |
2210 #else | |
2211 usleep(time); | |
2212 #endif | |
2213 dbgprintf("Sleep(%d) => 0\n", time); | |
2214 return 0; | |
2215 } | |
2216 // why does IV32 codec want to call this? I don't know ... | |
2217 static int WINAPI expCreateCompatibleDC(int hdc) | |
1 | 2218 { |
3465 | 2219 int dc = 0;//0x81; |
2220 //dbgprintf("CreateCompatibleDC(%d) => 0x81\n", hdc); | |
2221 dbgprintf("CreateCompatibleDC(%d) => %d\n", hdc, dc); | |
2222 return dc; | |
2223 } | |
2224 | |
2225 static int WINAPI expGetDeviceCaps(int hdc, int unk) | |
2226 { | |
2227 dbgprintf("GetDeviceCaps(0x%x, %d) => 0\n", hdc, unk); | |
2228 return 0; | |
2229 } | |
2230 | |
2231 static WIN_BOOL WINAPI expDeleteDC(int hdc) | |
2232 { | |
2233 dbgprintf("DeleteDC(0x%x) => 0\n", hdc); | |
2234 if (hdc == 0x81) | |
2235 return 1; | |
1 | 2236 return 0; |
2237 } | |
3465 | 2238 |
2239 static WIN_BOOL WINAPI expDeleteObject(int hdc) | |
1 | 2240 { |
3465 | 2241 dbgprintf("DeleteObject(0x%x) => 1\n", hdc); |
2242 /* FIXME - implement code here */ | |
2243 return 1; | |
1 | 2244 } |
2245 | |
3465 | 2246 /* btvvc32.drv wants this one */ |
2247 static void* WINAPI expGetWindowDC(int hdc) | |
1 | 2248 { |
3465 | 2249 dbgprintf("GetWindowDC(%d) => 0x0\n", hdc); |
3128 | 2250 return 0; |
2251 } | |
2252 | |
3465 | 2253 /* |
2254 * Returns the number of milliseconds, modulo 2^32, since the start | |
2255 * of the wineserver. | |
2256 */ | |
2257 static int WINAPI expGetTickCount(void) | |
1 | 2258 { |
3465 | 2259 static int tcstart = 0; |
2260 struct timeval t; | |
2261 int tc; | |
2262 gettimeofday( &t, NULL ); | |
2263 tc = ((t.tv_sec * 1000) + (t.tv_usec / 1000)) - tcstart; | |
2264 if (tcstart == 0) | |
2265 { | |
2266 tcstart = 0; | |
2267 tc = 0; | |
2268 } | |
2269 dbgprintf("GetTickCount() => %d\n", tc); | |
2270 return tc; | |
1 | 2271 } |
2272 | |
3465 | 2273 static int WINAPI expCreateFontA(void) |
2274 { | |
2275 dbgprintf("CreateFontA() => 0x0\n"); | |
2276 return 1; | |
2277 } | |
2278 | |
2279 /* tried to get pvmjpg work in a different way - no success */ | |
2280 static int WINAPI expDrawTextA(int hDC, char* lpString, int nCount, | |
2281 LPRECT lpRect, unsigned int uFormat) | |
2282 { | |
2283 dbgprintf("expDrawTextA(%p,...) => 8\n", hDC); | |
2284 return 8; | |
2285 } | |
2286 | |
2287 static int WINAPI expGetPrivateProfileIntA(const char* appname, | |
2288 const char* keyname, | |
2289 int default_value, | |
2290 const char* filename) | |
1 | 2291 { |
2292 int size=255; | |
2293 char buffer[256]; | |
2294 char* fullname; | |
2295 int result; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2296 |
1 | 2297 buffer[255]=0; |
128 | 2298 if(!(appname && keyname && filename) ) |
2299 { | |
3465 | 2300 dbgprintf("GetPrivateProfileIntA('%s', '%s', %d, '%s') => %d\n", appname, keyname, default_value, filename, default_value ); |
128 | 2301 return default_value; |
2302 } | |
1 | 2303 fullname=(char*)malloc(50+strlen(appname)+strlen(keyname)+strlen(filename)); |
2304 strcpy(fullname, "Software\\IniFileMapping\\"); | |
2305 strcat(fullname, appname); | |
2306 strcat(fullname, "\\"); | |
2307 strcat(fullname, keyname); | |
2308 strcat(fullname, "\\"); | |
2309 strcat(fullname, filename); | |
2310 result=RegQueryValueExA(HKEY_LOCAL_MACHINE, fullname, NULL, NULL, (int*)buffer, &size); | |
2311 if((size>=0)&&(size<256)) | |
2312 buffer[size]=0; | |
3465 | 2313 // printf("GetPrivateProfileIntA(%s, %s, %s) -> %s\n", appname, keyname, filename, buffer); |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2314 free(fullname); |
1 | 2315 if(result) |
128 | 2316 result=default_value; |
1 | 2317 else |
128 | 2318 result=atoi(buffer); |
2319 dbgprintf("GetPrivateProfileIntA('%s', '%s', %d, '%s') => %d\n", appname, keyname, default_value, filename, result); | |
2320 return result; | |
1 | 2321 } |
3465 | 2322 static int WINAPI expGetProfileIntA(const char* appname, |
2323 const char* keyname, | |
2324 int default_value) | |
128 | 2325 { |
2326 dbgprintf("GetProfileIntA -> "); | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2327 return expGetPrivateProfileIntA(appname, keyname, default_value, "default"); |
128 | 2328 } |
2329 | |
3465 | 2330 static int WINAPI expGetPrivateProfileStringA(const char* appname, |
2331 const char* keyname, | |
2332 const char* def_val, | |
2333 char* dest, unsigned int len, | |
2334 const char* filename) | |
1 | 2335 { |
2336 int result; | |
2337 int size; | |
2338 char* fullname; | |
128 | 2339 dbgprintf("GetPrivateProfileStringA('%s', '%s', def_val '%s', 0x%x, 0x%x, '%s')", appname, keyname, def_val, dest, len, filename ); |
1 | 2340 if(!(appname && keyname && filename) ) return 0; |
2341 fullname=(char*)malloc(50+strlen(appname)+strlen(keyname)+strlen(filename)); | |
2342 strcpy(fullname, "Software\\IniFileMapping\\"); | |
2343 strcat(fullname, appname); | |
2344 strcat(fullname, "\\"); | |
2345 strcat(fullname, keyname); | |
2346 strcat(fullname, "\\"); | |
2347 strcat(fullname, filename); | |
2348 size=len; | |
2349 result=RegQueryValueExA(HKEY_LOCAL_MACHINE, fullname, NULL, NULL, (int*)dest, &size); | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2350 free(fullname); |
128 | 2351 if(result) |
2352 { | |
2353 strncpy(dest, def_val, size); | |
2354 if (strlen(def_val)< size) size = strlen(def_val); | |
2355 } | |
2356 dbgprintf(" => %d ( '%s' )\n", size, dest); | |
1 | 2357 return size; |
2358 } | |
3465 | 2359 static int WINAPI expWritePrivateProfileStringA(const char* appname, |
2360 const char* keyname, | |
2361 const char* string, | |
2362 const char* filename) | |
1 | 2363 { |
2364 int size=256; | |
2365 char* fullname; | |
128 | 2366 dbgprintf("WritePrivateProfileStringA('%s', '%s', '%s', '%s')", appname, keyname, string, filename ); |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2367 if(!(appname && keyname && filename) ) |
128 | 2368 { |
2369 dbgprintf(" => -1\n"); | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2370 return -1; |
128 | 2371 } |
1 | 2372 fullname=(char*)malloc(50+strlen(appname)+strlen(keyname)+strlen(filename)); |
2373 strcpy(fullname, "Software\\IniFileMapping\\"); | |
2374 strcat(fullname, appname); | |
2375 strcat(fullname, "\\"); | |
2376 strcat(fullname, keyname); | |
2377 strcat(fullname, "\\"); | |
2378 strcat(fullname, filename); | |
2379 RegSetValueExA(HKEY_LOCAL_MACHINE, fullname, 0, REG_SZ, (int*)string, strlen(string)); | |
3465 | 2380 // printf("RegSetValueExA(%s,%d)\n", string, strlen(string)); |
2381 // printf("WritePrivateProfileStringA(%s, %s, %s, %s)\n", appname, keyname, string, filename ); | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2382 free(fullname); |
128 | 2383 dbgprintf(" => 0\n"); |
1 | 2384 return 0; |
2385 } | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2386 |
1 | 2387 unsigned int _GetPrivateProfileIntA(const char* appname, const char* keyname, INT default_value, const char* filename) |
2388 { | |
2389 return expGetPrivateProfileIntA(appname, keyname, default_value, filename); | |
2390 } | |
2391 int _GetPrivateProfileStringA(const char* appname, const char* keyname, | |
3465 | 2392 const char* def_val, char* dest, unsigned int len, const char* filename) |
1 | 2393 { |
2394 return expGetPrivateProfileStringA(appname, keyname, def_val, dest, len, filename); | |
2395 } | |
2396 int _WritePrivateProfileStringA(const char* appname, const char* keyname, | |
3465 | 2397 const char* string, const char* filename) |
1 | 2398 { |
2399 return expWritePrivateProfileStringA(appname, keyname, string, filename); | |
2400 } | |
2401 | |
2402 | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2403 |
3465 | 2404 static int WINAPI expDefDriverProc(int _private, int id, int msg, int arg1, int arg2) |
1 | 2405 { |
128 | 2406 dbgprintf("DefDriverProc(0x%x, 0x%x, 0x%x, 0x%x, 0x%x) => 0\n", _private, id, msg, arg1, arg2); |
1 | 2407 return 0; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2408 } |
1 | 2409 |
3465 | 2410 static int WINAPI expSizeofResource(int v1, int v2) |
1 | 2411 { |
128 | 2412 int result=SizeofResource(v1, v2); |
2413 dbgprintf("SizeofResource(0x%x, 0x%x) => %d\n", v1, v2, result); | |
2414 return result; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2415 } |
1 | 2416 |
3465 | 2417 static int WINAPI expGetLastError() |
1 | 2418 { |
128 | 2419 int result=GetLastError(); |
2420 dbgprintf("GetLastError() => 0x%x\n", result); | |
2421 return result; | |
1 | 2422 } |
2423 | |
3465 | 2424 static void WINAPI expSetLastError(int error) |
1 | 2425 { |
128 | 2426 dbgprintf("SetLastError(0x%x)\n", error); |
1 | 2427 SetLastError(error); |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2428 } |
1 | 2429 |
3465 | 2430 static int WINAPI expStringFromGUID2(GUID* guid, char* str, int cbMax) |
128 | 2431 { |
2069 | 2432 int result=snprintf(str, cbMax, "%.8x-%.4x-%.4x-%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x", |
2433 guid->f1, guid->f2, guid->f3, | |
2434 (unsigned char)guid->f4[0], (unsigned char)guid->f4[1], | |
2435 (unsigned char)guid->f4[2], (unsigned char)guid->f4[3], | |
2436 (unsigned char)guid->f4[4], (unsigned char)guid->f4[5], | |
2437 (unsigned char)guid->f4[6], (unsigned char)guid->f4[7]); | |
128 | 2438 dbgprintf("StringFromGUID2(0x%x, 0x%x='%s', %d) => %d\n", guid, str, str, cbMax, result); |
2439 return result; | |
2440 } | |
2441 | |
1 | 2442 |
3465 | 2443 static int WINAPI expGetFileVersionInfoSizeA(const char* name, int* lpHandle) |
1 | 2444 { |
128 | 2445 dbgprintf("GetFileVersionInfoSizeA(0x%x='%s', 0x%X) => 0\n", name, name, lpHandle); |
1 | 2446 return 0; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2447 } |
1 | 2448 |
3465 | 2449 static int WINAPI expIsBadStringPtrW(const short* string, int nchars) |
1 | 2450 { |
128 | 2451 int result; |
2452 if(string==0)result=1; else result=0; | |
2453 dbgprintf("IsBadStringPtrW(0x%x, %d) => %d", string, nchars, result); | |
2454 if(string)wch_print(string); | |
2455 return result; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2456 } |
3465 | 2457 static int WINAPI expIsBadStringPtrA(const char* string, int nchars) |
3128 | 2458 { |
2459 return expIsBadStringPtrW((const short*)string, nchars); | |
2460 } | |
3465 | 2461 static long WINAPI expInterlockedExchangeAdd( long* dest, long incr ) |
1 | 2462 { |
2463 long ret; | |
3465 | 2464 __asm__ __volatile__ |
2465 ( | |
2466 "lock; xaddl %0,(%1)" | |
2467 : "=r" (ret) | |
2468 : "r" (dest), "0" (incr) | |
2469 : "memory" | |
2470 ); | |
1 | 2471 return ret; |
2472 } | |
2473 | |
3465 | 2474 static long WINAPI expInterlockedIncrement( long* dest ) |
1 | 2475 { |
3465 | 2476 long result=expInterlockedExchangeAdd( dest, 1 ) + 1; |
128 | 2477 dbgprintf("InterlockedIncrement(0x%x => %d) => %d\n", dest, *dest, result); |
2478 return result; | |
1 | 2479 } |
3465 | 2480 static long WINAPI expInterlockedDecrement( long* dest ) |
1 | 2481 { |
3465 | 2482 long result=expInterlockedExchangeAdd( dest, -1 ) - 1; |
128 | 2483 dbgprintf("InterlockedDecrement(0x%x => %d) => %d\n", dest, *dest, result); |
2484 return result; | |
1 | 2485 } |
2486 | |
3465 | 2487 static void WINAPI expOutputDebugStringA( const char* string ) |
1 | 2488 { |
128 | 2489 dbgprintf("OutputDebugStringA(0x%x='%s')\n", string); |
1 | 2490 fprintf(stderr, "DEBUG: %s\n", string); |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2491 } |
1 | 2492 |
3465 | 2493 static int WINAPI expGetDC(int hwnd) |
1 | 2494 { |
128 | 2495 dbgprintf("GetDC(0x%x) => 0\n", hwnd); |
1 | 2496 return 0; |
2497 } | |
2498 | |
3465 | 2499 static int WINAPI expReleaseDC(int hwnd, int hdc) |
1 | 2500 { |
128 | 2501 dbgprintf("ReleaseDC(0x%x, 0x%x) => 0\n", hwnd, hdc); |
2502 return 0; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2503 } |
3465 | 2504 |
2505 static int WINAPI expGetDesktopWindow() | |
128 | 2506 { |
3465 | 2507 dbgprintf("GetDesktopWindow() => 0\n"); |
2508 return 0; | |
128 | 2509 } |
3465 | 2510 |
2511 static int cursor[100]; | |
2512 | |
2513 static int WINAPI expLoadCursorA(int handle,LPCSTR name) | |
2514 { | |
2515 dbgprintf("LoadCursorA(%d, 0x%x='%s') => 0x%x\n", handle, name, (int)&cursor[0]); | |
2516 return (int)&cursor[0]; | |
2517 } | |
2518 static int WINAPI expSetCursor(void *cursor) | |
128 | 2519 { |
2520 dbgprintf("SetCursor(0x%x) => 0x%x\n", cursor, cursor); | |
2521 return (int)cursor; | |
2522 } | |
3465 | 2523 static int WINAPI expGetCursorPos(void *cursor) |
2069 | 2524 { |
2525 dbgprintf("GetCursorPos(0x%x) => 0x%x\n", cursor, cursor); | |
2526 return 1; | |
2527 } | |
3465 | 2528 static int WINAPI expRegisterWindowMessageA(char *message) |
2069 | 2529 { |
2530 dbgprintf("RegisterWindowMessageA(%s)\n", message); | |
2531 return 1; | |
2532 } | |
3465 | 2533 static int WINAPI expGetProcessVersion(int pid) |
2069 | 2534 { |
2535 dbgprintf("GetProcessVersion(%d)\n", pid); | |
2536 return 1; | |
2537 } | |
3465 | 2538 static int WINAPI expGetCurrentThread(void) |
2069 | 2539 { |
3457 | 2540 #warning FIXME! |
2541 dbgprintf("GetCurrentThread() => %x\n", 0xcfcf9898); | |
2779 | 2542 return 0xcfcf9898; |
2069 | 2543 } |
3465 | 2544 static int WINAPI expGetOEMCP(void) |
2069 | 2545 { |
2546 dbgprintf("GetOEMCP()\n"); | |
2547 return 1; | |
2548 } | |
3465 | 2549 static int WINAPI expGetCPInfo(int cp,void *info) |
2069 | 2550 { |
2551 dbgprintf("GetCPInfo()\n"); | |
2552 return 0; | |
2553 } | |
3465 | 2554 static int WINAPI expGetSystemMetrics(int index) |
2069 | 2555 { |
2556 dbgprintf("GetSystemMetrics(%d)\n", index); | |
2557 return 1; | |
2558 } | |
3465 | 2559 static int WINAPI expGetSysColor(int index) |
2069 | 2560 { |
2561 dbgprintf("GetSysColor(%d)\n", index); | |
2562 return 1; | |
2563 } | |
3465 | 2564 static int WINAPI expGetSysColorBrush(int index) |
2069 | 2565 { |
2566 dbgprintf("GetSysColorBrush(%d)\n", index); | |
2567 return 1; | |
2568 } | |
2569 | |
2570 | |
2571 | |
3465 | 2572 static int WINAPI expGetSystemPaletteEntries(int hdc, int iStartIndex, int nEntries, void* lppe) |
128 | 2573 { |
2574 dbgprintf("GetSystemPaletteEntries(0x%x, 0x%x, 0x%x, 0x%x) => 0\n", | |
3465 | 2575 hdc, iStartIndex, nEntries, lppe); |
1 | 2576 return 0; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2577 } |
1 | 2578 |
2579 /* | |
3465 | 2580 typedef struct _TIME_ZONE_INFORMATION { |
2581 long Bias; | |
2582 char StandardName[32]; | |
2583 SYSTEMTIME StandardDate; | |
2584 long StandardBias; | |
2585 char DaylightName[32]; | |
2586 SYSTEMTIME DaylightDate; | |
2587 long DaylightBias; | |
2588 } TIME_ZONE_INFORMATION, *LPTIME_ZONE_INFORMATION; | |
2589 */ | |
2590 | |
2591 static int WINAPI expGetTimeZoneInformation(LPTIME_ZONE_INFORMATION lpTimeZoneInformation) | |
1 | 2592 { |
128 | 2593 const short name[]={'C', 'e', 'n', 't', 'r', 'a', 'l', ' ', 'S', 't', 'a', |
2594 'n', 'd', 'a', 'r', 'd', ' ', 'T', 'i', 'm', 'e', 0}; | |
2595 const short pname[]={'C', 'e', 'n', 't', 'r', 'a', 'l', ' ', 'D', 'a', 'y', | |
2596 'l', 'i', 'g', 'h', 't', ' ', 'T', 'i', 'm', 'e', 0}; | |
2597 dbgprintf("GetTimeZoneInformation(0x%x) => TIME_ZONE_ID_STANDARD\n"); | |
1 | 2598 memset(lpTimeZoneInformation, 0, sizeof(TIME_ZONE_INFORMATION)); |
128 | 2599 lpTimeZoneInformation->Bias=360;//GMT-6 |
2600 memcpy(lpTimeZoneInformation->StandardName, name, sizeof(name)); | |
2601 lpTimeZoneInformation->StandardDate.wMonth=10; | |
2602 lpTimeZoneInformation->StandardDate.wDay=5; | |
2603 lpTimeZoneInformation->StandardDate.wHour=2; | |
2604 lpTimeZoneInformation->StandardBias=0; | |
2605 memcpy(lpTimeZoneInformation->DaylightName, pname, sizeof(pname)); | |
2606 lpTimeZoneInformation->DaylightDate.wMonth=4; | |
2607 lpTimeZoneInformation->DaylightDate.wDay=1; | |
2608 lpTimeZoneInformation->DaylightDate.wHour=2; | |
2609 lpTimeZoneInformation->DaylightBias=-60; | |
2610 return TIME_ZONE_ID_STANDARD; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2611 } |
1 | 2612 |
3465 | 2613 static void WINAPI expGetLocalTime(SYSTEMTIME* systime) |
1 | 2614 { |
2615 time_t local_time; | |
2616 struct tm *local_tm; | |
2617 struct timeval tv; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2618 |
128 | 2619 dbgprintf("GetLocalTime(0x%x)\n"); |
1 | 2620 gettimeofday(&tv, NULL); |
2621 local_time=tv.tv_sec; | |
2622 local_tm=localtime(&local_time); | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2623 |
1 | 2624 systime->wYear = local_tm->tm_year + 1900; |
2625 systime->wMonth = local_tm->tm_mon + 1; | |
2626 systime->wDayOfWeek = local_tm->tm_wday; | |
2627 systime->wDay = local_tm->tm_mday; | |
2628 systime->wHour = local_tm->tm_hour; | |
2629 systime->wMinute = local_tm->tm_min; | |
2630 systime->wSecond = local_tm->tm_sec; | |
2631 systime->wMilliseconds = (tv.tv_usec / 1000) % 1000; | |
128 | 2632 dbgprintf(" Year: %d\n Month: %d\n Day of week: %d\n" |
3465 | 2633 " Day: %d\n Hour: %d\n Minute: %d\n Second: %d\n" |
2634 " Milliseconds: %d\n", | |
2635 systime->wYear, systime->wMonth, systime->wDayOfWeek, systime->wDay, | |
2636 systime->wHour, systime->wMinute, systime->wSecond, systime->wMilliseconds); | |
1 | 2637 } |
2638 | |
3465 | 2639 static int WINAPI expGetSystemTime(SYSTEMTIME* systime) |
1 | 2640 { |
2641 time_t local_time; | |
2642 struct tm *local_tm; | |
2643 struct timeval tv; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2644 |
128 | 2645 dbgprintf("GetSystemTime(0x%x)\n", systime); |
1 | 2646 gettimeofday(&tv, NULL); |
2647 local_time=tv.tv_sec; | |
2648 local_tm=gmtime(&local_time); | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2649 |
1 | 2650 systime->wYear = local_tm->tm_year + 1900; |
2651 systime->wMonth = local_tm->tm_mon + 1; | |
2652 systime->wDayOfWeek = local_tm->tm_wday; | |
2653 systime->wDay = local_tm->tm_mday; | |
2654 systime->wHour = local_tm->tm_hour; | |
2655 systime->wMinute = local_tm->tm_min; | |
2656 systime->wSecond = local_tm->tm_sec; | |
2657 systime->wMilliseconds = (tv.tv_usec / 1000) % 1000; | |
128 | 2658 dbgprintf(" Year: %d\n Month: %d\n Day of week: %d\n" |
3465 | 2659 " Day: %d\n Hour: %d\n Minute: %d\n Second: %d\n" |
2660 " Milliseconds: %d\n", | |
2661 systime->wYear, systime->wMonth, systime->wDayOfWeek, systime->wDay, | |
2662 systime->wHour, systime->wMinute, systime->wSecond, systime->wMilliseconds); | |
2069 | 2663 return 0; |
1 | 2664 } |
2665 | |
3465 | 2666 static int WINAPI expGetEnvironmentVariableA(const char* name, char* field, int size) |
1 | 2667 { |
128 | 2668 char *p; |
3465 | 2669 // printf("%s %x %x\n", name, field, size); |
1 | 2670 if(field)field[0]=0; |
3465 | 2671 /* |
2672 p = getenv(name); | |
2673 if (p) strncpy(field,p,size); | |
2674 */ | |
128 | 2675 if (strcmp(name,"__MSVCRT_HEAP_SELECT")==0) |
3465 | 2676 strcpy(field,"__GLOBAL_HEAP_SELECTED,1"); |
128 | 2677 dbgprintf("GetEnvironmentVariableA(0x%x='%s', 0x%x, %d) => %d\n", name, name, field, size, strlen(field)); |
2678 return strlen(field); | |
2679 } | |
2680 | |
3465 | 2681 static void* WINAPI expCoTaskMemAlloc(ULONG cb) |
128 | 2682 { |
2683 return my_mreq(cb, 0); | |
2684 } | |
3465 | 2685 static void WINAPI expCoTaskMemFree(void* cb) |
128 | 2686 { |
2687 my_release(cb); | |
2688 } | |
2689 | |
3465 | 2690 |
2691 | |
2692 | |
3547 | 2693 void* CoTaskMemAlloc(unsigned long cb) |
3465 | 2694 { |
2695 return expCoTaskMemAlloc(cb); | |
2696 } | |
2697 void CoTaskMemFree(void* cb) | |
2698 { | |
2699 expCoTaskMemFree(cb); | |
2700 } | |
128 | 2701 |
2702 struct COM_OBJECT_INFO | |
2703 { | |
2704 GUID clsid; | |
2705 long (*GetClassObject) (GUID* clsid, GUID* iid, void** ppv); | |
2706 }; | |
2707 | |
2708 static struct COM_OBJECT_INFO* com_object_table=0; | |
2709 static int com_object_size=0; | |
2710 int RegisterComClass(GUID* clsid, GETCLASSOBJECT gcs) | |
2711 { | |
2069 | 2712 if(!clsid || !gcs) |
2713 return -1; | |
128 | 2714 com_object_table=realloc(com_object_table, sizeof(struct COM_OBJECT_INFO)*(++com_object_size)); |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2715 com_object_table[com_object_size-1].clsid=*clsid; |
128 | 2716 com_object_table[com_object_size-1].GetClassObject=gcs; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2717 return 0; |
128 | 2718 } |
2719 | |
2069 | 2720 int UnregisterComClass(GUID* clsid, GETCLASSOBJECT gcs) |
2721 { | |
2722 int found = 0; | |
2723 int i = 0; | |
2724 if(!clsid || !gcs) | |
2725 return -1; | |
2726 | |
2727 if (com_object_table == 0) | |
2728 printf("Warning: UnregisterComClass() called without any registered class\n"); | |
2729 while (i < com_object_size) | |
2730 { | |
2731 if (found && i > 0) | |
2732 { | |
2733 memcpy(&com_object_table[i - 1].clsid, | |
2734 &com_object_table[i].clsid, sizeof(GUID)); | |
2735 com_object_table[i - 1].GetClassObject = | |
2736 com_object_table[i].GetClassObject; | |
2737 } | |
2738 else if (memcmp(&com_object_table[i].clsid, clsid, sizeof(GUID)) == 0 | |
2739 && com_object_table[i].GetClassObject == gcs) | |
2740 { | |
3465 | 2741 found++; |
2069 | 2742 } |
2743 i++; | |
2744 } | |
2745 if (found) | |
2746 { | |
2747 if (--com_object_size == 0) | |
2748 { | |
2749 free(com_object_table); | |
3465 | 2750 com_object_table = 0; |
2069 | 2751 } |
2752 } | |
2753 return 0; | |
2754 } | |
2755 | |
2756 | |
3465 | 2757 GUID IID_IUnknown = |
2758 { | |
2759 0x00000000, 0x0000, 0x0000, | |
2760 {0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46} | |
2761 }; | |
2762 GUID IID_IClassFactory = | |
2763 { | |
2764 0x00000001, 0x0000, 0x0000, | |
2765 {0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46} | |
2766 }; | |
2767 | |
2768 static long WINAPI expCoCreateInstance(GUID* rclsid, struct IUnknown* pUnkOuter, | |
2769 long dwClsContext, GUID* riid, void** ppv) | |
128 | 2770 { |
2771 int i; | |
2772 struct COM_OBJECT_INFO* ci=0; | |
2773 for(i=0; i<com_object_size; i++) | |
2774 if(!memcmp(rclsid, &com_object_table[i].clsid, sizeof(GUID))) | |
2775 ci=&com_object_table[i]; | |
3465 | 2776 if(!ci)return REGDB_E_CLASSNOTREG; |
128 | 2777 // in 'real' world we should mess with IClassFactory here |
2778 i=ci->GetClassObject(rclsid, riid, ppv); | |
2779 return i; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2780 } |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2781 |
128 | 2782 long CoCreateInstance(GUID* rclsid, struct IUnknown* pUnkOuter, |
3465 | 2783 long dwClsContext, GUID* riid, void** ppv) |
128 | 2784 { |
2785 return expCoCreateInstance(rclsid, pUnkOuter, dwClsContext, riid, ppv); | |
2786 } | |
2787 | |
3465 | 2788 static int WINAPI expIsRectEmpty(CONST RECT *lprc) |
128 | 2789 { |
3465 | 2790 int r = (!lprc || (lprc->right == lprc->left) || (lprc->top == lprc->bottom)); |
2791 dbgprintf("IsRectEmpty(%p) => %s\n", lprc, (r) ? "TRUE" : "FALSE"); | |
2792 return r; | |
128 | 2793 } |
2794 | |
3465 | 2795 static int _adjust_fdiv=0; //what's this? - used to adjust division |
2796 | |
2797 | |
2798 | |
2799 | |
2800 static unsigned int WINAPI expGetTempPathA(unsigned int len, char* path) | |
128 | 2801 { |
2802 dbgprintf("GetTempPathA(%d, 0x%x)", len, path); | |
2803 if(len<5) | |
2804 { | |
2805 dbgprintf(" => 0\n"); | |
2806 return 0; | |
2807 } | |
2808 strcpy(path, "/tmp"); | |
2809 dbgprintf(" => 5 ( '/tmp' )\n"); | |
2810 return 5; | |
2811 } | |
2812 /* | |
3465 | 2813 FYI: |
2814 typedef struct | |
2815 { | |
2816 DWORD dwFileAttributes; | |
2817 FILETIME ftCreationTime; | |
2818 FILETIME ftLastAccessTime; | |
2819 FILETIME ftLastWriteTime; | |
2820 DWORD nFileSizeHigh; | |
2821 DWORD nFileSizeLow; | |
2822 DWORD dwReserved0; | |
2823 DWORD dwReserved1; | |
2824 CHAR cFileName[260]; | |
2825 CHAR cAlternateFileName[14]; | |
2826 } WIN32_FIND_DATAA, *LPWIN32_FIND_DATAA; | |
2827 */ | |
2828 | |
2829 static HANDLE WINAPI expFindFirstFileA(LPCSTR s, LPWIN32_FIND_DATAA lpfd) | |
128 | 2830 { |
2831 dbgprintf("FindFirstFileA(0x%x='%s', 0x%x) => 0\n", s, s, lpfd); | |
2832 strcpy(lpfd->cFileName, "msms001.vwp"); | |
2833 strcpy(lpfd->cAlternateFileName, "msms001.vwp"); | |
2834 return (HANDLE)0; | |
2835 } | |
3465 | 2836 static WIN_BOOL WINAPI expFindNextFileA(HANDLE h,LPWIN32_FIND_DATAA p) |
128 | 2837 { |
2838 dbgprintf("FindNextFileA(0x%x, 0x%x) => 0\n", h, p); | |
1 | 2839 return 0; |
2840 } | |
3465 | 2841 static WIN_BOOL WINAPI expFindClose(HANDLE h) |
128 | 2842 { |
2843 dbgprintf("FindClose(0x%x) => 0\n", h); | |
2844 return 0; | |
2845 } | |
3465 | 2846 static UINT WINAPI expSetErrorMode(UINT i) |
128 | 2847 { |
2848 dbgprintf("SetErrorMode(%d) => 0\n", i); | |
2849 return 0; | |
2850 } | |
3465 | 2851 static UINT WINAPI expGetWindowsDirectoryA(LPSTR s,UINT c) |
128 | 2852 { |
2853 char windir[]="c:\\windows"; | |
2854 int result; | |
2855 strncpy(s, windir, c); | |
2856 result=1+((c<strlen(windir))?c:strlen(windir)); | |
2857 dbgprintf("GetWindowsDirectoryA(0x%x, %d) => %d\n", s, c, result); | |
2858 return result; | |
2859 } | |
2860 | |
3465 | 2861 static WIN_BOOL WINAPI expDeleteFileA(LPCSTR s) |
128 | 2862 { |
2863 dbgprintf("DeleteFileA(0x%x='%s') => 0\n", s, s); | |
2864 return 0; | |
2865 } | |
3465 | 2866 static WIN_BOOL WINAPI expFileTimeToLocalFileTime(const FILETIME* cpf, LPFILETIME pf) |
128 | 2867 { |
2868 dbgprintf("FileTimeToLocalFileTime(0x%x, 0x%x) => 0\n", cpf, pf); | |
2869 return 0; | |
2870 } | |
2871 | |
3465 | 2872 static UINT WINAPI expGetTempFileNameA(LPCSTR cs1,LPCSTR cs2,UINT i,LPSTR ps) |
128 | 2873 { |
2874 char mask[16]="/tmp/AP_XXXXXX"; | |
2875 int result; | |
2876 dbgprintf("GetTempFileNameA(0x%x='%s', 0x%x='%s', %d, 0x%x)", cs1, cs1, cs2, cs2, i, ps); | |
2877 if(i && i<10) | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2878 { |
128 | 2879 dbgprintf(" => -1\n"); |
2880 return -1; | |
2881 } | |
2882 result=mkstemp(mask); | |
2883 sprintf(ps, "AP%d", result); | |
2884 dbgprintf(" => %d\n", strlen(ps)); | |
2885 return strlen(ps); | |
2886 } | |
2887 // | |
2888 // This func might need proper implementation if we want AngelPotion codec. | |
2889 // They try to open APmpeg4v1.apl with it. | |
2890 // DLL will close opened file with CloseHandle(). | |
2891 // | |
3465 | 2892 static HANDLE WINAPI expCreateFileA(LPCSTR cs1,DWORD i1,DWORD i2, |
2893 LPSECURITY_ATTRIBUTES p1, DWORD i3,DWORD i4,HANDLE i5) | |
128 | 2894 { |
2895 dbgprintf("CreateFileA(0x%x='%s', %d, %d, 0x%x, %d, %d, 0x%x)\n", cs1, cs1, i1, | |
3465 | 2896 i2, p1, i3, i4, i5); |
128 | 2897 if((!cs1) || (strlen(cs1)<2))return -1; |
3128 | 2898 |
2899 if(strncmp(cs1, "AP", 2) == 0) | |
128 | 2900 { |
2901 int result; | |
2902 char* tmp=(char*)malloc(strlen(def_path)+50); | |
2903 strcpy(tmp, def_path); | |
2904 strcat(tmp, "/"); | |
2905 strcat(tmp, "APmpg4v1.apl"); | |
2906 result=open(tmp, O_RDONLY); | |
2907 free(tmp); | |
2908 return result; | |
3128 | 2909 } |
2910 if (strstr(cs1, "vp3")) | |
2911 { | |
2912 int r; | |
2913 int flg = 0; | |
2914 char* tmp=(char*)malloc(20 + strlen(cs1)); | |
2915 strcpy(tmp, "/tmp/"); | |
2916 strcat(tmp, cs1); | |
2917 r = 4; | |
2918 while (tmp[r]) | |
2919 { | |
2920 if (tmp[r] == ':' || tmp[r] == '\\') | |
2921 tmp[r] = '_'; | |
2922 r++; | |
2923 } | |
2924 if (GENERIC_READ & i1) | |
2925 flg |= O_RDONLY; | |
2926 else if (GENERIC_WRITE & i1) | |
2927 { | |
2928 flg |= O_WRONLY; | |
2929 printf("Warning: openning filename %s %d (flags; 0x%x) for write\n", tmp, r, flg); | |
2930 } | |
2931 r=open(tmp, flg); | |
2932 free(tmp); | |
2933 return r; | |
2934 } | |
2935 | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2936 return atoi(cs1+2); |
128 | 2937 } |
2938 static char sysdir[]="."; | |
3465 | 2939 static LPCSTR WINAPI expGetSystemDirectoryA() |
128 | 2940 { |
2941 dbgprintf("GetSystemDirectoryA() => 0x%x='%s'\n", sysdir, sysdir); | |
2942 return sysdir; | |
2943 } | |
3465 | 2944 static WIN_BOOL WINAPI expReadFile(HANDLE h,LPVOID pv,DWORD size,LPDWORD rd,LPOVERLAPPED unused) |
128 | 2945 { |
2946 int result; | |
2947 dbgprintf("ReadFile(%d, 0x%x, %d -> 0x%x)\n", h, pv, size, rd); | |
2948 result=read(h, pv, size); | |
2949 if(rd)*rd=result; | |
2950 if(!result)return 0; | |
2951 return 1; | |
2952 } | |
2953 | |
3465 | 2954 static WIN_BOOL WINAPI expWriteFile(HANDLE h,LPCVOID pv,DWORD size,LPDWORD wr,LPOVERLAPPED unused) |
128 | 2955 { |
2956 int result; | |
2957 dbgprintf("WriteFile(%d, 0x%x, %d -> 0x%x)\n", h, pv, size, wr); | |
2958 if(h==1234)h=1; | |
2959 result=write(h, pv, size); | |
2960 if(wr)*wr=result; | |
2961 if(!result)return 0; | |
2962 return 1; | |
2963 } | |
3465 | 2964 static DWORD WINAPI expSetFilePointer(HANDLE h, LONG val, LPLONG ext, DWORD whence) |
128 | 2965 { |
2966 int wh; | |
2967 dbgprintf("SetFilePointer(%d, %d, 0x%x, %d)\n", h, val, ext, whence); | |
3465 | 2968 //why would DLL want temporary file with >2Gb size? |
128 | 2969 switch(whence) |
2970 { | |
2971 case FILE_BEGIN: | |
2972 wh=SEEK_SET;break; | |
2973 case FILE_END: | |
2974 wh=SEEK_END;break; | |
2975 case FILE_CURRENT: | |
2976 wh=SEEK_CUR;break; | |
2977 default: | |
2978 return -1; | |
2979 } | |
2980 return lseek(h, val, wh); | |
2981 } | |
2982 | |
3465 | 2983 static HDRVR WINAPI expOpenDriverA(LPCSTR szDriverName, LPCSTR szSectionName, |
2984 LPARAM lParam2) | |
128 | 2985 { |
2986 dbgprintf("OpenDriverA(0x%x='%s', 0x%x='%s', 0x%x) => -1\n", szDriverName, szDriverName, szSectionName, szSectionName, lParam2); | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2987 return -1; |
128 | 2988 } |
3465 | 2989 static HDRVR WINAPI expOpenDriver(LPCSTR szDriverName, LPCSTR szSectionName, |
2990 LPARAM lParam2) | |
128 | 2991 { |
2992 dbgprintf("OpenDriver(0x%x='%s', 0x%x='%s', 0x%x) => -1\n", szDriverName, szDriverName, szSectionName, szSectionName, lParam2); | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2993 return -1; |
128 | 2994 } |
1 | 2995 |
2996 | |
3465 | 2997 static WIN_BOOL WINAPI expGetProcessAffinityMask(HANDLE hProcess, |
2998 LPDWORD lpProcessAffinityMask, | |
2999 LPDWORD lpSystemAffinityMask) | |
128 | 3000 { |
3001 dbgprintf("GetProcessAffinityMask(0x%x, 0x%x, 0x%x) => 1\n", | |
3465 | 3002 hProcess, lpProcessAffinityMask, lpSystemAffinityMask); |
128 | 3003 if(lpProcessAffinityMask)*lpProcessAffinityMask=1; |
3004 if(lpSystemAffinityMask)*lpSystemAffinityMask=1; | |
3005 return 1; | |
1 | 3006 } |
3007 | |
3465 | 3008 static int WINAPI expMulDiv(int nNumber, int nNumerator, int nDenominator) |
713 | 3009 { |
3010 static const long long max_int=0x7FFFFFFFLL; | |
3011 static const long long min_int=-0x80000000LL; | |
3012 long long tmp=(long long)nNumber*(long long)nNumerator; | |
3465 | 3013 dbgprintf("expMulDiv %d * %d / %d\n", nNumber, nNumerator, nDenominator); |
713 | 3014 if(!nDenominator)return 1; |
3015 tmp/=nDenominator; | |
3016 if(tmp<min_int) return 1; | |
3017 if(tmp>max_int) return 1; | |
3018 return (int)tmp; | |
3019 } | |
3020 | |
3465 | 3021 static LONG WINAPI explstrcmpiA(const char* str1, const char* str2) |
713 | 3022 { |
3023 LONG result=strcasecmp(str1, str2); | |
3024 dbgprintf("strcmpi(0x%x='%s', 0x%x='%s') => %d\n", str1, str1, str2, str2, result); | |
3025 return result; | |
3026 } | |
3027 | |
3465 | 3028 static LONG WINAPI explstrlenA(const char* str1) |
713 | 3029 { |
3030 LONG result=strlen(str1); | |
3134 | 3031 dbgprintf("strlen(0x%x='%.50s') => %d\n", str1, str1, result); |
713 | 3032 return result; |
3033 } | |
3034 | |
3465 | 3035 static LONG WINAPI explstrcpyA(char* str1, const char* str2) |
713 | 3036 { |
3037 int result= (int) strcpy(str1, str2); | |
3134 | 3038 dbgprintf("strcpy(0x%.50x, 0x%.50x='%.50s') => %d\n", str1, str2, str2, result); |
713 | 3039 return result; |
3040 } | |
3465 | 3041 static LONG WINAPI explstrcpynA(char* str1, const char* str2,int len) |
2069 | 3042 { |
3043 int result; | |
3044 if (strlen(str2)>len) | |
3465 | 3045 result = (int) strncpy(str1, str2,len); |
2069 | 3046 else |
3465 | 3047 result = (int) strcpy(str1,str2); |
2069 | 3048 dbgprintf("strncpy(0x%x, 0x%x='%s' len %d strlen %d) => %x\n", str1, str2, str2,len, strlen(str2),result); |
3049 return result; | |
3050 } | |
3465 | 3051 static LONG WINAPI explstrcatA(char* str1, const char* str2) |
2069 | 3052 { |
3053 int result= (int) strcat(str1, str2); | |
3054 dbgprintf("strcat(0x%x, 0x%x='%s') => %d\n", str1, str2, str2, result); | |
3055 return result; | |
3056 } | |
3057 | |
128 | 3058 |
3465 | 3059 static LONG WINAPI expInterlockedExchange(long *dest, long l) |
497 | 3060 { |
3465 | 3061 long retval = *dest; |
3062 *dest = l; | |
3063 return retval; | |
497 | 3064 } |
3065 | |
3465 | 3066 static void WINAPI expInitCommonControls(void) |
1543 | 3067 { |
2069 | 3068 printf("InitCommonControls called!\n"); |
3069 return; | |
1543 | 3070 } |
3071 | |
3457 | 3072 /* alex: implement this call! needed for 3ivx */ |
3465 | 3073 static HRESULT WINAPI expCoCreateFreeThreadedMarshaler(void *pUnkOuter, void **ppUnkInner) |
2396 | 3074 { |
3075 printf("CoCreateFreeThreadedMarshaler(%p, %p) called!\n", | |
3465 | 3076 pUnkOuter, ppUnkInner); |
3457 | 3077 return ERROR_CALL_NOT_IMPLEMENTED; |
2396 | 3078 } |
3079 | |
2779 | 3080 |
3465 | 3081 static int WINAPI expDuplicateHandle(HANDLE hSourceProcessHandle, // handle to source process |
3082 HANDLE hSourceHandle, // handle to duplicate | |
3083 HANDLE hTargetProcessHandle, // handle to target process | |
3084 HANDLE* lpTargetHandle, // duplicate handle | |
3085 DWORD dwDesiredAccess, // requested access | |
3086 int bInheritHandle, // handle inheritance option | |
3087 DWORD dwOptions // optional actions | |
3088 ) | |
2779 | 3089 { |
3090 dbgprintf("DuplicateHandle(%p, %p, %p, %p, 0x%x, %d, %d) called\n", | |
3465 | 3091 hSourceProcessHandle, hSourceHandle, hTargetProcessHandle, |
3092 lpTargetHandle, dwDesiredAccess, bInheritHandle, dwOptions); | |
2779 | 3093 *lpTargetHandle = hSourceHandle; |
3094 return 1; | |
3095 } | |
3096 | |
3128 | 3097 // required by PIM1 codec (used by win98 PCTV Studio capture sw) |
3465 | 3098 static HRESULT WINAPI expCoInitialize( |
3099 LPVOID lpReserved /* [in] pointer to win32 malloc interface | |
3100 (obsolete, should be NULL) */ | |
3101 ) | |
3033 | 3102 { |
3465 | 3103 /* |
3104 * Just delegate to the newer method. | |
3105 */ | |
3106 return 0; //CoInitializeEx(lpReserved, COINIT_APARTMENTTHREADED); | |
3033 | 3107 } |
3108 | |
3465 | 3109 static DWORD WINAPI expSetThreadAffinityMask |
3441 | 3110 ( |
3111 HANDLE hThread, | |
3112 DWORD dwThreadAffinityMask | |
3113 ){ | |
3114 return 0; | |
3115 }; | |
3033 | 3116 |
3465 | 3117 /* |
3118 * no WINAPI functions - CDECL | |
3119 */ | |
3120 static void* expmalloc(int size) | |
3121 { | |
3122 //printf("malloc"); | |
3123 // return malloc(size); | |
3124 void* result=my_mreq(size,0); | |
3125 dbgprintf("malloc(0x%x) => 0x%x\n", size,result); | |
3126 if(result==0) | |
3127 printf("WARNING: malloc() failed\n"); | |
3128 return result; | |
3129 } | |
3130 static void expfree(void* mem) | |
3131 { | |
3132 // return free(mem); | |
3133 dbgprintf("free(%p)\n", mem); | |
3134 my_release(mem); | |
3135 } | |
3136 static void* expnew(int size) | |
3137 { | |
3138 // printf("NEW:: Call from address %08x\n STACK DUMP:\n", *(-1+(int*)&size)); | |
3139 // printf("%08x %08x %08x %08x\n", | |
3140 // size, *(1+(int*)&size), | |
3141 // *(2+(int*)&size),*(3+(int*)&size)); | |
3142 void* result; | |
3143 assert(size >= 0); | |
3144 | |
3145 result=my_mreq(size,0); | |
3146 dbgprintf("new(%d) => %p\n", size, result); | |
3147 if (result==0) | |
3148 printf("WARNING: new() failed\n"); | |
3149 return result; | |
3150 | |
3151 } | |
3152 static int expdelete(void* memory) | |
3153 { | |
3154 dbgprintf("delete(%p)\n", memory); | |
3155 my_release(memory); | |
3156 return 0; | |
3157 } | |
3158 static int exp_initterm(int v1, int v2) | |
3159 { | |
3160 dbgprintf("_initterm(0x%x, 0x%x) => 0\n", v1, v2); | |
3161 return 0; | |
3162 } | |
3163 | |
3164 static int expwsprintfA(char* string, char* format, ...) | |
3165 { | |
3166 va_list va; | |
3167 int result; | |
3168 va_start(va, format); | |
3169 result = vsprintf(string, format, va); | |
3170 dbgprintf("wsprintfA(0x%x, '%s', ...) => %d\n", string, format, result); | |
3171 va_end(va); | |
3172 return result; | |
3173 } | |
3174 | |
3175 static int expsprintf(char* str, const char* format, ...) | |
3176 { | |
3177 va_list args; | |
3178 int r; | |
3179 dbgprintf("sprintf(%s, %s)\n", str, format); | |
3180 va_start(args, format); | |
3181 r = vsprintf(str, format, args); | |
3182 va_end(args); | |
3183 return r; | |
3184 } | |
3185 static int expsscanf(const char* str, const char* format, ...) | |
3186 { | |
3187 va_list args; | |
3188 int r; | |
3189 dbgprintf("sscanf(%s, %s)\n", str, format); | |
3190 va_start(args, format); | |
3191 r = vsscanf(str, format, args); | |
3192 va_end(args); | |
3193 return r; | |
3194 } | |
3195 static void* expfopen(const char* path, const char* mode) | |
3196 { | |
3197 printf("fopen: \"%s\" mode:%s\n", path, mode); | |
3198 //return fopen(path, mode); | |
3199 return fdopen(0, mode); // everything on screen | |
3200 } | |
3201 static int expfprintf(void* stream, const char* format, ...) | |
3202 { | |
3203 va_list args; | |
3204 int r = 0; | |
3205 dbgprintf("fprintf(%p, %s, ...)\n", stream, format); | |
3206 #if 1 | |
3207 va_start(args, format); | |
3208 r = vfprintf((FILE*) stream, format, args); | |
3209 va_end(args); | |
3210 #endif | |
3211 return r; | |
3212 } | |
3213 | |
3214 static int expprintf(const char* format, ...) | |
3215 { | |
3216 va_list args; | |
3217 int r; | |
3218 dbgprintf("printf(%s, ...)\n", format); | |
3219 va_start(args, format); | |
3220 r = vprintf(format, args); | |
3221 va_end(args); | |
3222 return r; | |
3223 } | |
3224 | |
3225 static char* expgetenv(const char* varname) | |
3226 { | |
3227 char* v = getenv(varname); | |
3228 dbgprintf("getenv(%s) => %s\n", varname, v); | |
3229 return v; | |
3230 } | |
3231 | |
3232 static void* expwcscpy(WCHAR* dst, const WCHAR* src) | |
3233 { | |
3234 WCHAR* p = dst; | |
3235 while ((*p++ = *src++)) | |
3236 ; | |
3237 return dst; | |
3238 } | |
3239 | |
3240 static char* expstrrchr(char* string, int value) | |
3241 { | |
3242 char* result=strrchr(string, value); | |
3243 if(result) | |
3244 dbgprintf("strrchr(0x%x='%s', %d) => 0x%x='%s'", string, string, value, result, result); | |
3245 else | |
3246 dbgprintf("strrchr(0x%x='%s', %d) => 0", string, string, value); | |
3247 return result; | |
3248 } | |
3249 | |
3250 static char* expstrchr(char* string, int value) | |
3251 { | |
3252 char* result=strchr(string, value); | |
3253 if(result) | |
3254 dbgprintf("strchr(0x%x='%s', %d) => 0x%x='%s'", string, string, value, result, result); | |
3255 else | |
3256 dbgprintf("strchr(0x%x='%s', %d) => 0", string, string, value); | |
3257 return result; | |
3258 } | |
3259 static int expstrlen(char* str) | |
3260 { | |
3261 int result=strlen(str); | |
3262 dbgprintf("strlen(0x%x='%s') => %d\n", str, str, result); | |
3263 return result; | |
3264 } | |
3265 static char* expstrcpy(char* str1, const char* str2) | |
3266 { | |
3267 char* result= strcpy(str1, str2); | |
3268 dbgprintf("strcpy(0x%x, 0x%x='%s') => %p\n", str1, str2, str2, result); | |
3269 return result; | |
3270 } | |
3271 static int expstrcmp(const char* str1, const char* str2) | |
3272 { | |
3273 int result=strcmp(str1, str2); | |
3274 dbgprintf("strcmp(0x%x='%s', 0x%x='%s') => %d\n", str1, str1, str2, str2, result); | |
3275 return result; | |
3276 } | |
3277 static int expstrncmp(const char* str1, const char* str2,int x) | |
3278 { | |
3279 int result=strncmp(str1, str2,x); | |
3280 dbgprintf("strcmp(0x%x='%s', 0x%x='%s') => %d\n", str1, str1, str2, str2, result); | |
3281 return result; | |
3282 } | |
3283 static char* expstrcat(char* str1, const char* str2) | |
3284 { | |
3285 char* result = strcat(str1, str2); | |
3286 dbgprintf("strcat(0x%x='%s', 0x%x='%s') => %p\n", str1, str1, str2, str2, result); | |
3287 return result; | |
3288 } | |
3289 static char* exp_strdup(const char* str1) | |
3290 { | |
3291 int l = strlen(str1); | |
3292 char* result = my_mreq(l + 1,0); | |
3293 if (result) | |
3294 strcpy(result, str1); | |
3295 dbgprintf("_strdup(0x%x='%s') => %p\n", str1, str1, result); | |
3296 return result; | |
3297 } | |
3298 static int expisalnum(int c) | |
3299 { | |
3300 int result= (int) isalnum(c); | |
3301 dbgprintf("isalnum(0x%x='%c' => %d\n", c, c, result); | |
3302 return result; | |
3303 } | |
3672
1d48df12001b
fixes for vdub plugin support - by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
3547
diff
changeset
|
3304 static int expisspace(int c) |
1d48df12001b
fixes for vdub plugin support - by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
3547
diff
changeset
|
3305 { |
1d48df12001b
fixes for vdub plugin support - by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
3547
diff
changeset
|
3306 int result= (int) isspace(c); |
1d48df12001b
fixes for vdub plugin support - by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
3547
diff
changeset
|
3307 dbgprintf("isspace(0x%x='%c' => %d\n", c, c, result); |
1d48df12001b
fixes for vdub plugin support - by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
3547
diff
changeset
|
3308 return result; |
1d48df12001b
fixes for vdub plugin support - by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
3547
diff
changeset
|
3309 } |
1d48df12001b
fixes for vdub plugin support - by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
3547
diff
changeset
|
3310 static int expisalpha(int c) |
1d48df12001b
fixes for vdub plugin support - by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
3547
diff
changeset
|
3311 { |
1d48df12001b
fixes for vdub plugin support - by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
3547
diff
changeset
|
3312 int result= (int) isalpha(c); |
1d48df12001b
fixes for vdub plugin support - by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
3547
diff
changeset
|
3313 dbgprintf("isalpha(0x%x='%c' => %d\n", c, c, result); |
1d48df12001b
fixes for vdub plugin support - by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
3547
diff
changeset
|
3314 return result; |
1d48df12001b
fixes for vdub plugin support - by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
3547
diff
changeset
|
3315 } |
1d48df12001b
fixes for vdub plugin support - by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
3547
diff
changeset
|
3316 static int expisdigit(int c) |
1d48df12001b
fixes for vdub plugin support - by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
3547
diff
changeset
|
3317 { |
1d48df12001b
fixes for vdub plugin support - by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
3547
diff
changeset
|
3318 int result= (int) isdigit(c); |
1d48df12001b
fixes for vdub plugin support - by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
3547
diff
changeset
|
3319 dbgprintf("isdigit(0x%x='%c' => %d\n", c, c, result); |
1d48df12001b
fixes for vdub plugin support - by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
3547
diff
changeset
|
3320 return result; |
1d48df12001b
fixes for vdub plugin support - by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
3547
diff
changeset
|
3321 } |
3465 | 3322 static void* expmemmove(void* dest, void* src, int n) |
3323 { | |
3324 void* result = memmove(dest, src, n); | |
3325 dbgprintf("memmove(0x%x, 0x%x, %d) => %p\n", dest, src, n, result); | |
3326 return result; | |
3327 } | |
3328 static int expmemcmp(void* dest, void* src, int n) | |
3329 { | |
3330 int result = memcmp(dest, src, n); | |
3331 dbgprintf("memcmp(0x%x, 0x%x, %d) => %d\n", dest, src, n, result); | |
3332 return result; | |
3333 } | |
3334 static void* expmemcpy(void* dest, void* src, int n) | |
3335 { | |
3336 void *result = memcpy(dest, src, n); | |
3337 dbgprintf("memcpy(0x%x, 0x%x, %d) => %p\n", dest, src, n, result); | |
3338 return result; | |
3339 } | |
3672
1d48df12001b
fixes for vdub plugin support - by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
3547
diff
changeset
|
3340 static void* expmemset(void* dest, int c, size_t n) |
1d48df12001b
fixes for vdub plugin support - by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
3547
diff
changeset
|
3341 { |
1d48df12001b
fixes for vdub plugin support - by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
3547
diff
changeset
|
3342 void *result = memset(dest, c, n); |
1d48df12001b
fixes for vdub plugin support - by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
3547
diff
changeset
|
3343 dbgprintf("memset(0x%x, %d, %d) => %p\n", dest, c, n, result); |
1d48df12001b
fixes for vdub plugin support - by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
3547
diff
changeset
|
3344 return result; |
1d48df12001b
fixes for vdub plugin support - by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
3547
diff
changeset
|
3345 } |
3465 | 3346 static time_t exptime(time_t* t) |
3347 { | |
3348 time_t result = time(t); | |
3349 dbgprintf("time(0x%x) => %d\n", t, result); | |
3350 return result; | |
3351 } | |
3352 | |
3353 static int exprand(void) | |
3354 { | |
3355 return rand(); | |
3356 } | |
3357 | |
3358 static void expsrand(int seed) | |
3359 { | |
3360 srand(seed); | |
3361 } | |
3362 | |
3363 #if 1 | |
3364 | |
3365 // prefered compilation with -O2 -ffast-math ! | |
3366 | |
3367 static double explog10(double x) | |
3368 { | |
3369 /*printf("Log10 %f => %f 0x%Lx\n", x, log10(x), *((int64_t*)&x));*/ | |
3370 return log10(x); | |
3371 } | |
3372 | |
3373 static double expcos(double x) | |
3374 { | |
3375 /*printf("Cos %f => %f 0x%Lx\n", x, cos(x), *((int64_t*)&x));*/ | |
3376 return cos(x); | |
3377 } | |
3378 | |
3379 /* doens't work */ | |
3380 static long exp_ftol_wrong(double x) | |
3381 { | |
3382 return (long) x; | |
3383 } | |
3384 | |
3385 #else | |
3386 | |
3387 static void explog10(void) | |
3388 { | |
3389 __asm__ __volatile__ | |
3390 ( | |
3391 "fldl 8(%esp) \n\t" | |
3392 "fldln2 \n\t" | |
3393 "fxch %st(1) \n\t" | |
3394 "fyl2x \n\t" | |
3395 ); | |
3396 } | |
3397 | |
3398 static void expcos(void) | |
3399 { | |
3400 __asm__ __volatile__ | |
3401 ( | |
3402 "fldl 8(%esp) \n\t" | |
3403 "fcos \n\t" | |
3404 ); | |
3405 } | |
3406 | |
3407 #endif | |
3408 | |
3409 // this seem to be the only how to make this function working properly | |
3410 // ok - I've spent tremendous amount of time (many many many hours | |
3411 // of debuging fixing & testing - it's almost unimaginable - kabi | |
3412 | |
3413 // _ftol - operated on the float value which is already on the FPU stack | |
3923
3fd9b781a9d2
workaround for the guilty code that caused sig11 when compiled with gcc-3.0.x
pl
parents:
3672
diff
changeset
|
3414 |
3465 | 3415 static void exp_ftol(void) |
3416 { | |
3417 __asm__ __volatile__ | |
3418 ( | |
3419 "sub $12, %esp \n\t" | |
3420 "fstcw -2(%ebp) \n\t" | |
3421 "wait \n\t" | |
3925 | 3422 "movw -2(%ebp), %ax \n\t" |
3423 "orb $0x0C, %ah \n\t" | |
3424 "movw %ax, -4(%ebp) \n\t" | |
3465 | 3425 "fldcw -4(%ebp) \n\t" |
3426 "fistpl -12(%ebp) \n\t" | |
3427 "fldcw -2(%ebp) \n\t" | |
3925 | 3428 "movl -12(%ebp), %eax \n\t" |
3429 //Note: gcc 3.03 does not do the following op if it | |
3430 // knows that ebp=esp | |
3431 "movl %ebp, %esp \n\t" | |
3465 | 3432 ); |
3433 } | |
3434 | |
3435 static double exppow(double x, double y) | |
3436 { | |
3437 /*printf("Pow %f %f 0x%Lx 0x%Lx => %f\n", x, y, *((int64_t*)&x), *((int64_t*)&y), pow(x, y));*/ | |
3438 return pow(x, y); | |
3439 } | |
3440 | |
3441 | |
3442 | |
3443 static int exp_stricmp(const char* s1, const char* s2) | |
3444 { | |
3445 return strcasecmp(s1, s2); | |
3446 } | |
3447 | |
3448 /* from declaration taken from Wine sources - this fountion seems to be | |
3449 * undocumented in any M$ doc */ | |
3450 static int exp_setjmp3(void* jmpbuf, int x) | |
3451 { | |
3452 //dbgprintf("!!!!UNIMPLEMENTED: setjmp3(%p, %d) => 0\n", jmpbuf, x); | |
3453 //return 0; | |
3454 __asm__ __volatile__ | |
3455 ( | |
3456 //"mov 4(%%esp), %%edx \n\t" | |
3457 "mov (%%esp), %%eax \n\t" | |
3458 "mov %%eax, (%%edx) \n\t" // store ebp | |
3459 | |
3460 //"mov %%ebp, (%%edx) \n\t" | |
3461 "mov %%ebx, 4(%%edx) \n\t" | |
3462 "mov %%edi, 8(%%edx) \n\t" | |
3463 "mov %%esi, 12(%%edx) \n\t" | |
3464 "mov %%esp, 16(%%edx) \n\t" | |
3465 | |
3466 "mov 4(%%esp), %%eax \n\t" | |
3467 "mov %%eax, 20(%%edx) \n\t" | |
3468 | |
3469 "movl $0x56433230, 32(%%edx) \n\t" // VC20 ?? | |
3470 "movl $0, 36(%%edx) \n\t" | |
3471 : // output | |
3472 : "d"(jmpbuf) // input | |
3473 ); | |
3474 #if 1 | |
3475 __asm__ __volatile__ | |
3476 ( | |
3477 "mov %%fs:0, %%eax \n\t" // unsure | |
3478 "mov %%eax, 24(%%edx) \n\t" | |
3479 "cmp $0xffffffff, %%eax \n\t" | |
3480 "jnz l1 \n\t" | |
3481 "mov %%eax, 28(%%edx) \n\t" | |
3482 "l1: \n\t" | |
3483 : | |
3484 : | |
3485 ); | |
3486 #endif | |
3487 | |
3488 return 0; | |
3489 } | |
3490 | |
3491 | |
2779 | 3492 |
1 | 3493 struct exports |
3494 { | |
3495 char name[64]; | |
3496 int id; | |
3497 void* func; | |
3498 }; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
3499 struct libs |
1 | 3500 { |
3501 char name[64]; | |
3502 int length; | |
3503 struct exports* exps; | |
3504 }; | |
3505 | |
3506 #define FF(X,Y) \ | |
3465 | 3507 {#X, Y, (void*)exp##X}, |
3508 | |
3509 struct exports exp_kernel32[]= | |
3510 { | |
3511 FF(IsBadWritePtr, 357) | |
3512 FF(IsBadReadPtr, 354) | |
3513 FF(IsBadStringPtrW, -1) | |
3514 FF(IsBadStringPtrA, -1) | |
3515 FF(DisableThreadLibraryCalls, -1) | |
3516 FF(CreateThread, -1) | |
3517 FF(CreateEventA, -1) | |
3518 FF(SetEvent, -1) | |
3519 FF(ResetEvent, -1) | |
3520 FF(WaitForSingleObject, -1) | |
3521 FF(GetSystemInfo, -1) | |
3522 FF(GetVersion, 332) | |
3523 FF(HeapCreate, 461) | |
3524 FF(HeapAlloc, -1) | |
3525 FF(HeapDestroy, -1) | |
3526 FF(HeapFree, -1) | |
3527 FF(HeapSize, -1) | |
3528 FF(HeapReAlloc,-1) | |
3529 FF(GetProcessHeap, -1) | |
3530 FF(VirtualAlloc, -1) | |
3531 FF(VirtualFree, -1) | |
3532 FF(InitializeCriticalSection, -1) | |
3533 FF(EnterCriticalSection, -1) | |
3534 FF(LeaveCriticalSection, -1) | |
3535 FF(DeleteCriticalSection, -1) | |
3536 FF(TlsAlloc, -1) | |
3537 FF(TlsFree, -1) | |
3538 FF(TlsGetValue, -1) | |
3539 FF(TlsSetValue, -1) | |
3540 FF(GetCurrentThreadId, -1) | |
3541 FF(GetCurrentProcess, -1) | |
3542 FF(LocalAlloc, -1) | |
3543 FF(LocalReAlloc,-1) | |
3544 FF(LocalLock, -1) | |
3545 FF(GlobalAlloc, -1) | |
3546 FF(GlobalReAlloc, -1) | |
3547 FF(GlobalLock, -1) | |
3548 FF(GlobalSize, -1) | |
3549 FF(MultiByteToWideChar, 427) | |
3550 FF(WideCharToMultiByte, -1) | |
3551 FF(GetVersionExA, -1) | |
3552 FF(CreateSemaphoreA, -1) | |
3553 FF(QueryPerformanceCounter, -1) | |
3554 FF(QueryPerformanceFrequency, -1) | |
3555 FF(LocalHandle, -1) | |
3556 FF(LocalUnlock, -1) | |
3557 FF(LocalFree, -1) | |
3558 FF(GlobalHandle, -1) | |
3559 FF(GlobalUnlock, -1) | |
3560 FF(GlobalFree, -1) | |
3561 FF(LoadResource, -1) | |
3562 FF(ReleaseSemaphore, -1) | |
3563 FF(FindResourceA, -1) | |
3564 FF(LockResource, -1) | |
3565 FF(FreeResource, -1) | |
3566 FF(SizeofResource, -1) | |
3567 FF(CloseHandle, -1) | |
3568 FF(GetCommandLineA, -1) | |
3569 FF(GetEnvironmentStringsW, -1) | |
3570 FF(FreeEnvironmentStringsW, -1) | |
3571 FF(FreeEnvironmentStringsA, -1) | |
3572 FF(GetEnvironmentStrings, -1) | |
3573 FF(GetStartupInfoA, -1) | |
3574 FF(GetStdHandle, -1) | |
3575 FF(GetFileType, -1) | |
3576 FF(SetHandleCount, -1) | |
3577 FF(GetACP, -1) | |
3578 FF(GetModuleFileNameA, -1) | |
3579 FF(SetUnhandledExceptionFilter, -1) | |
3580 FF(LoadLibraryA, -1) | |
3581 FF(GetProcAddress, -1) | |
3582 FF(FreeLibrary, -1) | |
3583 FF(CreateFileMappingA, -1) | |
3584 FF(OpenFileMappingA, -1) | |
3585 FF(MapViewOfFile, -1) | |
3586 FF(UnmapViewOfFile, -1) | |
3587 FF(Sleep, -1) | |
3588 FF(GetModuleHandleA, -1) | |
3589 FF(GetProfileIntA, -1) | |
3590 FF(GetPrivateProfileIntA, -1) | |
3591 FF(GetPrivateProfileStringA, -1) | |
3592 FF(WritePrivateProfileStringA, -1) | |
3593 FF(GetLastError, -1) | |
3594 FF(SetLastError, -1) | |
3595 FF(InterlockedIncrement, -1) | |
3596 FF(InterlockedDecrement, -1) | |
3597 FF(GetTimeZoneInformation, -1) | |
3598 FF(OutputDebugStringA, -1) | |
3599 FF(GetLocalTime, -1) | |
3600 FF(GetSystemTime, -1) | |
3601 FF(GetEnvironmentVariableA, -1) | |
3602 FF(RtlZeroMemory,-1) | |
3603 FF(RtlMoveMemory,-1) | |
3604 FF(RtlFillMemory,-1) | |
3605 FF(GetTempPathA,-1) | |
3606 FF(FindFirstFileA,-1) | |
3607 FF(FindNextFileA,-1) | |
3608 FF(FindClose,-1) | |
3609 FF(FileTimeToLocalFileTime,-1) | |
3610 FF(DeleteFileA,-1) | |
3611 FF(ReadFile,-1) | |
3612 FF(WriteFile,-1) | |
3613 FF(SetFilePointer,-1) | |
3614 FF(GetTempFileNameA,-1) | |
3615 FF(CreateFileA,-1) | |
3616 FF(GetSystemDirectoryA,-1) | |
3617 FF(GetWindowsDirectoryA,-1) | |
3618 FF(SetErrorMode, -1) | |
3619 FF(IsProcessorFeaturePresent, -1) | |
3620 FF(GetProcessAffinityMask, -1) | |
3621 FF(InterlockedExchange, -1) | |
3622 FF(MulDiv, -1) | |
3623 FF(lstrcmpiA, -1) | |
3624 FF(lstrlenA, -1) | |
3625 FF(lstrcpyA, -1) | |
3626 FF(lstrcatA, -1) | |
3627 FF(lstrcpynA,-1) | |
3628 FF(GetProcessVersion,-1) | |
3629 FF(GetCurrentThread,-1) | |
3630 FF(GetOEMCP,-1) | |
3631 FF(GetCPInfo,-1) | |
3632 FF(DuplicateHandle,-1) | |
3633 FF(GetTickCount, -1) | |
3634 FF(SetThreadAffinityMask,-1) | |
1 | 3635 }; |
3636 | |
3637 struct exports exp_msvcrt[]={ | |
3465 | 3638 FF(malloc, -1) |
3639 FF(_initterm, -1) | |
3640 FF(free, -1) | |
3641 {"??3@YAXPAX@Z", -1, expdelete}, | |
3642 {"??2@YAPAXI@Z", -1, expnew}, | |
3643 {"_adjust_fdiv", -1, (void*)&_adjust_fdiv}, | |
3644 FF(strrchr, -1) | |
3645 FF(strchr, -1) | |
3646 FF(strlen, -1) | |
3647 FF(strcpy, -1) | |
3648 FF(wcscpy, -1) | |
3649 FF(strcmp, -1) | |
3650 FF(strncmp, -1) | |
3651 FF(strcat, -1) | |
3652 FF(_stricmp,-1) | |
3653 FF(_strdup,-1) | |
3654 FF(_setjmp3,-1) | |
3655 FF(isalnum, -1) | |
3672
1d48df12001b
fixes for vdub plugin support - by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
3547
diff
changeset
|
3656 FF(isspace, -1) |
1d48df12001b
fixes for vdub plugin support - by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
3547
diff
changeset
|
3657 FF(isalpha, -1) |
1d48df12001b
fixes for vdub plugin support - by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
3547
diff
changeset
|
3658 FF(isdigit, -1) |
3465 | 3659 FF(memmove, -1) |
3660 FF(memcmp, -1) | |
3672
1d48df12001b
fixes for vdub plugin support - by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
3547
diff
changeset
|
3661 FF(memset, -1) |
1d48df12001b
fixes for vdub plugin support - by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
3547
diff
changeset
|
3662 FF(memcpy, -1) |
3465 | 3663 FF(time, -1) |
3664 FF(rand, -1) | |
3665 FF(srand, -1) | |
3666 FF(log10, -1) | |
3667 FF(pow, -1) | |
3668 FF(cos, -1) | |
3669 FF(_ftol,-1) | |
3670 FF(sprintf,-1) | |
3671 FF(sscanf,-1) | |
3672 FF(fopen,-1) | |
3673 FF(fprintf,-1) | |
3674 FF(printf,-1) | |
3675 FF(getenv,-1) | |
1 | 3676 }; |
3677 struct exports exp_winmm[]={ | |
3465 | 3678 FF(GetDriverModuleHandle, -1) |
3679 FF(timeGetTime, -1) | |
3680 FF(DefDriverProc, -1) | |
3681 FF(OpenDriverA, -1) | |
3682 FF(OpenDriver, -1) | |
1 | 3683 }; |
3684 struct exports exp_user32[]={ | |
3465 | 3685 FF(LoadStringA, -1) |
3686 FF(wsprintfA, -1) | |
3687 FF(GetDC, -1) | |
3688 FF(GetDesktopWindow, -1) | |
3689 FF(ReleaseDC, -1) | |
3690 FF(IsRectEmpty, -1) | |
3691 FF(LoadCursorA,-1) | |
3692 FF(SetCursor,-1) | |
3693 FF(GetCursorPos,-1) | |
3694 FF(GetCursorPos,-1) | |
3695 FF(RegisterWindowMessageA,-1) | |
3696 FF(GetSystemMetrics,-1) | |
3697 FF(GetSysColor,-1) | |
3698 FF(GetSysColorBrush,-1) | |
3699 FF(GetWindowDC, -1) | |
3700 FF(DrawTextA, -1) | |
1 | 3701 }; |
3702 struct exports exp_advapi32[]={ | |
3465 | 3703 FF(RegCloseKey, -1) |
3704 FF(RegCreateKeyExA, -1) | |
3705 FF(RegEnumKeyExA, -1) | |
3706 FF(RegEnumValueA, -1) | |
3707 FF(RegOpenKeyA, -1) | |
3708 FF(RegOpenKeyExA, -1) | |
3709 FF(RegQueryValueExA, -1) | |
3710 FF(RegSetValueExA, -1) | |
1 | 3711 }; |
3712 struct exports exp_gdi32[]={ | |
3465 | 3713 FF(CreateCompatibleDC, -1) |
3714 FF(CreateFontA, -1) | |
3715 FF(DeleteDC, -1) | |
3716 FF(DeleteObject, -1) | |
3717 FF(GetDeviceCaps, -1) | |
3718 FF(GetSystemPaletteEntries, -1) | |
1 | 3719 }; |
3720 struct exports exp_version[]={ | |
3465 | 3721 FF(GetFileVersionInfoSizeA, -1) |
1 | 3722 }; |
128 | 3723 struct exports exp_ole32[]={ |
3465 | 3724 FF(CoCreateFreeThreadedMarshaler,-1) |
3725 FF(CoCreateInstance, -1) | |
3726 FF(CoInitialize, -1) | |
3727 FF(CoTaskMemAlloc, -1) | |
3728 FF(CoTaskMemFree, -1) | |
3729 FF(StringFromGUID2, -1) | |
128 | 3730 }; |
3465 | 3731 // do we really need crtdll ??? |
3732 // msvcrt is the correct place probably... | |
130 | 3733 struct exports exp_crtdll[]={ |
3465 | 3734 FF(memcpy, -1) |
3735 FF(wcscpy, -1) | |
130 | 3736 }; |
2069 | 3737 struct exports exp_comctl32[]={ |
3465 | 3738 FF(StringFromGUID2, -1) |
3739 FF(InitCommonControls, 17) | |
2069 | 3740 }; |
3465 | 3741 |
3742 struct exports exp_msdmo[]={ | |
3743 FF(memcpy, -1) // just test | |
3744 }; | |
3745 | |
1 | 3746 #define LL(X) \ |
3465 | 3747 {#X".dll", sizeof(exp_##X)/sizeof(struct exports), exp_##X}, |
1 | 3748 |
3749 struct libs libraries[]={ | |
3465 | 3750 LL(kernel32) |
3751 LL(msvcrt) | |
3752 LL(winmm) | |
3753 LL(user32) | |
3754 LL(advapi32) | |
3755 LL(gdi32) | |
3756 LL(version) | |
3757 LL(ole32) | |
3758 LL(crtdll) | |
3759 LL(comctl32) | |
3760 LL(msdmo) | |
1 | 3761 }; |
3762 | |
3465 | 3763 static char* called_unk = "Called unk_%s\n"; |
3764 static void ext_stubs(void) | |
3765 { | |
3766 // expects: | |
3767 // ax position index | |
3768 // cx address of printf function | |
3769 __asm__ __volatile__ | |
3770 ( | |
3771 "push %edx \n\t" | |
3772 "movl $0, %eax \n\t" | |
3773 "movl $0, %edx \n\t" | |
3774 "shl $5,%eax \n\t" // ax * 32 | |
3775 "addl $export_names,%eax \n\t" | |
3776 "pushl %eax \n\t" | |
3777 "pushl called_unk \n\t" | |
3778 "call *%edx \n\t" // printf (via dx) | |
3779 "addl $8,%esp \n\t" | |
3780 "xorl %eax,%eax \n\t" | |
3781 "pop %edx \n\t" | |
3782 ); | |
3783 } | |
3784 | |
3785 //static void add_stub(int pos) | |
3786 | |
3787 extern int unk_exp1; | |
3788 static char extcode[20000];// place for 200 unresolved exports | |
3789 static int pos=0; | |
3790 | |
3791 static void* add_stub() | |
3792 { | |
3793 char* answ = (char*)extcode+pos*0x30; | |
3794 #if 0 | |
3795 memcpy(answ, &unk_exp1, 0x64); | |
3796 *(int*)(answ+9)=pos; | |
3797 *(int*)(answ+47)-=((int)answ-(int)&unk_exp1); | |
3798 #endif | |
3799 memcpy(answ, ext_stubs, 0x2f); // 0x2c is current size | |
3800 //answ[0] = 0xb8; // movl $0, eax (0xb8 0x00000000) | |
3801 *((int*) (answ + 5)) = pos; | |
3802 //answ[5] = 0xb9; // movl $0, edx (0xb9 0x00000000) | |
3803 *((int*) (answ + 10)) = (int) printf; | |
3804 pos++; | |
3805 return (void*)answ; | |
3806 } | |
2069 | 3807 |
1 | 3808 void* LookupExternal(const char* library, int ordinal) |
3809 { | |
3810 int i,j; | |
3811 if(library==0) | |
3812 { | |
3813 printf("ERROR: library=0\n"); | |
3814 return (void*)ext_unknown; | |
3815 } | |
3465 | 3816 // printf("%x %x\n", &unk_exp1, &unk_exp2); |
1 | 3817 |
3818 for(i=0; i<sizeof(libraries)/sizeof(struct libs); i++) | |
3819 { | |
3820 if(strcasecmp(library, libraries[i].name)) | |
3821 continue; | |
3822 for(j=0; j<libraries[i].length; j++) | |
3823 { | |
3824 if(ordinal!=libraries[i].exps[j].id) | |
3825 continue; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
3826 //printf("Hit: 0x%p\n", libraries[i].exps[j].func); |
1 | 3827 return libraries[i].exps[j].func; |
3828 } | |
3829 } | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
3830 printf("External func %s:%d\n", library, ordinal); |
1 | 3831 if(pos>150)return 0; |
3832 sprintf(export_names[pos], "%s:%d", library, ordinal); | |
3465 | 3833 return add_stub(pos); |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
3834 } |
1 | 3835 |
3836 void* LookupExternalByName(const char* library, const char* name) | |
3837 { | |
3838 char* answ; | |
3839 int i,j; | |
3465 | 3840 // return (void*)ext_unknown; |
1 | 3841 if(library==0) |
3842 { | |
3843 printf("ERROR: library=0\n"); | |
3844 return (void*)ext_unknown; | |
3845 } | |
3846 if(name==0) | |
3847 { | |
3848 printf("ERROR: name=0\n"); | |
3849 return (void*)ext_unknown; | |
3850 } | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
3851 //printf("External func %s:%s\n", library, name); |
1 | 3852 for(i=0; i<sizeof(libraries)/sizeof(struct libs); i++) |
3853 { | |
3854 if(strcasecmp(library, libraries[i].name)) | |
3855 continue; | |
3856 for(j=0; j<libraries[i].length; j++) | |
3857 { | |
3858 if(strcmp(name, libraries[i].exps[j].name)) | |
3859 continue; | |
3465 | 3860 // printf("Hit: 0x%08X\n", libraries[i].exps[j].func); |
1 | 3861 return libraries[i].exps[j].func; |
3862 } | |
3863 } | |
3465 | 3864 if(pos>150)return 0;// to many symbols |
1 | 3865 strcpy(export_names[pos], name); |
3465 | 3866 return add_stub(pos); |
1 | 3867 } |
3868 | |
2069 | 3869 void my_garbagecollection(void) |
128 | 3870 { |
3871 #ifdef GARBAGE | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
3872 int unfree = 0, unfreecnt = 0; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
3873 |
3134 | 3874 free_registry(); |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
3875 while (last_alloc) |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
3876 { |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
3877 alloc_header* mem = last_alloc + 1; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
3878 unfree += my_size(mem); |
3465 | 3879 unfreecnt++; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
3880 my_release(mem); |
128 | 3881 } |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
3882 printf("Total Unfree %d bytes cnt %d [%p,%d]\n",unfree, unfreecnt, last_alloc, alccnt); |
128 | 3883 #endif |
3134 | 3884 g_tls = NULL; |
3885 list = NULL; | |
128 | 3886 } |