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