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