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