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