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