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