Mercurial > mplayer.hg
annotate loader/win32.c @ 3405:ce4df7bff5e1
updated for avifile compilance
author | alex |
---|---|
date | Sun, 09 Dec 2001 17:14:39 +0000 |
parents | 1261ff74abd9 |
children | 7b78672b7ad4 |
rev | line source |
---|---|
1 | 1 /*********************************************************** |
2 | |
3 Win32 emulation code. Functions that emulate | |
4 responses from corresponding Win32 API calls. | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
5 Since we are not going to be able to load |
1 | 6 virtually any DLL, we can only implement this |
7 much, adding needed functions with each new codec. | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
8 |
128 | 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 { |
2ec3ec904cd4
Try to provide a vsscanf() implementation, if the system does not have
jkeil
parents:
2780
diff
changeset
|
56 long p1 = va_arg(ap, long); |
2ec3ec904cd4
Try to provide a vsscanf() implementation, if the system does not have
jkeil
parents:
2780
diff
changeset
|
57 long p2 = va_arg(ap, long); |
2ec3ec904cd4
Try to provide a vsscanf() implementation, if the system does not have
jkeil
parents:
2780
diff
changeset
|
58 long p3 = va_arg(ap, long); |
2ec3ec904cd4
Try to provide a vsscanf() implementation, if the system does not have
jkeil
parents:
2780
diff
changeset
|
59 long p4 = va_arg(ap, long); |
2ec3ec904cd4
Try to provide a vsscanf() implementation, if the system does not have
jkeil
parents:
2780
diff
changeset
|
60 long p5 = va_arg(ap, long); |
2ec3ec904cd4
Try to provide a vsscanf() implementation, if the system does not have
jkeil
parents:
2780
diff
changeset
|
61 return sscanf(str, format, p1, p2, p3, p4, p5); |
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 { |
2069 | 69 __asm__ __volatile__( |
70 "pushl %%ebx; pushl %%ecx; pushl %%edx;" | |
71 ".byte 0x0f, 0xa2;" | |
72 "movl %%eax, (%2);" | |
73 "movl %%ebx, 4(%2);" | |
74 "movl %%ecx, 8(%2);" | |
75 "movl %%edx, 12(%2);" | |
76 "popl %%edx; popl %%ecx; popl %%ebx;" | |
77 : "=a" (ax) | |
78 : "0" (ax), "S" (regs) | |
79 ); | |
128 | 80 } |
81 static unsigned int c_localcount_tsc() | |
1 | 82 { |
83 int a; | |
84 __asm__ __volatile__("rdtsc\n\t" | |
85 :"=a"(a) | |
86 : | |
87 :"edx"); | |
88 return a; | |
89 } | |
128 | 90 static void c_longcount_tsc(long long* z) |
1 | 91 { |
92 __asm__ __volatile__( | |
93 "pushl %%ebx\n\t" | |
94 "movl %%eax, %%ebx\n\t" | |
95 "rdtsc\n\t" | |
96 "movl %%eax, 0(%%ebx)\n\t" | |
97 "movl %%edx, 4(%%ebx)\n\t" | |
98 "popl %%ebx\n\t" | |
99 ::"a"(z)); | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
100 } |
128 | 101 static unsigned int c_localcount_notsc() |
1 | 102 { |
103 struct timeval tv; | |
104 unsigned limit=~0; | |
105 limit/=1000000; | |
106 gettimeofday(&tv, 0); | |
107 return limit*tv.tv_usec; | |
108 } | |
128 | 109 static void c_longcount_notsc(long long* z) |
1 | 110 { |
111 struct timeval tv; | |
112 unsigned long long result; | |
113 unsigned limit=~0; | |
114 if(!z)return; | |
115 limit/=1000000; | |
116 gettimeofday(&tv, 0); | |
117 result=tv.tv_sec; | |
118 result<<=32; | |
119 result+=limit*tv.tv_usec; | |
120 *z=result; | |
121 } | |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
122 static unsigned int localcount_stub(void); |
2069 | 123 static void longcount_stub(long long*); |
128 | 124 static unsigned int (*localcount)()=localcount_stub; |
125 static void (*longcount)(long long*)=longcount_stub; | |
1 | 126 |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
127 static pthread_mutex_t memmut; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
128 |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
129 static unsigned int localcount_stub(void) |
128 | 130 { |
131 unsigned int regs[4]; | |
1923
40084ad62591
do_cpuid stored the results of the cpuid instruction in the wrong place
jkeil
parents:
1679
diff
changeset
|
132 do_cpuid(1, regs); |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
133 if ((regs[3] & 0x00000010) != 0) |
128 | 134 { |
135 localcount=c_localcount_tsc; | |
136 longcount=c_longcount_tsc; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
137 } |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
138 else |
128 | 139 { |
140 localcount=c_localcount_notsc; | |
141 longcount=c_longcount_notsc; | |
142 } | |
143 return localcount(); | |
144 } | |
145 static void longcount_stub(long long* z) | |
1 | 146 { |
128 | 147 unsigned int regs[4]; |
1923
40084ad62591
do_cpuid stored the results of the cpuid instruction in the wrong place
jkeil
parents:
1679
diff
changeset
|
148 do_cpuid(1, regs); |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
149 if ((regs[3] & 0x00000010) != 0) |
128 | 150 { |
151 localcount=c_localcount_tsc; | |
152 longcount=c_longcount_tsc; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
153 } |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
154 else |
128 | 155 { |
156 localcount=c_localcount_notsc; | |
157 longcount=c_longcount_notsc; | |
158 } | |
159 longcount(z); | |
160 } | |
2780 | 161 |
2069 | 162 int LOADER_DEBUG=1; // active only if compiled with -DDETAILED_OUT |
3128 | 163 //#define DETAILED_OUT |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
164 static inline void dbgprintf(char* fmt, ...) |
128 | 165 { |
235 | 166 #ifdef DETAILED_OUT |
128 | 167 if(LOADER_DEBUG) |
168 { | |
169 FILE* f; | |
170 va_list va; | |
171 va_start(va, fmt); | |
172 f=fopen("./log", "a"); | |
3134 | 173 vprintf(fmt, va); |
128 | 174 if(f) |
175 { | |
176 vfprintf(f, fmt, va); | |
177 fsync(fileno(f)); | |
178 fclose(f); | |
179 } | |
180 va_end(va); | |
181 } | |
235 | 182 #endif |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
183 } |
3128 | 184 |
185 | |
1 | 186 char export_names[500][30]={ |
187 "name1", | |
188 //"name2", | |
189 //"name3" | |
190 }; | |
191 //#define min(x,y) ((x)<(y)?(x):(y)) | |
192 | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
193 void destroy_event(void* event); |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
194 |
3134 | 195 struct th_list_t; |
196 typedef struct th_list_t{ | |
197 int id; | |
198 void* thread; | |
199 struct th_list_t* next; | |
200 struct th_list_t* prev; | |
201 } th_list; | |
202 | |
203 | |
204 // 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
|
205 static unsigned char* heap=NULL; |
1 | 206 static int heap_counter=0; |
3134 | 207 static tls_t* g_tls=NULL; |
208 static th_list* list=NULL; | |
209 | |
2069 | 210 static void test_heap(void) |
1 | 211 { |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
212 int offset=0; |
1 | 213 if(heap==0) |
214 return; | |
215 while(offset<heap_counter) | |
216 { | |
217 if(*(int*)(heap+offset)!=0x433476) | |
218 { | |
219 printf("Heap corruption at address %d\n", offset); | |
220 return; | |
221 } | |
222 offset+=8+*(int*)(heap+offset+4); | |
223 } | |
224 for(;offset<min(offset+1000, 20000000); offset++) | |
225 if(heap[offset]!=0xCC) | |
226 { | |
227 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
|
228 } |
1 | 229 } |
230 #undef MEMORY_DEBUG | |
231 | |
232 #ifdef MEMORY_DEBUG | |
233 | |
234 void* my_mreq(int size, int to_zero) | |
235 { | |
236 static int test=0; | |
237 test++; | |
238 if(test%10==0)printf("Memory: %d bytes allocated\n", heap_counter); | |
239 // test_heap(); | |
240 if(heap==NULL) | |
241 { | |
242 heap=malloc(20000000); | |
243 memset(heap, 0xCC,20000000); | |
244 } | |
245 if(heap==0) | |
246 { | |
247 printf("No enough memory\n"); | |
248 return 0; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
249 } |
1 | 250 if(heap_counter+size>20000000) |
251 { | |
252 printf("No enough memory\n"); | |
253 return 0; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
254 } |
1 | 255 *(int*)(heap+heap_counter)=0x433476; |
256 heap_counter+=4; | |
257 *(int*)(heap+heap_counter)=size; | |
258 heap_counter+=4; | |
259 printf("Allocated %d bytes of memory: sys %d, user %d-%d\n", size, heap_counter-8, heap_counter, heap_counter+size); | |
260 if(to_zero) | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
261 memset(heap+heap_counter, 0, size); |
1543 | 262 else |
2139 | 263 memset(heap+heap_counter, 0xcc, size); // make crash reproducable |
1 | 264 heap_counter+=size; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
265 return heap+heap_counter-size; |
1 | 266 } |
2069 | 267 int my_release(char* memory) |
1 | 268 { |
269 // test_heap(); | |
270 if(memory==NULL) | |
271 { | |
272 printf("ERROR: free(0)\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 if(*(int*)(memory-8)!=0x433476) |
276 { | |
277 printf("MEMORY CORRUPTION !!!!!!!!!!!!!!!!!!!\n"); | |
278 return 0; | |
279 } | |
280 printf("Freed %d bytes of memory\n", *(int*)(memory-4)); | |
281 // memset(memory-8, *(int*)(memory-4), 0xCC); | |
282 return 0; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
283 } |
1 | 284 |
285 #else | |
128 | 286 #define GARBAGE |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
287 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
|
288 struct alloc_header_t |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
289 { |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
290 // let's keep allocated data 16 byte aligned |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
291 alloc_header* prev; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
292 alloc_header* next; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
293 long deadbeef; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
294 long size; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
295 long type; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
296 long reserved1; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
297 long reserved2; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
298 long reserved3; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
299 }; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
300 |
128 | 301 #ifdef GARBAGE |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
302 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
|
303 static int alccnt = 0; |
128 | 304 #endif |
305 | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
306 #define AREATYPE_CLIENT 0 |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
307 #define AREATYPE_EVENT 1 |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
308 #define AREATYPE_MUTEX 2 |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
309 #define AREATYPE_COND 3 |
3134 | 310 #define AREATYPE_CRITSECT 4 |
311 | |
312 /* -- critical sections -- */ | |
313 struct CRITSECT | |
314 { | |
315 pthread_t id; | |
316 pthread_mutex_t mutex; | |
317 int locked; | |
318 }; | |
2651
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 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
|
321 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
|
322 { |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
323 alloc_header* header; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
324 if (to_zero) |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
325 header=calloc(size + sizeof(alloc_header), 1); |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
326 else |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
327 header=malloc(size + sizeof(alloc_header)); |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
328 #ifdef GARBAGE |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
329 if (!last_alloc) |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
330 { |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
331 pthread_mutex_init(&memmut, NULL); |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
332 pthread_mutex_lock(&memmut); |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
333 } |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
334 else |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
335 { |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
336 pthread_mutex_lock(&memmut); |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
337 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
|
338 } |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
339 |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
340 header->prev = last_alloc; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
341 header->next = 0; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
342 last_alloc = header; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
343 alccnt++; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
344 pthread_mutex_unlock(&memmut); |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
345 #endif |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
346 header->deadbeef = 0xdeadbeef; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
347 header->size = size; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
348 header->type = type; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
349 |
3128 | 350 //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
|
351 return header + 1; |
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 |
1 | 354 void* my_mreq(int size, int to_zero) |
355 { | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
356 return mreq_private(size, to_zero, AREATYPE_CLIENT); |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
357 } |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
358 |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
359 |
597 | 360 int my_release(void* memory) |
1 | 361 { |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
362 alloc_header* header = (alloc_header*) memory - 1; |
128 | 363 #ifdef GARBAGE |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
364 alloc_header* prevmem; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
365 alloc_header* nextmem; |
3134 | 366 |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
367 if (memory == 0) |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
368 return 0; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
369 |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
370 if (header->deadbeef != 0xdeadbeef) |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
371 { |
3128 | 372 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
|
373 return 0; |
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 |
3128 | 376 pthread_mutex_lock(&memmut); |
377 | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
378 switch(header->type) |
128 | 379 { |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
380 case AREATYPE_EVENT: |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
381 destroy_event(memory); |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
382 break; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
383 case AREATYPE_COND: |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
384 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
|
385 break; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
386 case AREATYPE_MUTEX: |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
387 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
|
388 break; |
3134 | 389 case AREATYPE_CRITSECT: |
390 pthread_mutex_destroy(&((struct CRITSECT*)memory)->mutex); | |
391 break; | |
392 default: | |
393 //memset(memory, 0xcc, header->size); | |
128 | 394 } |
3128 | 395 |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
396 prevmem = header->prev; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
397 nextmem = header->next; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
398 |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
399 if (prevmem) |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
400 prevmem->next = nextmem; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
401 if (nextmem) |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
402 nextmem->prev = prevmem; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
403 |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
404 if (header == last_alloc) |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
405 last_alloc = prevmem; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
406 |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
407 alccnt--; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
408 |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
409 if (last_alloc) |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
410 pthread_mutex_unlock(&memmut); |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
411 else |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
412 pthread_mutex_destroy(&memmut); |
3134 | 413 |
3128 | 414 //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
|
415 #else |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
416 if (memory == 0) |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
417 return 0; |
128 | 418 #endif |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
419 free(header); |
1 | 420 return 0; |
421 } | |
422 #endif | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
423 |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
424 static inline int my_size(void* memory) |
2069 | 425 { |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
426 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
|
427 } |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
428 |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
429 void* my_realloc(void* memory, int size) |
1 | 430 { |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
431 void *ans = memory; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
432 int osize = my_size(memory); |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
433 if (memory == NULL) |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
434 return my_mreq(size, 0); |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
435 if (osize < size) |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
436 { |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
437 ans = my_mreq(size, 0); |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
438 memcpy(ans, memory, osize); |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
439 my_release(memory); |
2069 | 440 } |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
441 return ans; |
2069 | 442 } |
1 | 443 |
444 extern int unk_exp1; | |
445 char extcode[20000];// place for 200 unresolved exports | |
446 int pos=0; | |
447 | |
2069 | 448 int WINAPI ext_unknown() |
1 | 449 { |
450 printf("Unknown func called\n"); | |
451 return 0; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
452 } |
1 | 453 int WINAPI expIsBadWritePtr(void* ptr, unsigned int count) |
454 { | |
128 | 455 int result; |
1 | 456 if(count==0) |
128 | 457 result=0; |
458 else | |
1 | 459 if(ptr==0) |
128 | 460 result=1; |
461 else | |
462 result=0; | |
463 dbgprintf("IsBadWritePtr(0x%x, 0x%x) => %d\n", ptr, count, result); | |
464 return result; | |
1 | 465 } |
466 int WINAPI expIsBadReadPtr(void* ptr, unsigned int count) | |
467 { | |
128 | 468 int result; |
1 | 469 if(count==0) |
128 | 470 result=0; |
471 else | |
1 | 472 if(ptr==0) |
128 | 473 result=1; |
474 else | |
475 result=0; | |
476 dbgprintf("IsBadReadPtr(0x%x, 0x%x) => %d\n", ptr, count, result); | |
477 return result; | |
1 | 478 } |
479 void* CDECL expmalloc(int size) | |
480 { | |
481 //printf("malloc"); | |
482 // return malloc(size); | |
483 void* result=my_mreq(size,0); | |
128 | 484 dbgprintf("malloc(0x%x) => 0x%x\n", size,result); |
1 | 485 if(result==0) |
486 printf("WARNING: malloc() failed\n"); | |
487 return result; | |
488 } | |
489 void CDECL expfree(void* mem) | |
490 { | |
491 // return free(mem); | |
128 | 492 dbgprintf("free(0x%x)\n", mem); |
1 | 493 my_release(mem); |
494 } | |
495 void* CDECL expnew(int size) | |
496 { | |
497 // printf("NEW:: Call from address %08x\n STACK DUMP:\n", *(-1+(int*)&size)); | |
498 // printf("%08x %08x %08x %08x\n", | |
499 // size, *(1+(int*)&size), | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
500 // *(2+(int*)&size),*(3+(int*)&size)); |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
501 void* result = 0; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
502 assert(size >= 0); |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
503 |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
504 result=my_mreq(size,0); |
128 | 505 dbgprintf("new(0x%x) => 0x%x\n", size, result); |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
506 if (result==0) |
128 | 507 printf("WARNING: new() failed\n"); |
1 | 508 return result; |
509 | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
510 } |
1 | 511 int CDECL expdelete(void* memory) |
512 { | |
128 | 513 dbgprintf("delete(0x%x)\n", memory); |
514 my_release(memory); | |
1 | 515 return 0; |
516 } | |
517 int WINAPI expDisableThreadLibraryCalls(int module) | |
518 { | |
128 | 519 dbgprintf("DisableThreadLibraryCalls(0x%x) => 0\n", module); |
1 | 520 return 0; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
521 } |
1 | 522 int CDECL exp_initterm(int v1, int v2) |
523 { | |
128 | 524 dbgprintf("_initterm(0x%x, 0x%x) => 0\n", v1, v2); |
1 | 525 return 0; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
526 } |
1 | 527 |
2069 | 528 HMODULE WINAPI expGetDriverModuleHandle(DRVR* pdrv) |
1 | 529 { |
2069 | 530 HMODULE result; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
531 if (pdrv==NULL) |
2069 | 532 result=0; |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
533 else |
2069 | 534 result=pdrv->hDriverModule; |
535 dbgprintf("GetDriverModuleHandle(%p) => %p\n", pdrv, result); | |
128 | 536 return result; |
1 | 537 } |
538 | |
2069 | 539 #define MODULE_HANDLE_kernel32 ((HMODULE)0x120) |
540 | |
541 HMODULE WINAPI expGetModuleHandleA(const char* name) | |
1 | 542 { |
543 WINE_MODREF* wm; | |
2069 | 544 HMODULE result; |
128 | 545 if(!name) |
546 result=0; | |
547 else | |
548 { | |
549 wm=MODULE_FindModule(name); | |
550 if(wm==0)result=0; | |
551 else | |
2069 | 552 result=(HMODULE)(wm->module); |
128 | 553 } |
554 if(!result) | |
555 { | |
556 if(strcasecmp(name, "kernel32")==0) | |
2069 | 557 result=MODULE_HANDLE_kernel32; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
558 } |
128 | 559 dbgprintf("GetModuleHandleA('%s') => 0x%x\n", name, result); |
560 return result; | |
1 | 561 } |
128 | 562 |
1 | 563 |
564 void* WINAPI expCreateThread(void* pSecAttr, long dwStackSize, void* lpStartAddress, | |
565 void* lpParameter, long dwFlags, long* dwThreadId) | |
566 { | |
567 pthread_t *pth; | |
568 // printf("CreateThread:"); | |
569 pth=my_mreq(sizeof(pthread_t), 0); | |
570 pthread_create(pth, NULL, (void*(*)(void*))lpStartAddress, lpParameter); | |
571 if(dwFlags) | |
128 | 572 printf( "WARNING: CreateThread flags not supported\n"); |
1 | 573 if(dwThreadId) |
574 *dwThreadId=(long)pth; | |
575 if(list==NULL) | |
576 { | |
577 list=my_mreq(sizeof(th_list), 1); | |
578 list->next=list->prev=NULL; | |
579 } | |
580 else | |
581 { | |
582 list->next=my_mreq(sizeof(th_list), 0); | |
583 list->next->prev=list; | |
584 list->next->next=NULL; | |
585 list=list->next; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
586 } |
1 | 587 list->thread=pth; |
128 | 588 dbgprintf("CreateThread(0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x) => 0x%x\n", |
589 pSecAttr, dwStackSize, lpStartAddress, lpParameter, dwFlags, dwThreadId, pth); | |
1 | 590 return pth; |
591 } | |
592 | |
593 struct mutex_list_t; | |
594 | |
595 struct mutex_list_t | |
596 { | |
128 | 597 char type; |
1 | 598 pthread_mutex_t *pm; |
128 | 599 pthread_cond_t *pc; |
600 char state; | |
601 char reset; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
602 char name[128]; |
128 | 603 int semaphore; |
1 | 604 struct mutex_list_t* next; |
605 struct mutex_list_t* prev; | |
606 }; | |
607 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
|
608 static mutex_list* mlist=NULL; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
609 |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
610 void destroy_event(void* event) |
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 mutex_list* pp=mlist; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
613 // printf("garbage collector: destroy_event(%x)\n", event); |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
614 while(pp) |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
615 { |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
616 if(pp==(mutex_list*)event) |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
617 { |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
618 if(pp->next) |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
619 pp->next->prev=pp->prev; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
620 if(pp->prev) |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
621 pp->prev->next=pp->next; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
622 if(mlist==(mutex_list*)event) |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
623 mlist=mlist->prev; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
624 /* |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
625 pp=mlist; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
626 while(pp) |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
627 { |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
628 printf("%x => ", pp); |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
629 pp=pp->prev; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
630 } |
3128 | 631 printf("0\n"); |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
632 */ |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
633 return; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
634 } |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
635 pp=pp->prev; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
636 } |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
637 } |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
638 |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
639 void* WINAPI expCreateEventA(void* pSecAttr, char bManualReset, |
1 | 640 char bInitialState, const char* name) |
641 { | |
642 pthread_mutex_t *pm; | |
128 | 643 pthread_cond_t *pc; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
644 /* |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
645 mutex_list* pp; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
646 pp=mlist; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
647 while(pp) |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
648 { |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
649 printf("%x => ", pp); |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
650 pp=pp->prev; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
651 } |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
652 printf("0\n"); |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
653 */ |
1 | 654 if(mlist!=NULL) |
655 { | |
656 mutex_list* pp=mlist; | |
657 if(name!=NULL) | |
658 do | |
659 { | |
128 | 660 if((strcmp(pp->name, name)==0) && (pp->type==0)) |
661 { | |
662 dbgprintf("CreateEventA(0x%x, 0x%x, 0x%x, 0x%x='%s') => 0x%x\n", | |
663 pSecAttr, bManualReset, bInitialState, name, name, pp->pm); | |
1 | 664 return pp->pm; |
128 | 665 } |
2069 | 666 }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
|
667 } |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
668 pm=mreq_private(sizeof(pthread_mutex_t), 0, AREATYPE_MUTEX); |
1 | 669 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
|
670 pc=mreq_private(sizeof(pthread_cond_t), 0, AREATYPE_COND); |
128 | 671 pthread_cond_init(pc, NULL); |
1 | 672 if(mlist==NULL) |
673 { | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
674 mlist=mreq_private(sizeof(mutex_list), 00, AREATYPE_EVENT); |
1 | 675 mlist->next=mlist->prev=NULL; |
676 } | |
677 else | |
678 { | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
679 mlist->next=mreq_private(sizeof(mutex_list), 00, AREATYPE_EVENT); |
128 | 680 mlist->next->prev=mlist; |
1 | 681 mlist->next->next=NULL; |
682 mlist=mlist->next; | |
683 } | |
128 | 684 mlist->type=0; /* Type Event */ |
1 | 685 mlist->pm=pm; |
128 | 686 mlist->pc=pc; |
687 mlist->state=bInitialState; | |
688 mlist->reset=bManualReset; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
689 if(name) |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
690 strncpy(mlist->name, name, 127); |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
691 else |
1 | 692 mlist->name[0]=0; |
693 if(pm==NULL) | |
694 dbgprintf("ERROR::: CreateEventA failure\n"); | |
128 | 695 /* |
1 | 696 if(bInitialState) |
697 pthread_mutex_lock(pm); | |
128 | 698 */ |
699 if(name) | |
700 dbgprintf("CreateEventA(0x%x, 0x%x, 0x%x, 0x%x='%s') => 0x%x\n", | |
701 pSecAttr, bManualReset, bInitialState, name, name, mlist); | |
702 else | |
703 dbgprintf("CreateEventA(0x%x, 0x%x, 0x%x, NULL) => 0x%x\n", | |
704 pSecAttr, bManualReset, bInitialState, mlist); | |
705 return mlist; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
706 } |
1 | 707 |
708 void* WINAPI expSetEvent(void* event) | |
709 { | |
128 | 710 mutex_list *ml = (mutex_list *)event; |
711 dbgprintf("SetEvent(%x) => 0x1\n", event); | |
712 pthread_mutex_lock(ml->pm); | |
713 if (ml->state == 0) { | |
714 ml->state = 1; | |
715 pthread_cond_signal(ml->pc); | |
716 } | |
717 pthread_mutex_unlock(ml->pm); | |
718 | |
719 return (void *)1; | |
1 | 720 } |
721 void* WINAPI expResetEvent(void* event) | |
722 { | |
128 | 723 mutex_list *ml = (mutex_list *)event; |
724 dbgprintf("ResetEvent(0x%x) => 0x1\n", event); | |
725 pthread_mutex_lock(ml->pm); | |
726 ml->state = 0; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
727 pthread_mutex_unlock(ml->pm); |
128 | 728 |
729 return (void *)1; | |
1 | 730 } |
731 | |
732 void* WINAPI expWaitForSingleObject(void* object, int duration) | |
733 { | |
128 | 734 mutex_list *ml = (mutex_list *)object; |
2069 | 735 // FIXME FIXME FIXME - this value is sometime unititialize !!! |
736 int ret = WAIT_FAILED; | |
128 | 737 mutex_list* pp=mlist; |
2779 | 738 if(object == (void*)0xcfcf9898) |
739 { | |
740 /** | |
741 From GetCurrentThread() documentation: | |
3128 | 742 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. |
2779 | 743 |
3128 | 744 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. |
2779 | 745 |
3128 | 746 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. |
2779 | 747 **/ |
748 dbgprintf("WaitForSingleObject(thread_handle) called\n"); | |
3128 | 749 return (void*)WAIT_FAILED; |
2779 | 750 } |
2069 | 751 dbgprintf("WaitForSingleObject(0x%x, duration %d) =>\n",object, duration); |
752 | |
718 | 753 // loop below was slightly fixed - its used just for checking if |
754 // this object really exists in our list | |
755 if (!ml) | |
756 return (void*) ret; | |
757 while (pp && (pp->pm != ml->pm)) | |
2069 | 758 pp = pp->prev; |
718 | 759 if (!pp) { |
2069 | 760 dbgprintf("WaitForSingleObject: NotFound\n"); |
761 return (void*)ret; | |
718 | 762 } |
128 | 763 |
764 pthread_mutex_lock(ml->pm); | |
765 | |
766 switch(ml->type) { | |
767 case 0: /* Event */ | |
768 if (duration == 0) { /* Check Only */ | |
769 if (ml->state == 1) ret = WAIT_FAILED; | |
770 else ret = WAIT_OBJECT_0; | |
771 } | |
772 if (duration == -1) { /* INFINITE */ | |
773 if (ml->state == 0) | |
774 pthread_cond_wait(ml->pc,ml->pm); | |
775 if (ml->reset) | |
776 ml->state = 0; | |
777 ret = WAIT_OBJECT_0; | |
778 } | |
779 if (duration > 0) { /* Timed Wait */ | |
780 struct timespec abstime; | |
781 struct timeval now; | |
782 gettimeofday(&now, 0); | |
783 abstime.tv_sec = now.tv_sec + (now.tv_usec+duration)/1000000; | |
784 abstime.tv_nsec = ((now.tv_usec+duration)%1000000)*1000; | |
785 if (ml->state == 0) | |
786 ret=pthread_cond_timedwait(ml->pc,ml->pm,&abstime); | |
787 if (ret == ETIMEDOUT) ret = WAIT_TIMEOUT; | |
788 else ret = WAIT_OBJECT_0; | |
789 if (ml->reset) | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
790 ml->state = 0; |
128 | 791 } |
792 break; | |
793 case 1: /* Semaphore */ | |
794 if (duration == 0) { | |
795 if(ml->semaphore==0) ret = WAIT_FAILED; | |
796 else { | |
797 ml->semaphore++; | |
798 ret = WAIT_OBJECT_0; | |
799 } | |
800 } | |
801 if (duration == -1) { | |
802 if (ml->semaphore==0) | |
803 pthread_cond_wait(ml->pc,ml->pm); | |
804 ml->semaphore--; | |
805 } | |
806 break; | |
807 } | |
808 pthread_mutex_unlock(ml->pm); | |
809 | |
810 dbgprintf("WaitForSingleObject(0x%x, %d): 0x%x => 0x%x \n",object,duration,ml,ret); | |
811 return (void *)ret; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
812 } |
1 | 813 |
814 static BYTE PF[64] = {0,}; | |
815 | |
128 | 816 WIN_BOOL WINAPI expIsProcessorFeaturePresent(DWORD v) |
817 { | |
818 WIN_BOOL result; | |
819 if(v>63)result=0; | |
820 else result=PF[v]; | |
821 dbgprintf("IsProcessorFeaturePresent(0x%x) => 0x%x\n", v, result); | |
822 return result; | |
823 } | |
824 | |
825 static void DumpSystemInfo(const SYSTEM_INFO* si) | |
826 { | |
827 dbgprintf(" Processor architecture %d\n", si->u.s.wProcessorArchitecture); | |
828 dbgprintf(" Page size: %d\n", si->dwPageSize); | |
829 dbgprintf(" Minimum app address: %d\n", si->lpMinimumApplicationAddress); | |
830 dbgprintf(" Maximum app address: %d\n", si->lpMaximumApplicationAddress); | |
831 dbgprintf(" Active processor mask: 0x%x\n", si->dwActiveProcessorMask); | |
832 dbgprintf(" Number of processors: %d\n", si->dwNumberOfProcessors); | |
833 dbgprintf(" Processor type: 0x%x\n", si->dwProcessorType); | |
834 dbgprintf(" Allocation granularity: 0x%x\n", si->dwAllocationGranularity); | |
835 dbgprintf(" Processor level: 0x%x\n", si->wProcessorLevel); | |
836 dbgprintf(" Processor revision: 0x%x\n", si->wProcessorRevision); | |
837 } | |
838 | |
1 | 839 void WINAPI expGetSystemInfo(SYSTEM_INFO* si) |
840 { | |
841 /* FIXME: better values for the two entries below... */ | |
842 static int cache = 0; | |
843 static SYSTEM_INFO cachedsi; | |
128 | 844 unsigned int regs[4]; |
2069 | 845 dbgprintf("GetSystemInfo(%p) =>\n", si); |
1 | 846 |
847 if (cache) { | |
848 memcpy(si,&cachedsi,sizeof(*si)); | |
128 | 849 DumpSystemInfo(si); |
1 | 850 return; |
851 } | |
852 memset(PF,0,sizeof(PF)); | |
853 | |
854 cachedsi.u.s.wProcessorArchitecture = PROCESSOR_ARCHITECTURE_INTEL; | |
855 cachedsi.dwPageSize = getpagesize(); | |
856 | |
857 /* FIXME: better values for the two entries below... */ | |
128 | 858 cachedsi.lpMinimumApplicationAddress = (void *)0x00000000; |
1 | 859 cachedsi.lpMaximumApplicationAddress = (void *)0x7FFFFFFF; |
860 cachedsi.dwActiveProcessorMask = 1; | |
861 cachedsi.dwNumberOfProcessors = 1; | |
862 cachedsi.dwProcessorType = PROCESSOR_INTEL_386; | |
863 cachedsi.dwAllocationGranularity = 0x10000; | |
128 | 864 cachedsi.wProcessorLevel = 5; /* pentium */ |
865 cachedsi.wProcessorRevision = 0x0101; | |
2573 | 866 |
3405 | 867 #ifdef USE_WIN32DLL |
2573 | 868 /* mplayer's way to detect PF's */ |
869 { | |
870 #include "../cpudetect.h" | |
871 extern CpuCaps gCpuCaps; | |
3128 | 872 |
2573 | 873 if (gCpuCaps.hasMMX) |
874 PF[PF_MMX_INSTRUCTIONS_AVAILABLE] = TRUE; | |
875 if (gCpuCaps.hasSSE) | |
876 PF[PF_XMMI_INSTRUCTIONS_AVAILABLE] = TRUE; | |
877 if (gCpuCaps.has3DNow) | |
878 PF[PF_AMD3D_INSTRUCTIONS_AVAILABLE] = TRUE; | |
3404 | 879 |
880 switch(gCpuCaps.cpuType) | |
881 { | |
882 case CPUTYPE_I686: | |
883 case CPUTYPE_I586: | |
884 cachedsi.dwProcessorType = PROCESSOR_INTEL_PENTIUM; | |
885 cachedsi.wProcessorLevel = 5; | |
886 break; | |
887 case CPUTYPE_I486: | |
888 cachedsi.dwProcessorType = PROCESSOR_INTEL_486; | |
889 cachedsi.wProcessorLevel = 4; | |
890 break; | |
891 case CPUTYPE_I386: | |
892 default: | |
893 cachedsi.dwProcessorType = PROCESSOR_INTEL_386; | |
894 cachedsi.wProcessorLevel = 3; | |
895 break; | |
896 } | |
897 cachedsi.wProcessorRevision = gCpuCaps.cpuStepping; | |
898 cachedsi.dwNumberOfProcessors = 1; /* hardcoded */ | |
2573 | 899 } |
3405 | 900 #endif |
3128 | 901 |
3404 | 902 /* disable cpuid based detection (mplayer's cpudetect.c does this - see above) */ |
3405 | 903 #ifndef USE_WIN32DLL |
1038
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J«ärgen Keil <jk@tools.de>
arpi_esp
parents:
718
diff
changeset
|
904 #if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__svr4__) |
1923
40084ad62591
do_cpuid stored the results of the cpuid instruction in the wrong place
jkeil
parents:
1679
diff
changeset
|
905 do_cpuid(1, regs); |
1038
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J«ärgen Keil <jk@tools.de>
arpi_esp
parents:
718
diff
changeset
|
906 switch ((regs[0] >> 8) & 0xf) { // cpu family |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J«ärgen Keil <jk@tools.de>
arpi_esp
parents:
718
diff
changeset
|
907 case 3: cachedsi.dwProcessorType = PROCESSOR_INTEL_386; |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J«ärgen Keil <jk@tools.de>
arpi_esp
parents:
718
diff
changeset
|
908 cachedsi.wProcessorLevel= 3; |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J«ärgen Keil <jk@tools.de>
arpi_esp
parents:
718
diff
changeset
|
909 break; |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J«ärgen Keil <jk@tools.de>
arpi_esp
parents:
718
diff
changeset
|
910 case 4: cachedsi.dwProcessorType = PROCESSOR_INTEL_486; |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J«ärgen Keil <jk@tools.de>
arpi_esp
parents:
718
diff
changeset
|
911 cachedsi.wProcessorLevel= 4; |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J«ärgen Keil <jk@tools.de>
arpi_esp
parents:
718
diff
changeset
|
912 break; |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J«ärgen Keil <jk@tools.de>
arpi_esp
parents:
718
diff
changeset
|
913 case 5: cachedsi.dwProcessorType = PROCESSOR_INTEL_PENTIUM; |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J«ärgen Keil <jk@tools.de>
arpi_esp
parents:
718
diff
changeset
|
914 cachedsi.wProcessorLevel= 5; |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J«ärgen Keil <jk@tools.de>
arpi_esp
parents:
718
diff
changeset
|
915 break; |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J«ärgen Keil <jk@tools.de>
arpi_esp
parents:
718
diff
changeset
|
916 case 6: cachedsi.dwProcessorType = PROCESSOR_INTEL_PENTIUM; |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J«ärgen Keil <jk@tools.de>
arpi_esp
parents:
718
diff
changeset
|
917 cachedsi.wProcessorLevel= 5; |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J«ärgen Keil <jk@tools.de>
arpi_esp
parents:
718
diff
changeset
|
918 break; |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J«ärgen Keil <jk@tools.de>
arpi_esp
parents:
718
diff
changeset
|
919 default:cachedsi.dwProcessorType = PROCESSOR_INTEL_PENTIUM; |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J«ärgen Keil <jk@tools.de>
arpi_esp
parents:
718
diff
changeset
|
920 cachedsi.wProcessorLevel= 5; |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J«ärgen Keil <jk@tools.de>
arpi_esp
parents:
718
diff
changeset
|
921 break; |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J«ärgen Keil <jk@tools.de>
arpi_esp
parents:
718
diff
changeset
|
922 } |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J«ärgen Keil <jk@tools.de>
arpi_esp
parents:
718
diff
changeset
|
923 cachedsi.wProcessorRevision = regs[0] & 0xf; // stepping |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J«ärgen Keil <jk@tools.de>
arpi_esp
parents:
718
diff
changeset
|
924 if (regs[3] & (1 << 8)) |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J«ärgen Keil <jk@tools.de>
arpi_esp
parents:
718
diff
changeset
|
925 PF[PF_COMPARE_EXCHANGE_DOUBLE] = TRUE; |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J«ärgen Keil <jk@tools.de>
arpi_esp
parents:
718
diff
changeset
|
926 if (regs[3] & (1 << 23)) |
128 | 927 PF[PF_MMX_INSTRUCTIONS_AVAILABLE] = TRUE; |
2573 | 928 if (regs[3] & (1 << 25)) |
929 PF[PF_XMMI_INSTRUCTIONS_AVAILABLE] = TRUE; | |
930 if (regs[3] & (1 << 31)) | |
931 PF[PF_AMD3D_INSTRUCTIONS_AVAILABLE] = TRUE; | |
1 | 932 cachedsi.dwNumberOfProcessors=1; |
3404 | 933 #endif |
3405 | 934 #endif /* USE_WIN32DLL */ |
935 | |
3404 | 936 |
3405 | 937 /* MPlayer: linux detection enabled (based on proc/cpuinfo) for checking |
938 fdiv_bug and fpu emulation flags -- alex/MPlayer */ | |
3404 | 939 #ifdef __linux__ |
1 | 940 { |
941 char buf[20]; | |
942 char line[200]; | |
943 FILE *f = fopen ("/proc/cpuinfo", "r"); | |
944 | |
945 if (!f) | |
946 return; | |
947 while (fgets(line,200,f)!=NULL) { | |
948 char *s,*value; | |
949 | |
950 /* NOTE: the ':' is the only character we can rely on */ | |
951 if (!(value = strchr(line,':'))) | |
952 continue; | |
953 /* terminate the valuename */ | |
954 *value++ = '\0'; | |
955 /* skip any leading spaces */ | |
956 while (*value==' ') value++; | |
957 if ((s=strchr(value,'\n'))) | |
958 *s='\0'; | |
959 | |
960 /* 2.1 method */ | |
961 if (!lstrncmpiA(line, "cpu family",strlen("cpu family"))) { | |
962 if (isdigit (value[0])) { | |
963 switch (value[0] - '0') { | |
964 case 3: cachedsi.dwProcessorType = PROCESSOR_INTEL_386; | |
965 cachedsi.wProcessorLevel= 3; | |
966 break; | |
967 case 4: cachedsi.dwProcessorType = PROCESSOR_INTEL_486; | |
968 cachedsi.wProcessorLevel= 4; | |
969 break; | |
970 case 5: cachedsi.dwProcessorType = PROCESSOR_INTEL_PENTIUM; | |
971 cachedsi.wProcessorLevel= 5; | |
972 break; | |
973 case 6: cachedsi.dwProcessorType = PROCESSOR_INTEL_PENTIUM; | |
974 cachedsi.wProcessorLevel= 5; | |
975 break; | |
976 default:cachedsi.dwProcessorType = PROCESSOR_INTEL_PENTIUM; | |
977 cachedsi.wProcessorLevel= 5; | |
978 break; | |
979 } | |
980 } | |
981 /* set the CPU type of the current processor */ | |
2069 | 982 sprintf(buf,"CPU %ld",cachedsi.dwProcessorType); |
1 | 983 continue; |
984 } | |
985 /* old 2.0 method */ | |
986 if (!lstrncmpiA(line, "cpu",strlen("cpu"))) { | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
987 if ( isdigit (value[0]) && value[1] == '8' && |
1 | 988 value[2] == '6' && value[3] == 0 |
989 ) { | |
990 switch (value[0] - '0') { | |
991 case 3: cachedsi.dwProcessorType = PROCESSOR_INTEL_386; | |
992 cachedsi.wProcessorLevel= 3; | |
993 break; | |
994 case 4: cachedsi.dwProcessorType = PROCESSOR_INTEL_486; | |
995 cachedsi.wProcessorLevel= 4; | |
996 break; | |
997 case 5: cachedsi.dwProcessorType = PROCESSOR_INTEL_PENTIUM; | |
998 cachedsi.wProcessorLevel= 5; | |
999 break; | |
1000 case 6: cachedsi.dwProcessorType = PROCESSOR_INTEL_PENTIUM; | |
1001 cachedsi.wProcessorLevel= 5; | |
1002 break; | |
1003 default:cachedsi.dwProcessorType = PROCESSOR_INTEL_PENTIUM; | |
1004 cachedsi.wProcessorLevel= 5; | |
1005 break; | |
1006 } | |
1007 } | |
1008 /* set the CPU type of the current processor */ | |
2069 | 1009 sprintf(buf,"CPU %ld",cachedsi.dwProcessorType); |
1 | 1010 continue; |
1011 } | |
1012 if (!lstrncmpiA(line,"fdiv_bug",strlen("fdiv_bug"))) { | |
1013 if (!lstrncmpiA(value,"yes",3)) | |
1014 PF[PF_FLOATING_POINT_PRECISION_ERRATA] = TRUE; | |
1015 | |
1016 continue; | |
1017 } | |
1018 if (!lstrncmpiA(line,"fpu",strlen("fpu"))) { | |
1019 if (!lstrncmpiA(value,"no",2)) | |
1020 PF[PF_FLOATING_POINT_EMULATED] = TRUE; | |
1021 | |
1022 continue; | |
1023 } | |
1024 if (!lstrncmpiA(line,"processor",strlen("processor"))) { | |
1025 /* processor number counts up...*/ | |
1026 int x; | |
1027 | |
1028 if (sscanf(value,"%d",&x)) | |
1029 if (x+1>cachedsi.dwNumberOfProcessors) | |
1030 cachedsi.dwNumberOfProcessors=x+1; | |
1031 | |
1032 /* Create a new processor subkey on a multiprocessor | |
1033 * system | |
1034 */ | |
2069 | 1035 sprintf(buf,"%d",x); |
1 | 1036 } |
1037 if (!lstrncmpiA(line,"stepping",strlen("stepping"))) { | |
1038 int x; | |
1039 | |
1040 if (sscanf(value,"%d",&x)) | |
1041 cachedsi.wProcessorRevision = x; | |
1042 } | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1043 if |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1044 ( (!lstrncmpiA(line,"flags",strlen("flags"))) |
128 | 1045 || (!lstrncmpiA(line,"features",strlen("features"))) ) |
1046 { | |
1 | 1047 if (strstr(value,"cx8")) |
1048 PF[PF_COMPARE_EXCHANGE_DOUBLE] = TRUE; | |
1049 if (strstr(value,"mmx")) | |
1050 PF[PF_MMX_INSTRUCTIONS_AVAILABLE] = TRUE; | |
2573 | 1051 if (strstr(value,"tsc")) |
1052 PF[PF_RDTSC_INSTRUCTION_AVAILABLE] = TRUE; | |
1053 if (strstr(value,"xmm")) | |
1054 PF[PF_XMMI_INSTRUCTIONS_AVAILABLE] = TRUE; | |
1055 if (strstr(value,"3dnow")) | |
1056 PF[PF_AMD3D_INSTRUCTIONS_AVAILABLE] = TRUE; | |
1 | 1057 } |
1058 } | |
1059 fclose (f); | |
128 | 1060 /* |
1061 * ad hoc fix for smp machines. | |
1062 * some problems on WaitForSingleObject,CreateEvent,SetEvent | |
1063 * CreateThread ...etc.. | |
1064 * | |
1065 */ | |
1066 cachedsi.dwNumberOfProcessors=1; | |
1 | 1067 } |
3404 | 1068 #endif /* __linux__ */ |
1069 | |
2069 | 1070 cache = 1; |
1 | 1071 memcpy(si,&cachedsi,sizeof(*si)); |
128 | 1072 DumpSystemInfo(si); |
1 | 1073 } |
1074 | |
1075 long WINAPI expGetVersion() | |
1076 { | |
128 | 1077 dbgprintf("GetVersion() => 0xC0000004\n"); |
1078 return 0xC0000004;//Windows 95 | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1079 } |
1 | 1080 |
1081 HANDLE WINAPI expHeapCreate(long flags, long init_size, long max_size) | |
1082 { | |
1083 // printf("HeapCreate:"); | |
128 | 1084 HANDLE result; |
1 | 1085 if(init_size==0) |
128 | 1086 result=(HANDLE)my_mreq(0x110000, 0); |
1 | 1087 else |
128 | 1088 result=(HANDLE)my_mreq(init_size, 0); |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1089 dbgprintf("HeapCreate(flags 0x%x, initial size %d, maximum size %d) => 0x%x\n", flags, init_size, max_size, result); |
128 | 1090 return result; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1091 } |
3128 | 1092 |
1093 // this is another dirty hack | |
1094 // VP31 is releasing one allocated Heap twice | |
1095 // we will silently ignore this second call... | |
1096 static void* heapfreehack = 0; | |
1097 static int heapfreehackshown = 0; | |
1 | 1098 void* WINAPI expHeapAlloc(HANDLE heap, int flags, int size) |
1099 { | |
1100 void* z; | |
1101 // printf("HeapAlloc:"); | |
128 | 1102 /** |
1103 Morgan's m3jpeg32.dll v. 2.0 encoder expects that request for | |
1104 HeapAlloc returns area larger than size argument :-/ | |
3134 | 1105 - do we really have to vaste that much memory - I would |
1106 suggest to make extra check for this value - FIXME | |
128 | 1107 **/ |
3134 | 1108 //z=my_mreq(size, flags&8); |
1109 z=my_mreq((size + 0xfff) & 0x7ffff000, flags&8); | |
1 | 1110 if(z==0) |
1111 printf("HeapAlloc failure\n"); | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1112 dbgprintf("HeapAlloc(heap 0x%x, flags 0x%x, size 0x%x) => 0x%x\n", heap, flags, size, z); |
3128 | 1113 heapfreehack = 0; // reset |
1 | 1114 return z; |
1115 } | |
1116 long WINAPI expHeapDestroy(void* heap) | |
1117 { | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1118 dbgprintf("HeapDestroy(heap 0x%x) => 1\n", heap); |
1 | 1119 my_release(heap); |
1120 return 1; | |
1121 } | |
1122 | |
1123 long WINAPI expHeapFree(int arg1, int arg2, void* ptr) | |
1124 { | |
128 | 1125 dbgprintf("HeapFree(0x%x, 0x%x, pointer 0x%x) => 1\n", arg1, arg2, ptr); |
3134 | 1126 if (heapfreehack != ptr && ptr != (void*)0xffffffff) |
3128 | 1127 my_release(ptr); |
1128 else | |
1129 { | |
1130 if (!heapfreehackshown++) | |
1131 printf("Info: HeapFree deallocating same memory twice! (%p)\n", ptr); | |
1132 } | |
1133 heapfreehack = ptr; | |
1 | 1134 return 1; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1135 } |
1 | 1136 long WINAPI expHeapSize(int heap, int flags, void* pointer) |
1137 { | |
128 | 1138 long result=my_size(pointer); |
1139 dbgprintf("HeapSize(heap 0x%x, flags 0x%x, pointer 0x%x) => %d\n", heap, flags, pointer, result); | |
1140 return result; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1141 } |
2069 | 1142 void* WINAPI expHeapReAlloc(HANDLE heap,int flags,void *lpMem,int size) |
1143 { | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1144 long orgsize; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1145 void *newp; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1146 orgsize = my_size(lpMem); |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1147 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
|
1148 return my_realloc(lpMem, size); |
2069 | 1149 } |
1 | 1150 long WINAPI expGetProcessHeap(void) |
1151 { | |
128 | 1152 dbgprintf("GetProcessHeap() => 1\n"); |
1 | 1153 return 1; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1154 } |
1 | 1155 void* WINAPI expVirtualAlloc(void* v1, long v2, long v3, long v4) |
1156 { | |
1157 void* z; | |
1158 z=VirtualAlloc(v1, v2, v3, v4); | |
1159 if(z==0) | |
1160 printf("VirtualAlloc failure\n"); | |
128 | 1161 dbgprintf("VirtualAlloc(0x%x, %d, %d, %d) => 0x%x \n",v1,v2,v3,v4, z); |
1 | 1162 return z; |
1163 } | |
1164 int WINAPI expVirtualFree(void* v1, int v2, int v3) | |
1165 { | |
128 | 1166 int result=VirtualFree(v1,v2,v3); |
1167 dbgprintf("VirtualFree(0x%x, %d, %d) => %d\n",v1,v2,v3, result); | |
1168 return result; | |
3128 | 1169 } |
2579 | 1170 |
1171 /* we're building a table of critical sections. cs_win pointer uses the DLL | |
1172 cs_unix is the real structure, we're using cs_win only to identifying cs_unix */ | |
1173 struct critsecs_list_t | |
1174 { | |
1175 CRITICAL_SECTION *cs_win; | |
1176 struct CRITSECT *cs_unix; | |
1177 }; | |
1178 | |
3128 | 1179 #undef CRITSECS_NEWTYPE |
1180 //#define CRITSECS_NEWTYPE 1 | |
1181 | |
1182 #ifdef CRITSECS_NEWTYPE | |
2579 | 1183 #define CRITSECS_LIST_MAX 20 |
1184 static struct critsecs_list_t critsecs_list[CRITSECS_LIST_MAX]; | |
1185 | |
1186 int critsecs_get_pos(CRITICAL_SECTION *cs_win) | |
1187 { | |
1188 int i; | |
3128 | 1189 |
2579 | 1190 for (i=0; i < CRITSECS_LIST_MAX; i++) |
1191 if (critsecs_list[i].cs_win == cs_win) | |
1192 return(i); | |
1193 return(-1); | |
1194 } | |
1195 | |
1196 int critsecs_get_unused(void) | |
1197 { | |
1198 int i; | |
3128 | 1199 |
2579 | 1200 for (i=0; i < CRITSECS_LIST_MAX; i++) |
1201 if (critsecs_list[i].cs_win == NULL) | |
1202 return(i); | |
1203 return(-1); | |
1204 } | |
1205 | |
1206 #if 0 | |
1207 #define critsecs_get_unix(cs_win) (critsecs_list[critsecs_get_pos(cs_win)].cs_win) | |
1208 #else | |
1209 struct CRITSECT *critsecs_get_unix(CRITICAL_SECTION *cs_win) | |
1210 { | |
1211 int i; | |
3128 | 1212 |
2579 | 1213 for (i=0; i < CRITSECS_LIST_MAX; i++) |
2670 | 1214 if (critsecs_list[i].cs_win == cs_win && critsecs_list[i].cs_unix) |
2579 | 1215 return(critsecs_list[i].cs_unix); |
1216 return(NULL); | |
1217 } | |
1218 #endif | |
3128 | 1219 #endif |
2579 | 1220 |
1 | 1221 void WINAPI expInitializeCriticalSection(CRITICAL_SECTION* c) |
1222 { | |
128 | 1223 dbgprintf("InitializeCriticalSection(0x%x)\n", c); |
1 | 1224 /* if(sizeof(pthread_mutex_t)>sizeof(CRITICAL_SECTION)) |
1225 { | |
1226 printf(" ERROR:::: sizeof(pthread_mutex_t) is %d, expected <=%d!\n", | |
1227 sizeof(pthread_mutex_t), sizeof(CRITICAL_SECTION)); | |
1228 return; | |
1229 }*/ | |
1230 /* pthread_mutex_init((pthread_mutex_t*)c, NULL); */ | |
2579 | 1231 #ifdef CRITSECS_NEWTYPE |
1232 { | |
1233 struct CRITSECT *cs; | |
1234 int i = critsecs_get_unused(); | |
1235 | |
1236 if (i < 0) | |
1237 { | |
1238 printf("InitializeCriticalSection(%p) - no more space in list\n", c); | |
1239 return; | |
1240 } | |
2670 | 1241 printf("got unused space at %d\n", i); |
1242 cs = expmalloc(sizeof(struct CRITSECT)); | |
1243 if (!cs) | |
1244 { | |
1245 printf("InitializeCriticalSection(%p) - out of memory\n", c); | |
1246 return; | |
1247 } | |
2579 | 1248 pthread_mutex_init(&cs->mutex, NULL); |
1249 cs->locked = 0; | |
1250 critsecs_list[i].cs_win = c; | |
1251 critsecs_list[i].cs_unix = cs; | |
1252 dbgprintf("InitializeCriticalSection -> itemno=%d, cs_win=%p, cs_unix=%p\n", | |
1253 i, c, cs); | |
1254 } | |
1255 #else | |
1256 { | |
3134 | 1257 struct CRITSECT* cs = mreq_private(sizeof(struct CRITSECT), 0, AREATYPE_CRITSECT); |
1258 pthread_mutex_init(&cs->mutex, NULL); | |
1259 cs->locked=0; | |
1260 *(void**)c = cs; | |
2579 | 1261 } |
1262 #endif | |
1 | 1263 return; |
2579 | 1264 } |
1265 | |
1 | 1266 void WINAPI expEnterCriticalSection(CRITICAL_SECTION* c) |
1267 { | |
2579 | 1268 #ifdef CRITSECS_NEWTYPE |
1269 struct CRITSECT* cs = critsecs_get_unix(c); | |
1270 #else | |
128 | 1271 struct CRITSECT* cs=*(struct CRITSECT**)c; |
2579 | 1272 #endif |
128 | 1273 dbgprintf("EnterCriticalSection(0x%x)\n",c); |
2069 | 1274 if (!cs) |
1275 { | |
2670 | 1276 printf("entered uninitialized critisec!\n"); |
2069 | 1277 expInitializeCriticalSection(c); |
2579 | 1278 #ifdef CRITSECS_NEWTYPE |
1279 cs=critsecs_get_unix(c); | |
1280 #else | |
2069 | 1281 cs=*(struct CRITSECT**)c; |
2579 | 1282 #endif |
2069 | 1283 printf("Win32 Warning: Accessed uninitialized Critical Section (%p)!\n", c); |
1284 } | |
1 | 1285 if(cs->locked) |
1286 if(cs->id==pthread_self()) | |
1287 return; | |
1288 pthread_mutex_lock(&(cs->mutex)); | |
1289 cs->locked=1; | |
1290 cs->id=pthread_self(); | |
1291 return; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1292 } |
1 | 1293 void WINAPI expLeaveCriticalSection(CRITICAL_SECTION* c) |
1294 { | |
2579 | 1295 #ifdef CRITSECS_NEWTYPE |
1296 struct CRITSECT* cs = critsecs_get_unix(c); | |
1297 #else | |
128 | 1298 struct CRITSECT* cs=*(struct CRITSECT**)c; |
2579 | 1299 #endif |
128 | 1300 // struct CRITSECT* cs=(struct CRITSECT*)c; |
1301 dbgprintf("LeaveCriticalSection(0x%x)\n",c); | |
2069 | 1302 if (!cs) |
1303 { | |
1304 printf("Win32 Warning: Leaving noninitialized Critical Section %p!!\n", c); | |
1305 return; | |
1306 } | |
1 | 1307 cs->locked=0; |
1308 pthread_mutex_unlock(&(cs->mutex)); | |
1309 return; | |
1310 } | |
1311 void WINAPI expDeleteCriticalSection(CRITICAL_SECTION *c) | |
1312 { | |
2579 | 1313 #ifdef CRITSECS_NEWTYPE |
1314 struct CRITSECT* cs = critsecs_get_unix(c); | |
1315 #else | |
128 | 1316 struct CRITSECT* cs=*(struct CRITSECT**)c; |
2579 | 1317 #endif |
128 | 1318 // struct CRITSECT* cs=(struct CRITSECT*)c; |
1319 dbgprintf("DeleteCriticalSection(0x%x)\n",c); | |
1320 pthread_mutex_destroy(&(cs->mutex)); | |
2579 | 1321 // free(cs); |
1322 #ifdef CRITSECS_NEWTYPE | |
1323 { | |
1324 int i = critsecs_get_pos(c); | |
3128 | 1325 |
2579 | 1326 if (i < 0) |
1327 { | |
1328 printf("DeleteCriticalSection(%p) error (critsec not found)\n", c); | |
1329 return; | |
1330 } | |
3128 | 1331 |
2579 | 1332 critsecs_list[i].cs_win = NULL; |
2670 | 1333 expfree(critsecs_list[i].cs_unix); |
2579 | 1334 critsecs_list[i].cs_unix = NULL; |
1335 dbgprintf("DeleteCriticalSection -> itemno=%d\n", i); | |
1336 } | |
1337 #endif | |
1 | 1338 return; |
1339 } | |
1340 int WINAPI expGetCurrentThreadId() | |
1341 { | |
128 | 1342 dbgprintf("GetCurrentThreadId() => %d\n", getpid()); |
1343 return getpid(); | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1344 } |
128 | 1345 int WINAPI expGetCurrentProcess() |
1346 { | |
1347 dbgprintf("GetCurrentProcess() => %d\n", getpid()); | |
1 | 1348 return getpid(); |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1349 } |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1350 |
2779 | 1351 extern void* fs_seg; |
1352 | |
3128 | 1353 #if 0 |
1354 // this version is required for Quicktime codecs (.qtx/.qts) to work. | |
1355 // (they assume some pointers at FS: segment) | |
1356 | |
2779 | 1357 //static int tls_count; |
1358 static int tls_use_map[64]; | |
1359 int WINAPI expTlsAlloc() | |
1360 { | |
1361 int i; | |
1362 for(i=0; i<64; i++) | |
1363 if(tls_use_map[i]==0) | |
1364 { | |
1365 tls_use_map[i]=1; | |
1366 return i; | |
1367 } | |
1368 return -1; | |
1369 } | |
1370 | |
1371 int WINAPI expTlsSetValue(int index, void* value) | |
1372 { | |
1373 if((index<0) || (index>64)) | |
1374 return 0; | |
1375 *(void**)((char*)fs_seg+0x88+4*index) = value; | |
1376 return 1; | |
1377 } | |
1378 | |
1379 void* WINAPI expTlsGetValue(int index) | |
1380 { | |
1381 if((index<0) || (index>64)) | |
1382 return 0; | |
1383 return *(void**)((char*)fs_seg+0x88+index); | |
1384 } | |
1385 | |
1386 int WINAPI expTlsFree(int index) | |
1387 { | |
1388 if((index<0) || (index>64)) | |
1389 return 0; | |
1390 tls_use_map[index]=0; | |
1391 return 1; | |
1392 } | |
1393 | |
1394 #else | |
2069 | 1395 struct tls_s { |
1 | 1396 void* value; |
1397 int used; | |
1398 struct tls_s* prev; | |
1399 struct tls_s* next; | |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1400 }; |
2069 | 1401 |
1 | 1402 void* WINAPI expTlsAlloc() |
1403 { | |
1404 if(g_tls==NULL) | |
1405 { | |
1406 g_tls=my_mreq(sizeof(tls_t), 0); | |
1407 g_tls->next=g_tls->prev=NULL; | |
1408 } | |
1409 else | |
1410 { | |
1411 g_tls->next=my_mreq(sizeof(tls_t), 0); | |
1412 g_tls->next->prev=g_tls; | |
1413 g_tls->next->next=NULL; | |
1414 g_tls=g_tls->next; | |
1415 } | |
128 | 1416 dbgprintf("TlsAlloc() => 0x%x\n", g_tls); |
2670 | 1417 if (g_tls) |
1418 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
|
1419 return g_tls; |
1 | 1420 } |
1421 | |
1422 int WINAPI expTlsSetValue(tls_t* index, void* value) | |
1423 { | |
128 | 1424 int result; |
1 | 1425 if(index==0) |
128 | 1426 result=0; |
1427 else | |
1428 { | |
1429 index->value=value; | |
1430 result=1; | |
1431 } | |
1432 dbgprintf("TlsSetValue(index 0x%x, value 0x%x) => %d \n", index, value, result ); | |
1433 return result; | |
1 | 1434 } |
1435 void* WINAPI expTlsGetValue(tls_t* index) | |
1436 { | |
128 | 1437 void* result; |
1 | 1438 if(index==0) |
128 | 1439 result=0; |
1440 else | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1441 result=index->value; |
128 | 1442 dbgprintf("TlsGetValue(index 0x%x) => 0x%x\n", index, result); |
1443 return result; | |
1 | 1444 } |
1445 int WINAPI expTlsFree(tls_t* index) | |
1446 { | |
128 | 1447 int result; |
1 | 1448 if(index==0) |
128 | 1449 result=0; |
1450 else | |
1451 { | |
1452 if(index->next) | |
1453 index->next->prev=index->prev; | |
1454 if(index->prev) | |
1455 index->prev->next=index->next; | |
1456 my_release((void*)index); | |
1457 result=1; | |
1458 } | |
1459 dbgprintf("TlsFree(index 0x%x) => %d\n", index, result); | |
1460 return result; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1461 } |
2779 | 1462 #endif |
1463 | |
1 | 1464 void* WINAPI expLocalAlloc(int flags, int size) |
1465 { | |
1466 void* z; | |
1467 if(flags&GMEM_ZEROINIT) | |
1468 z=my_mreq(size, 1); | |
1469 else | |
1470 z=my_mreq(size, 0); | |
1471 if(z==0) | |
1472 printf("LocalAlloc() failed\n"); | |
128 | 1473 dbgprintf("LocalAlloc(%d, flags 0x%x) => 0x%x\n", size, flags, z); |
1 | 1474 return z; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1475 } |
2069 | 1476 |
1477 void* WINAPI expLocalReAlloc(int handle,int size, int flags) | |
1478 { | |
1479 void *newpointer; | |
1480 int oldsize; | |
1481 | |
1482 newpointer=NULL; | |
1483 if (flags & LMEM_MODIFY) { | |
1484 dbgprintf("LocalReAlloc MODIFY\n"); | |
1485 return (void *)handle; | |
1486 } | |
1487 oldsize = my_size((void *)handle); | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1488 newpointer = my_realloc((void *)handle,size); |
2069 | 1489 dbgprintf("LocalReAlloc(%x %d(old %d), flags 0x%x) => 0x%x\n", handle,size,oldsize, flags,newpointer); |
1490 | |
1491 return newpointer; | |
1492 } | |
1493 | |
1 | 1494 void* WINAPI expLocalLock(void* z) |
1495 { | |
128 | 1496 dbgprintf("LocalLock(0x%x) => 0x%x\n", z, z); |
1 | 1497 return z; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1498 } |
128 | 1499 |
1 | 1500 void* WINAPI expGlobalAlloc(int flags, int size) |
1501 { | |
1502 void* z; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1503 dbgprintf("GlobalAlloc(%d, flags 0x%X)\n", size, flags); |
1 | 1504 if(flags&GMEM_ZEROINIT) |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1505 z=my_mreq(size, 1); |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1506 //z=calloc(size, 1); |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1507 else |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1508 z=my_mreq(size, 0); |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1509 //z=malloc(size); |
1 | 1510 if(z==0) |
128 | 1511 printf("GlobalAlloc() failed\n"); |
1512 dbgprintf("GlobalAlloc(%d, flags 0x%x) => 0x%x\n", size, flags, z); | |
1 | 1513 return z; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1514 } |
1 | 1515 void* WINAPI expGlobalLock(void* z) |
1516 { | |
128 | 1517 dbgprintf("GlobalLock(0x%x) => 0x%x\n", z, z); |
1 | 1518 return z; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1519 } |
3128 | 1520 // pvmjpg20 - but doesn't work anyway |
1521 int WINAPI expGlobalSize(void* amem) | |
1522 { | |
1523 int size = 100000; | |
1524 #ifdef GARBAGE | |
1525 alloc_header* header = last_alloc; | |
1526 alloc_header* mem = (alloc_header*) amem - 1; | |
1527 if (amem == 0) | |
1528 return 0; | |
1529 pthread_mutex_lock(&memmut); | |
1530 while (header) | |
1531 { | |
1532 if (header->deadbeef != 0xdeadbeef) | |
1533 { | |
1534 printf("FATAL found corrupted memory! %p 0x%lx (%d)\n", header, header->deadbeef, alccnt); | |
1535 break; | |
1536 } | |
1537 | |
1538 if (header == mem) | |
1539 { | |
1540 size = header->size; | |
1541 break; | |
1542 } | |
1543 | |
1544 header = header->prev; | |
1545 } | |
1546 pthread_mutex_unlock(&memmut); | |
1547 #endif | |
1548 | |
1549 dbgprintf("GlobalSize(0x%x)\n", amem); | |
1550 return size; | |
1551 } | |
1 | 1552 int WINAPI expLoadStringA(long instance, long id, void* buf, long size) |
1553 { | |
128 | 1554 int result=LoadStringA(instance, id, buf, size); |
1555 // if(buf) | |
1556 dbgprintf("LoadStringA(instance 0x%x, id 0x%x, buffer 0x%x, size %d) => %d ( %s )\n", | |
1557 instance, id, buf, size, result, buf); | |
1558 // else | |
1559 // dbgprintf("LoadStringA(instance 0x%x, id 0x%x, buffer 0x%x, size %d) => %d\n", | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1560 // instance, id, buf, size, result); |
128 | 1561 return result; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1562 } |
1 | 1563 |
128 | 1564 long WINAPI expMultiByteToWideChar(long v1, long v2, char* s1, long siz1, short* s2, int siz2) |
1 | 1565 { |
1566 #warning FIXME | |
128 | 1567 int i; |
1568 int result; | |
1 | 1569 if(s2==0) |
128 | 1570 result=1; |
1571 else | |
1572 { | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1573 if(siz1>siz2/2)siz1=siz2/2; |
128 | 1574 for(i=1; i<=siz1; i++) |
1575 { | |
1576 *s2=*s1; | |
1577 if(!*s1)break; | |
1578 s2++; | |
1579 s1++; | |
1580 } | |
1581 result=i; | |
1582 } | |
1583 if(s1) | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1584 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
|
1585 "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
|
1586 v1, v2, s1, s1, siz1, s2, siz2, result); |
128 | 1587 else |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1588 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
|
1589 "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
|
1590 v1, v2, siz1, s2, siz2, result); |
128 | 1591 return result; |
1592 } | |
1593 static void wch_print(const short* str) | |
1594 { | |
1595 dbgprintf(" src: "); | |
1596 while(*str)dbgprintf("%c", *str++); | |
1597 dbgprintf("\n"); | |
1 | 1598 } |
1599 long WINAPI expWideCharToMultiByte(long v1, long v2, short* s1, long siz1, char* s2, int siz2, char* c3, int* siz3) | |
1600 { | |
1601 int result; | |
128 | 1602 dbgprintf("WideCharToMultiByte(codepage %d, flags 0x%x, src 0x%x, src size %d, " |
1603 "dest 0x%x, dest size %d, defch 0x%x, used_defch 0x%x)", v1, v2, s1, siz1, s2, siz2, c3, siz3); | |
1 | 1604 result=WideCharToMultiByte(v1, v2, s1, siz1, s2, siz2, c3, siz3); |
1605 dbgprintf("=> %d\n", result); | |
2069 | 1606 //if(s1)wch_print(s1); |
128 | 1607 if(s2)dbgprintf(" dest: %s\n", s2); |
1 | 1608 return result; |
1609 } | |
1610 long WINAPI expGetVersionExA(OSVERSIONINFOA* c) | |
1611 { | |
128 | 1612 dbgprintf("GetVersionExA(0x%x) => 1\n"); |
1613 c->dwOSVersionInfoSize=sizeof(*c); | |
1 | 1614 c->dwMajorVersion=4; |
128 | 1615 c->dwMinorVersion=0; |
1616 c->dwBuildNumber=0x4000457; | |
2069 | 1617 #if 0 |
1618 // leave it here for testing win9x-only codecs | |
1 | 1619 c->dwPlatformId=VER_PLATFORM_WIN32_WINDOWS; |
128 | 1620 strcpy(c->szCSDVersion, " B"); |
2069 | 1621 #else |
1622 c->dwPlatformId=VER_PLATFORM_WIN32_NT; // let's not make DLL assume that it can read CR* registers | |
1623 strcpy(c->szCSDVersion, "Service Pack 3"); | |
1624 #endif | |
128 | 1625 dbgprintf(" Major version: 4\n Minor version: 0\n Build number: 0x4000457\n" |
2069 | 1626 " Platform Id: VER_PLATFORM_WIN32_NT\n Version string: 'Service Pack 3'\n"); |
1 | 1627 return 1; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1628 } |
1 | 1629 HANDLE WINAPI expCreateSemaphoreA(char* v1, long init_count, long max_count, char* name) |
1630 { | |
128 | 1631 pthread_mutex_t *pm; |
1632 pthread_cond_t *pc; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1633 mutex_list* pp; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1634 /* |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1635 printf("CreateSemaphoreA(%p = %s)\n", name, (name ? name : "<null>")); |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1636 pp=mlist; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1637 while(pp) |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1638 { |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1639 printf("%p => ", pp); |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1640 pp=pp->prev; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1641 } |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1642 printf("0\n"); |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1643 */ |
128 | 1644 if(mlist!=NULL) |
1 | 1645 { |
128 | 1646 mutex_list* pp=mlist; |
1647 if(name!=NULL) | |
1648 do | |
1649 { | |
1650 if((strcmp(pp->name, name)==0) && (pp->type==1)) | |
1651 { | |
1652 dbgprintf("CreateSemaphoreA(0x%x, init_count %d, max_count %d, name 0x%x='%s') => 0x%x", | |
1653 v1, init_count, max_count, name, name, mlist); | |
1654 return (HANDLE)mlist; | |
1655 } | |
2069 | 1656 }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
|
1657 } |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1658 pm=mreq_private(sizeof(pthread_mutex_t), 0, AREATYPE_MUTEX); |
128 | 1659 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
|
1660 pc=mreq_private(sizeof(pthread_cond_t), 0, AREATYPE_COND); |
128 | 1661 pthread_cond_init(pc, NULL); |
1662 if(mlist==NULL) | |
1663 { | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1664 mlist=mreq_private(sizeof(mutex_list), 00, AREATYPE_EVENT); |
128 | 1665 mlist->next=mlist->prev=NULL; |
1666 } | |
1667 else | |
1 | 1668 { |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1669 mlist->next=mreq_private(sizeof(mutex_list), 00, AREATYPE_EVENT); |
128 | 1670 mlist->next->prev=mlist; |
1671 mlist->next->next=NULL; | |
1672 mlist=mlist->next; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1673 // printf("new semaphore %p\n", mlist); |
1 | 1674 } |
128 | 1675 mlist->type=1; /* Type Semaphore */ |
1676 mlist->pm=pm; | |
1677 mlist->pc=pc; | |
1678 mlist->state=0; | |
1679 mlist->reset=0; | |
1680 mlist->semaphore=init_count; | |
1681 if(name!=NULL) | |
1682 strncpy(mlist->name, name, 64); | |
1683 else | |
1684 mlist->name[0]=0; | |
1685 if(pm==NULL) | |
1686 dbgprintf("ERROR::: CreateSemaphoreA failure\n"); | |
1687 if(name) | |
1688 dbgprintf("CreateSemaphoreA(0x%x, init_count %d, max_count %d, name 0x%x='%s') => 0x%x", | |
1689 v1, init_count, max_count, name, name, mlist); | |
1690 else | |
1691 dbgprintf("CreateSemaphoreA(0x%x, init_count %d, max_count %d, name 0) => 0x%x", | |
1692 v1, init_count, max_count, mlist); | |
1693 return (HANDLE)mlist; | |
1 | 1694 } |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1695 |
1 | 1696 long WINAPI expReleaseSemaphore(long hsem, long increment, long* prev_count) |
1697 { | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1698 // The state of a semaphore object is signaled when its count |
1 | 1699 // is greater than zero and nonsignaled when its count is equal to zero |
1700 // Each time a waiting thread is released because of the semaphore's signaled | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1701 // state, the count of the semaphore is decreased by one. |
128 | 1702 mutex_list *ml = (mutex_list *)hsem; |
1 | 1703 |
128 | 1704 pthread_mutex_lock(ml->pm); |
1705 if (prev_count != 0) *prev_count = ml->semaphore; | |
1706 if (ml->semaphore == 0) pthread_cond_signal(ml->pc); | |
1707 ml->semaphore += increment; | |
1708 pthread_mutex_unlock(ml->pm); | |
1709 dbgprintf("ReleaseSemaphore(semaphore 0x%x, increment %d, prev_count 0x%x) => 1\n", | |
1710 hsem, increment, prev_count); | |
1711 return 1; | |
1 | 1712 } |
1713 | |
1714 | |
1715 long WINAPI expRegOpenKeyExA(long key, const char* subkey, long reserved, long access, int* newkey) | |
1716 { | |
128 | 1717 long result=RegOpenKeyExA(key, subkey, reserved, access, newkey); |
1718 dbgprintf("RegOpenKeyExA(key 0x%x, subkey %s, reserved %d, access 0x%x, pnewkey 0x%x) => %d\n", | |
1719 key, subkey, reserved, access, newkey, result); | |
1720 if(newkey)dbgprintf(" New key: 0x%x\n", *newkey); | |
1721 return result; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1722 } |
1 | 1723 long WINAPI expRegCloseKey(long key) |
1724 { | |
128 | 1725 long result=RegCloseKey(key); |
1726 dbgprintf("RegCloseKey(0x%x) => %d\n", key, result); | |
1727 return result; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1728 } |
1 | 1729 long WINAPI expRegQueryValueExA(long key, const char* value, int* reserved, int* type, int* data, int* count) |
1730 { | |
128 | 1731 long result=RegQueryValueExA(key, value, reserved, type, data, count); |
1732 dbgprintf("RegQueryValueExA(key 0x%x, value %s, reserved 0x%x, data 0x%x, count 0x%x)" | |
1733 " => 0x%x\n", key, value, reserved, data, count, result); | |
1734 if(data && count)dbgprintf(" read %d bytes: '%s'\n", *count, data); | |
1735 return result; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1736 } |
1 | 1737 long WINAPI expRegCreateKeyExA(long key, const char* name, long reserved, |
1738 void* classs, long options, long security, | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1739 void* sec_attr, int* newkey, int* status) |
1 | 1740 { |
128 | 1741 long result=RegCreateKeyExA(key, name, reserved, classs, options, security, sec_attr, newkey, status); |
1742 dbgprintf("RegCreateKeyExA(key 0x%x, name 0x%x='%s', reserved=0x%x," | |
1743 " 0x%x, 0x%x, 0x%x, newkey=0x%x, status=0x%x) => %d\n", | |
1744 key, name, name, reserved, classs, options, security, sec_attr, newkey, status, result); | |
1745 if(!result && newkey) dbgprintf(" New key: 0x%x\n", *newkey); | |
1746 if(!result && status) dbgprintf(" New key status: 0x%x\n", *status); | |
1747 return result; | |
1 | 1748 } |
1749 long WINAPI expRegSetValueExA(long key, const char* name, long v1, long v2, void* data, long size) | |
1750 { | |
128 | 1751 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
|
1752 dbgprintf("RegSetValueExA(key 0x%x, name '%s', 0x%x, 0x%x, data 0x%x -> 0x%x '%s', size=%d) => %d", |
128 | 1753 key, name, v1, v2, data, *(int*)data, data, size, result); |
1754 return result; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1755 } |
1 | 1756 |
3134 | 1757 long WINAPI expRegOpenKeyA (long hKey, LPCSTR lpSubKey, int* phkResult) |
1758 { | |
128 | 1759 long result=RegOpenKeyExA(hKey, lpSubKey, 0, 0, phkResult); |
1760 dbgprintf("RegOpenKeyExA(key 0x%x, subkey '%s', 0x%x) => %d\n", | |
1761 hKey, lpSubKey, phkResult, result); | |
1762 if(!result && phkResult) dbgprintf(" New key: 0x%x\n", *phkResult); | |
1763 return result; | |
1 | 1764 } |
1765 | |
2069 | 1766 DWORD WINAPI expRegEnumValueA(HKEY hkey, DWORD index, LPSTR value, LPDWORD val_count, |
1767 LPDWORD reserved, LPDWORD type, LPBYTE data, LPDWORD count) | |
1768 { | |
1769 return RegEnumValueA(hkey, index, value, val_count, | |
1770 reserved, type, data, count); | |
1771 } | |
1772 | |
1 | 1773 long WINAPI expQueryPerformanceCounter(long long* z) |
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 |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1815 static double |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1816 solaris_kstat_freq() |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1817 { |
1679
73c8f54305b1
Add a few ifdefs, so that the code compiles on old solaris releases (2.6 and 7)
jkeil
parents:
1543
diff
changeset
|
1818 #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
|
1819 /* |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1820 * 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
|
1821 */ |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1822 kstat_ctl_t *kc; |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1823 kstat_t *ksp; |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1824 kstat_named_t *kdata; |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1825 int mhz = 0; |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1826 |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1827 kc = kstat_open(); |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1828 if (kc != NULL) |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1829 { |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1830 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
|
1831 |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1832 /* 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
|
1833 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
|
1834 { |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1835 /* 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
|
1836 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
|
1837 { |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1838 /* |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1839 * 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
|
1840 * data type |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1841 */ |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1842 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
|
1843 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
|
1844 mhz = kdata->value.i32; |
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 } |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1847 kstat_close(kc); |
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 |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1850 if (mhz > 0) |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1851 return mhz * 1000.; |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1852 #endif /* HAVE_LIBKSTAT */ |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1853 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
|
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 /* |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1857 * 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
|
1858 */ |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1859 static double tsc_freq() |
1 | 1860 { |
128 | 1861 static double ofreq=0.0; |
1862 int i; | |
1 | 1863 int x,y; |
128 | 1864 i=time(NULL); |
1865 if (ofreq != 0.0) return ofreq; | |
1 | 1866 while(i==time(NULL)); |
1867 x=localcount(); | |
1868 i++; | |
1869 while(i==time(NULL)); | |
1870 y=localcount(); | |
128 | 1871 ofreq = (double)(y-x)/1000.; |
1872 return ofreq; | |
1 | 1873 } |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1874 |
1 | 1875 static double CPU_Freq() |
1876 { | |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1877 double freq; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1878 |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1879 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
|
1880 return freq; |
1 | 1881 |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1882 if ((freq = solaris_kstat_freq()) > 0) |
1 | 1883 return freq; |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1884 |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1885 return tsc_freq(); |
1 | 1886 } |
1887 | |
1888 long WINAPI expQueryPerformanceFrequency(long long* z) | |
1889 { | |
1890 *z=(long long)CPU_Freq(); | |
128 | 1891 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
|
1892 return 1; |
1 | 1893 } |
1894 long WINAPI exptimeGetTime() | |
1895 { | |
1896 struct timeval t; | |
128 | 1897 long result; |
1 | 1898 gettimeofday(&t, 0); |
128 | 1899 result=1000*t.tv_sec+t.tv_usec/1000; |
1900 dbgprintf("timeGetTime() => %d\n", result); | |
1901 return result; | |
1 | 1902 } |
1903 void* WINAPI expLocalHandle(void* v) | |
1904 { | |
128 | 1905 dbgprintf("LocalHandle(0x%x) => 0x%x\n", v, v); |
1 | 1906 return v; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1907 } |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1908 |
1 | 1909 void* WINAPI expGlobalHandle(void* v) |
1910 { | |
128 | 1911 dbgprintf("GlobalHandle(0x%x) => 0x%x\n", v, v); |
1 | 1912 return v; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1913 } |
1 | 1914 int WINAPI expGlobalUnlock(void* v) |
1915 { | |
128 | 1916 dbgprintf("GlobalUnlock(0x%x) => 1\n", v); |
1 | 1917 return 1; |
1918 } | |
1919 void* WINAPI expGlobalFree(void* v) | |
1920 { | |
128 | 1921 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
|
1922 my_release(v); |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1923 //free(v); |
1 | 1924 return 0; |
128 | 1925 } |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1926 |
128 | 1927 void* WINAPI expGlobalReAlloc(void* v, int size, int flags) |
1928 { | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1929 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
|
1930 //void* result=realloc(v, size); |
128 | 1931 dbgprintf("GlobalReAlloc(0x%x, size %d, flags 0x%x) => 0x%x\n", v,size,flags,result); |
1932 return result; | |
1933 } | |
1 | 1934 |
1935 int WINAPI expLocalUnlock(void* v) | |
1936 { | |
128 | 1937 dbgprintf("LocalUnlock(0x%x) => 1\n", v); |
1 | 1938 return 1; |
1939 } | |
128 | 1940 // |
1 | 1941 void* WINAPI expLocalFree(void* v) |
1942 { | |
128 | 1943 dbgprintf("LocalFree(0x%x) => 0\n", v); |
1 | 1944 my_release(v); |
1945 return 0; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1946 } |
1 | 1947 HRSRC WINAPI expFindResourceA(HMODULE module, char* name, char* type) |
1948 { | |
128 | 1949 HRSRC result=FindResourceA(module, name, type); |
1950 dbgprintf("FindResourceA(module 0x%x, name 0x%x, type 0x%x) => 0x%x\n", module, name, type, result); | |
1951 return result; | |
1 | 1952 } |
128 | 1953 extern HRSRC WINAPI LoadResource(HMODULE, HRSRC); |
1 | 1954 HGLOBAL WINAPI expLoadResource(HMODULE module, HRSRC res) |
1955 { | |
128 | 1956 HGLOBAL result=LoadResource(module, res); |
1957 dbgprintf("LoadResource(module 0x%x, resource 0x%x) => 0x%x\n", module, res, result); | |
1958 return result; | |
1 | 1959 } |
1960 void* WINAPI expLockResource(long res) | |
1961 { | |
128 | 1962 void* result=LockResource(res); |
1963 dbgprintf("LockResource(0x%x) => 0x%x\n", res, result); | |
1964 return result; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1965 } |
1 | 1966 int WINAPI expFreeResource(long res) |
1967 { | |
128 | 1968 int result=FreeResource(res); |
1969 dbgprintf("FreeResource(0x%x) => %d\n", res, result); | |
1970 return result; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1971 } |
1 | 1972 //bool fun(HANDLE) |
1973 //!0 on success | |
1974 int WINAPI expCloseHandle(long v1) | |
1975 { | |
128 | 1976 dbgprintf("CloseHandle(0x%x) => 1\n", v1); |
1 | 1977 return 1; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1978 } |
1 | 1979 |
1980 const char* WINAPI expGetCommandLineA() | |
1981 { | |
128 | 1982 dbgprintf("GetCommandLineA() => \"c:\\aviplay.exe\"\n"); |
1 | 1983 return "c:\\aviplay.exe"; |
1984 } | |
128 | 1985 static short envs[]={'p', 'a', 't', 'h', ' ', 'c', ':', '\\', 0, 0}; |
1 | 1986 LPWSTR WINAPI expGetEnvironmentStringsW() |
1987 { | |
128 | 1988 dbgprintf("GetEnvironmentStringsW() => 0\n", envs); |
1989 return 0; | |
1 | 1990 } |
121 | 1991 void * WINAPI expRtlZeroMemory(void *p, size_t len) |
1992 { | |
1993 void* result=memset(p,0,len); | |
1994 dbgprintf("RtlZeroMemory(0x%x, len %d) => 0x%x\n",p,len,result); | |
1995 return result; | |
1996 } | |
1997 void * WINAPI expRtlMoveMemory(void *dst, void *src, size_t len) | |
1998 { | |
1999 void* result=memmove(dst,src,len); | |
2000 dbgprintf("RtlMoveMemory (dest 0x%x, src 0x%x, len %d) => 0x%x\n",dst,src,len,result); | |
2001 return result; | |
2002 } | |
2003 | |
2004 void * WINAPI expRtlFillMemory(void *p, int ch, size_t len) | |
2005 { | |
2006 void* result=memset(p,ch,len); | |
2007 dbgprintf("RtlFillMemory(0x%x, char 0x%x, len %d) => 0x%x\n",p,ch,len,result); | |
2008 return result; | |
2009 } | |
1 | 2010 int WINAPI expFreeEnvironmentStringsW(short* strings) |
2011 { | |
128 | 2012 dbgprintf("FreeEnvironmentStringsW(0x%x) => 1\n", strings); |
1 | 2013 return 1; |
2014 } | |
128 | 2015 int WINAPI expFreeEnvironmentStringsA(char* strings) |
2016 { | |
2017 dbgprintf("FreeEnvironmentStringsA(0x%x) => 1\n", strings); | |
2018 return 1; | |
2019 } | |
2020 static const char ch_envs[]= | |
2021 "__MSVCRT_HEAP_SELECT=__GLOBAL_HEAP_SELECTED,1\r\n" | |
2022 "PATH=C:\\;C:\\windows\\;C:\\windows\\system\r\n"; | |
1 | 2023 LPCSTR WINAPI expGetEnvironmentStrings() |
2024 { | |
128 | 2025 dbgprintf("GetEnvironmentStrings() => 0x%x\n", ch_envs); |
2026 return (LPCSTR)ch_envs; | |
2027 // dbgprintf("GetEnvironmentStrings() => 0\n"); | |
2028 // return 0; | |
1 | 2029 } |
2030 | |
2031 int WINAPI expGetStartupInfoA(STARTUPINFOA *s) | |
2032 { | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2033 int i; |
128 | 2034 dbgprintf("GetStartupInfoA(0x%x) => 1\n"); |
1 | 2035 memset(s, 0, sizeof(*s)); |
2036 s->cb=sizeof(*s); | |
128 | 2037 // s->lpReserved="Reserved"; |
2038 // s->lpDesktop="Desktop"; | |
2039 // s->lpTitle="Title"; | |
2040 // s->dwX=s->dwY=0; | |
2041 // s->dwXSize=s->dwYSize=200; | |
2042 s->dwFlags=s->wShowWindow=1; | |
2043 // s->hStdInput=s->hStdOutput=s->hStdError=0x1234; | |
2044 dbgprintf(" cb=%d\n", s->cb); | |
2045 dbgprintf(" lpReserved='%s'\n", s->lpReserved); | |
2046 dbgprintf(" lpDesktop='%s'\n", s->lpDesktop); | |
2047 dbgprintf(" lpTitle='%s'\n", s->lpTitle); | |
2048 dbgprintf(" dwX=%d dwY=%d dwXSize=%d dwYSize=%d\n", | |
2049 s->dwX, s->dwY, s->dwXSize, s->dwYSize); | |
2050 dbgprintf(" dwXCountChars=%d dwYCountChars=%d dwFillAttribute=%d\n", | |
2051 s->dwXCountChars, s->dwYCountChars, s->dwFillAttribute); | |
2052 dbgprintf(" dwFlags=0x%x wShowWindow=0x%x cbReserved2=0x%x\n", | |
2053 s->dwFlags, s->wShowWindow, s->cbReserved2); | |
2054 dbgprintf(" lpReserved2=0x%x hStdInput=0x%x hStdOutput=0x%x hStdError=0x%x\n", | |
2055 s->lpReserved2, s->hStdInput, s->hStdOutput, s->hStdError); | |
1 | 2056 return 1; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2057 } |
1 | 2058 |
2059 int WINAPI expGetStdHandle(int z) | |
2060 { | |
128 | 2061 dbgprintf("GetStdHandle(0x%x) => 0x%x\n", z+0x1234); |
2062 return z+0x1234; | |
1 | 2063 } |
2064 int WINAPI expGetFileType(int handle) | |
2065 { | |
128 | 2066 dbgprintf("GetFileType(0x%x) => 0x3 = pipe\n", handle); |
2067 return 0x3; | |
1 | 2068 } |
2069 int WINAPI expSetHandleCount(int count) | |
2070 { | |
128 | 2071 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
|
2072 return 1; |
1 | 2073 } |
2074 int WINAPI expGetACP() | |
2075 { | |
128 | 2076 dbgprintf("GetACP() => 0\n"); |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2077 return 0; |
1 | 2078 } |
2079 extern WINE_MODREF *MODULE32_LookupHMODULE(HMODULE m); | |
2080 int WINAPI expGetModuleFileNameA(int module, char* s, int len) | |
2081 { | |
2082 WINE_MODREF *mr; | |
128 | 2083 int result; |
1 | 2084 // printf("File name of module %X requested\n", module); |
2085 if(s==0) | |
128 | 2086 result=0; |
2087 else | |
1 | 2088 if(len<35) |
128 | 2089 result=0; |
2090 else | |
1 | 2091 { |
128 | 2092 result=1; |
2093 strcpy(s, "c:\\windows\\system\\"); | |
2094 mr=MODULE32_LookupHMODULE(module); | |
2095 if(mr==0)//oops | |
2096 strcat(s, "aviplay.dll"); | |
2097 else | |
2098 if(strrchr(mr->filename, '/')==NULL) | |
2099 strcat(s, mr->filename); | |
2100 else | |
2101 strcat(s, strrchr(mr->filename, '/')+1); | |
2102 } | |
2103 if(!s) | |
2104 dbgprintf("GetModuleFileNameA(0x%x, 0x%x, %d) => %d\n", | |
2105 module, s, len, result); | |
1 | 2106 else |
128 | 2107 dbgprintf("GetModuleFileNameA(0x%x, 0x%x, %d) => %d ( '%s' )", |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2108 module, s, len, result, s); |
128 | 2109 return result; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2110 } |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2111 |
1 | 2112 int WINAPI expSetUnhandledExceptionFilter(void* filter) |
2113 { | |
128 | 2114 dbgprintf("SetUnhandledExceptionFilter(0x%x) => 1\n", filter); |
1 | 2115 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
|
2116 } |
2069 | 2117 |
1 | 2118 int WINAPI expLoadLibraryA(char* name) |
2119 { | |
2069 | 2120 int result = 0; |
713 | 2121 char* lastbc; |
2069 | 2122 int i; |
713 | 2123 if (!name) |
2124 return -1; | |
2125 // we skip to the last backslash | |
2126 // this is effectively eliminating weird characters in | |
2127 // the text output windows | |
2069 | 2128 |
713 | 2129 lastbc = strrchr(name, '\\'); |
2130 if (lastbc) | |
2131 { | |
2132 int i; | |
2133 lastbc++; | |
2134 for (i = 0; 1 ;i++) | |
2135 { | |
2136 name[i] = *lastbc++; | |
2137 if (!name[i]) | |
2138 break; | |
2139 } | |
2140 } | |
2069 | 2141 if(strncmp(name, "c:\\windows\\", 11)==0) name += 11; |
1416 | 2142 if(strncmp(name, ".\\", 2)==0) name += 2; |
2069 | 2143 |
2144 dbgprintf("Entering LoadLibraryA(%s)\n", name); | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2145 // PIMJ is loading kernel32.dll |
3128 | 2146 if (strcasecmp(name, "kernel32.dll") == 0) |
2147 return MODULE_HANDLE_kernel32; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2148 |
2069 | 2149 result=LoadLibraryA(name); |
2150 dbgprintf("Returned LoadLibraryA(0x%x='%s'), def_path=%s => 0x%x\n", name, name, def_path, result); | |
2151 | |
128 | 2152 return result; |
2069 | 2153 } |
1 | 2154 int WINAPI expFreeLibrary(int module) |
2155 { | |
128 | 2156 int result=FreeLibrary(module); |
2157 dbgprintf("FreeLibrary(0x%x) => %d\n", module, result); | |
2158 return result; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2159 } |
1 | 2160 void* WINAPI expGetProcAddress(HMODULE mod, char* name) |
2161 { | |
2069 | 2162 void* result; |
2163 if(mod!=MODULE_HANDLE_kernel32) | |
128 | 2164 result=GetProcAddress(mod, name); |
2165 else | |
2166 result=LookupExternalByName("kernel32.dll", name); | |
2167 dbgprintf("GetProcAddress(0x%x, '%s') => 0x%x\n", mod, name, result); | |
2168 return result; | |
2069 | 2169 } |
1 | 2170 |
2171 long WINAPI expCreateFileMappingA(int hFile, void* lpAttr, | |
2172 long flProtect, long dwMaxHigh, long dwMaxLow, const char* name) | |
2173 { | |
128 | 2174 long result=CreateFileMappingA(hFile, lpAttr, flProtect, dwMaxHigh, dwMaxLow, name); |
2175 if(!name) | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2176 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
|
2177 "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
|
2178 hFile, lpAttr, flProtect, dwMaxHigh, dwMaxLow, result); |
128 | 2179 else |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2180 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
|
2181 "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
|
2182 hFile, lpAttr, flProtect, dwMaxHigh, dwMaxLow, name, name, result); |
128 | 2183 return result; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2184 } |
1 | 2185 |
2186 long WINAPI expOpenFileMappingA(long hFile, long hz, const char* name) | |
2187 { | |
128 | 2188 long result=OpenFileMappingA(hFile, hz, name); |
2189 if(!name) | |
2190 dbgprintf("OpenFileMappingA(0x%x, 0x%x, 0) => %d\n", | |
2191 hFile, hz, result); | |
2192 else | |
2193 dbgprintf("OpenFileMappingA(0x%x, 0x%x, 0x%x='%s') => %d\n", | |
2194 hFile, hz, name, name, result); | |
2195 return result; | |
1 | 2196 } |
2197 | |
2198 void* WINAPI expMapViewOfFile(HANDLE file, DWORD mode, DWORD offHigh, DWORD offLow, DWORD size) | |
2199 { | |
128 | 2200 dbgprintf("MapViewOfFile(0x%x, 0x%x, 0x%x, 0x%x, size %d) => 0x%x\n", |
2201 file,mode,offHigh,offLow,size,(char*)file+offLow); | |
1 | 2202 return (char*)file+offLow; |
2203 } | |
2204 | |
2205 void* WINAPI expUnmapViewOfFile(void* view) | |
2206 { | |
128 | 2207 dbgprintf("UnmapViewOfFile(0x%x) => 0\n", view); |
1 | 2208 return 0; |
2209 } | |
2210 | |
2211 void* WINAPI expSleep(int time) | |
2212 { | |
2069 | 2213 // extern int avm_usleep(int); |
128 | 2214 dbgprintf("Sleep(%d) => 0\n", time); |
2069 | 2215 // avm_usleep(time); |
1 | 2216 usleep(time); |
2217 return 0; | |
2218 } | |
2219 // why does IV32 codec want to call this? I don't know ... | |
2220 void* WINAPI expCreateCompatibleDC(int hdc) | |
2221 { | |
128 | 2222 dbgprintf("CreateCompatibleDC(%d) => 0x81\n", hdc); |
2223 return (void*)0x81; | |
1 | 2224 } |
2225 | |
2226 int WINAPI expGetDeviceCaps(int hdc, int unk) | |
2227 { | |
128 | 2228 dbgprintf("GetDeviceCaps(0x%x, %d) => 0\n", hdc, unk); |
1 | 2229 return 0; |
2230 } | |
2231 | |
2232 WIN_BOOL WINAPI expDeleteDC(int hdc) | |
2233 { | |
128 | 2234 dbgprintf("DeleteDC(0x%x) => 0\n", hdc); |
1 | 2235 return 0; |
2236 } | |
2237 | |
3128 | 2238 // btvvc32.drv wants this one |
2239 void* WINAPI expGetWindowDC(int hdc) | |
2240 { | |
2241 dbgprintf("GetWindowDC(%d) => 0x81\n", hdc); | |
2242 return (void*)0x81; | |
2243 } | |
2244 | |
2245 void* WINAPI expCreateFontA(void) | |
2246 { | |
2247 return 0; | |
2248 } | |
2249 | |
1 | 2250 int expwsprintfA(char* string, char* format, ...) |
2251 { | |
2252 va_list va; | |
128 | 2253 int result; |
1 | 2254 va_start(va, format); |
128 | 2255 result=vsprintf(string, format, va); |
2256 dbgprintf("wsprintfA(0x%x, '%s', ...) => %d\n", string, format, result); | |
2257 va_end(va); | |
2258 return result; | |
1 | 2259 } |
2260 | |
2261 int WINAPI expGetPrivateProfileIntA(const char* appname, const char* keyname, int default_value, const char* filename) | |
2262 { | |
2263 int size=255; | |
2264 char buffer[256]; | |
2265 char* fullname; | |
2266 int result; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2267 |
1 | 2268 buffer[255]=0; |
128 | 2269 if(!(appname && keyname && filename) ) |
2270 { | |
2271 dbgprintf("GetPrivateProfileIntA('%s', '%s', %d, '%s') => %d\n", appname, keyname, default_value, filename, default_value ); | |
2272 return default_value; | |
2273 } | |
1 | 2274 fullname=(char*)malloc(50+strlen(appname)+strlen(keyname)+strlen(filename)); |
2275 strcpy(fullname, "Software\\IniFileMapping\\"); | |
2276 strcat(fullname, appname); | |
2277 strcat(fullname, "\\"); | |
2278 strcat(fullname, keyname); | |
2279 strcat(fullname, "\\"); | |
2280 strcat(fullname, filename); | |
2281 result=RegQueryValueExA(HKEY_LOCAL_MACHINE, fullname, NULL, NULL, (int*)buffer, &size); | |
2282 if((size>=0)&&(size<256)) | |
2283 buffer[size]=0; | |
2284 // 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
|
2285 free(fullname); |
1 | 2286 if(result) |
128 | 2287 result=default_value; |
1 | 2288 else |
128 | 2289 result=atoi(buffer); |
2290 dbgprintf("GetPrivateProfileIntA('%s', '%s', %d, '%s') => %d\n", appname, keyname, default_value, filename, result); | |
2291 return result; | |
1 | 2292 } |
128 | 2293 int WINAPI expGetProfileIntA(const char* appname, const char* keyname, int default_value) |
2294 { | |
2295 dbgprintf("GetProfileIntA -> "); | |
2296 // dbgprintf("GetProfileIntA(%s, %s, %d)\n", appname, keyname, default_value); | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2297 return expGetPrivateProfileIntA(appname, keyname, default_value, "default"); |
128 | 2298 } |
2299 | |
1 | 2300 int WINAPI expGetPrivateProfileStringA(const char* appname, const char* keyname, |
2301 const char* def_val, char* dest, unsigned int len, const char* filename) | |
2302 { | |
2303 int result; | |
2304 int size; | |
2305 char* fullname; | |
128 | 2306 dbgprintf("GetPrivateProfileStringA('%s', '%s', def_val '%s', 0x%x, 0x%x, '%s')", appname, keyname, def_val, dest, len, filename ); |
1 | 2307 if(!(appname && keyname && filename) ) return 0; |
2308 fullname=(char*)malloc(50+strlen(appname)+strlen(keyname)+strlen(filename)); | |
2309 strcpy(fullname, "Software\\IniFileMapping\\"); | |
2310 strcat(fullname, appname); | |
2311 strcat(fullname, "\\"); | |
2312 strcat(fullname, keyname); | |
2313 strcat(fullname, "\\"); | |
2314 strcat(fullname, filename); | |
2315 size=len; | |
2316 result=RegQueryValueExA(HKEY_LOCAL_MACHINE, fullname, NULL, NULL, (int*)dest, &size); | |
2317 // printf("GetPrivateProfileStringA(%s, %s, %s, %X, %X, %s)\n", appname, keyname, def_val, dest, len, filename ); | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2318 free(fullname); |
128 | 2319 if(result) |
2320 { | |
2321 strncpy(dest, def_val, size); | |
2322 if (strlen(def_val)< size) size = strlen(def_val); | |
2323 } | |
2324 dbgprintf(" => %d ( '%s' )\n", size, dest); | |
1 | 2325 return size; |
2326 } | |
2327 int WINAPI expWritePrivateProfileStringA(const char* appname, const char* keyname, | |
2328 const char* string, const char* filename) | |
2329 { | |
2330 int size=256; | |
2331 char* fullname; | |
128 | 2332 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
|
2333 if(!(appname && keyname && filename) ) |
128 | 2334 { |
2335 dbgprintf(" => -1\n"); | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2336 return -1; |
128 | 2337 } |
1 | 2338 fullname=(char*)malloc(50+strlen(appname)+strlen(keyname)+strlen(filename)); |
2339 strcpy(fullname, "Software\\IniFileMapping\\"); | |
2340 strcat(fullname, appname); | |
2341 strcat(fullname, "\\"); | |
2342 strcat(fullname, keyname); | |
2343 strcat(fullname, "\\"); | |
2344 strcat(fullname, filename); | |
2345 RegSetValueExA(HKEY_LOCAL_MACHINE, fullname, 0, REG_SZ, (int*)string, strlen(string)); | |
2346 // printf("RegSetValueExA(%s,%d)\n", string, strlen(string)); | |
2347 // 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
|
2348 free(fullname); |
128 | 2349 dbgprintf(" => 0\n"); |
1 | 2350 return 0; |
2351 } | |
2139 | 2352 int expsprintf(char* str, const char* format, ...) |
2353 { | |
2354 va_list args; | |
2355 int r; | |
2356 dbgprintf("sprintf(%s, %s)\n", str, format); | |
2357 va_start(args, format); | |
2358 r = vsprintf(str, format, args); | |
2359 va_end(args); | |
2360 return r; | |
2361 } | |
2362 int expsscanf(const char* str, const char* format, ...) | |
2363 { | |
2364 va_list args; | |
2365 int r; | |
2366 dbgprintf("sscanf(%s, %s)\n", str, format); | |
2367 va_start(args, format); | |
2368 r = vsscanf(str, format, args); | |
2369 va_end(args); | |
2370 return r; | |
2371 } | |
2372 void* expfopen(const char* path, const char* mode) | |
2373 { | |
2374 printf("fopen: \"%s\" mode:%s\n", path, mode); | |
2375 //return fopen(path, mode); | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2376 return fdopen(0, mode); // everything on screen |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2377 } |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2378 int expfprintf(void* stream, const char* format, ...) |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2379 { |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2380 va_list args; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2381 int r = 0; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2382 #if 1 |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2383 va_start(args, format); |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2384 r = vfprintf((FILE*) stream, format, args); |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2385 va_end(args); |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2386 #endif |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2387 return r; |
2139 | 2388 } |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2389 |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2390 int expprintf(const char* format, ...) |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2391 { |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2392 va_list args; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2393 int r; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2394 va_start(args, format); |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2395 r = vprintf(format, args); |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2396 va_end(args); |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2397 return r; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2398 } |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2399 |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2400 void* expwcscpy(WCHAR* dst, const WCHAR* src) |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2401 { |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2402 WCHAR* p = dst; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2403 while ((*p++ = *src++)) |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2404 ; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2405 return dst; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2406 } |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2407 |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2408 |
1 | 2409 unsigned int _GetPrivateProfileIntA(const char* appname, const char* keyname, INT default_value, const char* filename) |
2410 { | |
2411 return expGetPrivateProfileIntA(appname, keyname, default_value, filename); | |
2412 } | |
2413 int _GetPrivateProfileStringA(const char* appname, const char* keyname, | |
2414 const char* def_val, char* dest, unsigned int len, const char* filename) | |
2415 { | |
2416 return expGetPrivateProfileStringA(appname, keyname, def_val, dest, len, filename); | |
2417 } | |
2418 int _WritePrivateProfileStringA(const char* appname, const char* keyname, | |
2419 const char* string, const char* filename) | |
2420 { | |
2421 return expWritePrivateProfileStringA(appname, keyname, string, filename); | |
2422 } | |
2423 | |
2424 | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2425 |
1 | 2426 int WINAPI expDefDriverProc(int _private, int id, int msg, int arg1, int arg2) |
2427 { | |
128 | 2428 dbgprintf("DefDriverProc(0x%x, 0x%x, 0x%x, 0x%x, 0x%x) => 0\n", _private, id, msg, arg1, arg2); |
1 | 2429 return 0; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2430 } |
1 | 2431 |
2432 int WINAPI expSizeofResource(int v1, int v2) | |
2433 { | |
128 | 2434 int result=SizeofResource(v1, v2); |
2435 dbgprintf("SizeofResource(0x%x, 0x%x) => %d\n", v1, v2, result); | |
2436 return result; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2437 } |
1 | 2438 |
2439 int WINAPI expGetLastError() | |
2440 { | |
128 | 2441 int result=GetLastError(); |
2442 dbgprintf("GetLastError() => 0x%x\n", result); | |
2443 return result; | |
1 | 2444 } |
2445 | |
2446 void WINAPI expSetLastError(int error) | |
2447 { | |
128 | 2448 dbgprintf("SetLastError(0x%x)\n", error); |
1 | 2449 SetLastError(error); |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2450 } |
1 | 2451 |
2452 char* expstrrchr(char* string, int value) | |
2453 { | |
128 | 2454 char* result=strrchr(string, value); |
2455 if(result) | |
2456 dbgprintf("strrchr(0x%x='%s', %d) => 0x%x='%s'", string, string, value, result, result); | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2457 else |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2458 dbgprintf("strrchr(0x%x='%s', %d) => 0", string, string, value); |
128 | 2459 return result; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2460 } |
1 | 2461 |
2462 char* expstrchr(char* string, int value) | |
2463 { | |
128 | 2464 char* result=strchr(string, value); |
2465 if(result) | |
2466 dbgprintf("strchr(0x%x='%s', %d) => 0x%x='%s'", string, string, value, result, result); | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2467 else |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2468 dbgprintf("strchr(0x%x='%s', %d) => 0", string, string, value); |
128 | 2469 return result; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2470 } |
128 | 2471 int expstrlen(char* str) |
2472 { | |
2473 int result=strlen(str); | |
2474 dbgprintf("strlen(0x%x='%s') => %d\n", str, str, result); | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2475 return result; |
128 | 2476 } |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2477 int expstrcpy(char* str1, const char* str2) |
128 | 2478 { |
713 | 2479 int result= (int) strcpy(str1, str2); |
2480 dbgprintf("strcpy(0x%x, 0x%x='%s') => %d\n", str1, str2, str2, result); | |
128 | 2481 return result; |
2482 } | |
2483 int expstrcmp(const char* str1, const char* str2) | |
2484 { | |
2485 int result=strcmp(str1, str2); | |
2486 dbgprintf("strcmp(0x%x='%s', 0x%x='%s') => %d\n", str1, str1, str2, str2, result); | |
2487 return result; | |
2488 } | |
2668 | 2489 int expstrncmp(const char* str1, const char* str2,int x) |
2490 { | |
2491 int result=strncmp(str1, str2,x); | |
2492 dbgprintf("strcmp(0x%x='%s', 0x%x='%s') => %d\n", str1, str1, str2, str2, result); | |
2493 return result; | |
2494 } | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2495 int expstrcat(char* str1, const char* str2) |
128 | 2496 { |
713 | 2497 int result= (int) strcat(str1, str2); |
2498 dbgprintf("strcat(0x%x='%s', 0x%x='%s') => %d\n", str1, str1, str2, str2, result); | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2499 return result; |
128 | 2500 } |
713 | 2501 int expisalnum(int c) |
128 | 2502 { |
713 | 2503 int result= (int) isalnum(c); |
2504 dbgprintf("isalnum(0x%x='%c' => %d\n", c, c, result); | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2505 return result; |
713 | 2506 } |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2507 int expmemmove(void* dest, void* src, int n) |
713 | 2508 { |
2509 int result= (int) memmove(dest, src, n); | |
2510 dbgprintf("memmove(0x%x, 0x%x, %d) => %d\n", dest, src, n, result); | |
2511 return result; | |
128 | 2512 } |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2513 int expmemcmp(void* dest, void* src, int n) |
128 | 2514 { |
2515 int result=memcmp(dest, src, n); | |
2516 dbgprintf("memcmp(0x%x, 0x%x, %d) => %d\n", dest, src, n, result); | |
2517 return result; | |
2518 } | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2519 void *expmemcpy(void* dest, void* src, int n) |
130 | 2520 { |
597 | 2521 void *result=memcpy(dest, src, n); |
2522 dbgprintf("memcpy(0x%x, 0x%x, %d) => %p\n", dest, src, n, result); | |
130 | 2523 return result; |
2524 } | |
128 | 2525 time_t exptime(time_t* t) |
2526 { | |
2527 time_t result=time(t); | |
2528 dbgprintf("time(0x%x) => %d\n", t, result); | |
2529 return result; | |
2530 } | |
2531 | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2532 int exprand(void) |
2139 | 2533 { |
2534 return rand(); | |
2535 } | |
2536 | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2537 double explog10(double x) |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2538 { |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2539 return log10(x); |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2540 } |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2541 |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2542 double expcos(double x) |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2543 { |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2544 return cos(x); |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2545 } |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2546 |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2547 double exppow(double x, double y) |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2548 { |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2549 return pow(x, y); |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2550 } |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2551 |
2139 | 2552 void expsrand(int seed) |
2553 { | |
2554 srand(seed); | |
2555 } | |
2556 | |
2557 int exp_ftol(float f) | |
2558 { | |
2559 return (int)(f+.5); | |
2560 } | |
2561 | |
3128 | 2562 int exp_stricmp(const char* s1, const char* s2) |
2563 { | |
2564 return strcasecmp(s1, s2); | |
2565 } | |
2566 | |
128 | 2567 int WINAPI expStringFromGUID2(GUID* guid, char* str, int cbMax) |
2568 { | |
2069 | 2569 int result=snprintf(str, cbMax, "%.8x-%.4x-%.4x-%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x", |
2570 guid->f1, guid->f2, guid->f3, | |
2571 (unsigned char)guid->f4[0], (unsigned char)guid->f4[1], | |
2572 (unsigned char)guid->f4[2], (unsigned char)guid->f4[3], | |
2573 (unsigned char)guid->f4[4], (unsigned char)guid->f4[5], | |
2574 (unsigned char)guid->f4[6], (unsigned char)guid->f4[7]); | |
128 | 2575 dbgprintf("StringFromGUID2(0x%x, 0x%x='%s', %d) => %d\n", guid, str, str, cbMax, result); |
2576 return result; | |
2577 } | |
2578 | |
1 | 2579 |
2580 int WINAPI expGetFileVersionInfoSizeA(const char* name, int* lpHandle) | |
2581 { | |
128 | 2582 dbgprintf("GetFileVersionInfoSizeA(0x%x='%s', 0x%X) => 0\n", name, name, lpHandle); |
1 | 2583 return 0; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2584 } |
1 | 2585 |
2586 int WINAPI expIsBadStringPtrW(const short* string, int nchars) | |
2587 { | |
128 | 2588 int result; |
2589 if(string==0)result=1; else result=0; | |
2590 dbgprintf("IsBadStringPtrW(0x%x, %d) => %d", string, nchars, result); | |
2591 if(string)wch_print(string); | |
2592 return result; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2593 } |
3128 | 2594 int WINAPI expIsBadStringPtrA(const char* string, int nchars) |
2595 { | |
2596 return expIsBadStringPtrW((const short*)string, nchars); | |
2597 } | |
1 | 2598 extern long WINAPI InterlockedExchangeAdd( long* dest, long incr ) |
2599 { | |
2600 long ret; | |
2601 __asm__ __volatile__( "lock; xaddl %0,(%1)" | |
2602 : "=r" (ret) : "r" (dest), "0" (incr) : "memory" ); | |
2603 return ret; | |
2604 } | |
2605 | |
2606 extern long WINAPI expInterlockedIncrement( long* dest ) | |
2607 { | |
128 | 2608 long result=InterlockedExchangeAdd( dest, 1 ) + 1; |
2609 dbgprintf("InterlockedIncrement(0x%x => %d) => %d\n", dest, *dest, result); | |
2610 return result; | |
1 | 2611 } |
2612 extern long WINAPI expInterlockedDecrement( long* dest ) | |
2613 { | |
128 | 2614 long result=InterlockedExchangeAdd( dest, -1 ) - 1; |
2615 dbgprintf("InterlockedDecrement(0x%x => %d) => %d\n", dest, *dest, result); | |
2616 return result; | |
1 | 2617 } |
2618 | |
2619 extern void WINAPI expOutputDebugStringA( const char* string ) | |
2620 { | |
128 | 2621 dbgprintf("OutputDebugStringA(0x%x='%s')\n", string); |
1 | 2622 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
|
2623 } |
1 | 2624 |
2625 int WINAPI expGetDC(int hwnd) | |
2626 { | |
128 | 2627 dbgprintf("GetDC(0x%x) => 0\n", hwnd); |
1 | 2628 return 0; |
2629 } | |
2630 | |
2631 int WINAPI expGetDesktopWindow() | |
2632 { | |
128 | 2633 dbgprintf("GetDesktopWindow() => 0\n"); |
1 | 2634 return 0; |
2635 } | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2636 |
1 | 2637 int WINAPI expReleaseDC(int hwnd, int hdc) |
2638 { | |
128 | 2639 dbgprintf("ReleaseDC(0x%x, 0x%x) => 0\n", hwnd, hdc); |
2640 return 0; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2641 } |
128 | 2642 static int cursor[100]; |
2643 | |
2644 int WINAPI expLoadCursorA(int handle,LPCSTR name) | |
2645 { | |
2646 dbgprintf("LoadCursorA(%d, 0x%x='%s') => 0x%x\n", handle, name, (int)&cursor[0]); | |
2647 return (int)&cursor[0]; | |
2648 } | |
2649 int WINAPI expSetCursor(void *cursor) | |
2650 { | |
2651 dbgprintf("SetCursor(0x%x) => 0x%x\n", cursor, cursor); | |
2652 return (int)cursor; | |
2653 } | |
2069 | 2654 int WINAPI expGetCursorPos(void *cursor) |
2655 { | |
2656 dbgprintf("GetCursorPos(0x%x) => 0x%x\n", cursor, cursor); | |
2657 return 1; | |
2658 } | |
2659 int WINAPI expRegisterWindowMessageA(char *message) | |
2660 { | |
2661 dbgprintf("RegisterWindowMessageA(%s)\n", message); | |
2662 return 1; | |
2663 } | |
2664 int WINAPI expGetProcessVersion(int pid) | |
2665 { | |
2666 dbgprintf("GetProcessVersion(%d)\n", pid); | |
2667 return 1; | |
2668 } | |
2669 int WINAPI expGetCurrentThread(void) | |
2670 { | |
2671 dbgprintf("GetCurrentThread()\n"); | |
2779 | 2672 return 0xcfcf9898; |
2069 | 2673 } |
2674 int WINAPI expGetOEMCP(void) | |
2675 { | |
2676 dbgprintf("GetOEMCP()\n"); | |
2677 return 1; | |
2678 } | |
2679 int WINAPI expGetCPInfo(int cp,void *info) | |
2680 { | |
2681 dbgprintf("GetCPInfo()\n"); | |
2682 return 0; | |
2683 } | |
2684 int WINAPI expGetSystemMetrics(int index) | |
2685 { | |
2686 dbgprintf("GetSystemMetrics(%d)\n", index); | |
2687 return 1; | |
2688 } | |
2689 int WINAPI expGetSysColor(int index) | |
2690 { | |
2691 dbgprintf("GetSysColor(%d)\n", index); | |
2692 return 1; | |
2693 } | |
2694 int WINAPI expGetSysColorBrush(int index) | |
2695 { | |
2696 dbgprintf("GetSysColorBrush(%d)\n", index); | |
2697 return 1; | |
2698 } | |
2699 | |
2700 | |
2701 | |
128 | 2702 int WINAPI expGetSystemPaletteEntries(int hdc, int iStartIndex, int nEntries, void* lppe) |
2703 { | |
2704 dbgprintf("GetSystemPaletteEntries(0x%x, 0x%x, 0x%x, 0x%x) => 0\n", | |
2705 hdc, iStartIndex, nEntries, lppe); | |
1 | 2706 return 0; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2707 } |
1 | 2708 |
2709 /* | |
2710 typedef struct _TIME_ZONE_INFORMATION { | |
2711 long Bias; | |
2712 char StandardName[32]; | |
2713 SYSTEMTIME StandardDate; | |
2714 long StandardBias; | |
2715 char DaylightName[32]; | |
2716 SYSTEMTIME DaylightDate; | |
2717 long DaylightBias; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2718 } TIME_ZONE_INFORMATION, *LPTIME_ZONE_INFORMATION; |
1 | 2719 */ |
2720 | |
2721 int WINAPI expGetTimeZoneInformation(LPTIME_ZONE_INFORMATION lpTimeZoneInformation) | |
2722 { | |
128 | 2723 const short name[]={'C', 'e', 'n', 't', 'r', 'a', 'l', ' ', 'S', 't', 'a', |
2724 'n', 'd', 'a', 'r', 'd', ' ', 'T', 'i', 'm', 'e', 0}; | |
2725 const short pname[]={'C', 'e', 'n', 't', 'r', 'a', 'l', ' ', 'D', 'a', 'y', | |
2726 'l', 'i', 'g', 'h', 't', ' ', 'T', 'i', 'm', 'e', 0}; | |
2727 dbgprintf("GetTimeZoneInformation(0x%x) => TIME_ZONE_ID_STANDARD\n"); | |
1 | 2728 memset(lpTimeZoneInformation, 0, sizeof(TIME_ZONE_INFORMATION)); |
128 | 2729 lpTimeZoneInformation->Bias=360;//GMT-6 |
2730 memcpy(lpTimeZoneInformation->StandardName, name, sizeof(name)); | |
2731 lpTimeZoneInformation->StandardDate.wMonth=10; | |
2732 lpTimeZoneInformation->StandardDate.wDay=5; | |
2733 lpTimeZoneInformation->StandardDate.wHour=2; | |
2734 lpTimeZoneInformation->StandardBias=0; | |
2735 memcpy(lpTimeZoneInformation->DaylightName, pname, sizeof(pname)); | |
2736 lpTimeZoneInformation->DaylightDate.wMonth=4; | |
2737 lpTimeZoneInformation->DaylightDate.wDay=1; | |
2738 lpTimeZoneInformation->DaylightDate.wHour=2; | |
2739 lpTimeZoneInformation->DaylightBias=-60; | |
2740 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
|
2741 } |
1 | 2742 |
2743 void WINAPI expGetLocalTime(SYSTEMTIME* systime) | |
2744 { | |
2745 time_t local_time; | |
2746 struct tm *local_tm; | |
2747 struct timeval tv; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2748 |
128 | 2749 dbgprintf("GetLocalTime(0x%x)\n"); |
1 | 2750 gettimeofday(&tv, NULL); |
2751 local_time=tv.tv_sec; | |
2752 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
|
2753 |
1 | 2754 systime->wYear = local_tm->tm_year + 1900; |
2755 systime->wMonth = local_tm->tm_mon + 1; | |
2756 systime->wDayOfWeek = local_tm->tm_wday; | |
2757 systime->wDay = local_tm->tm_mday; | |
2758 systime->wHour = local_tm->tm_hour; | |
2759 systime->wMinute = local_tm->tm_min; | |
2760 systime->wSecond = local_tm->tm_sec; | |
2761 systime->wMilliseconds = (tv.tv_usec / 1000) % 1000; | |
128 | 2762 dbgprintf(" Year: %d\n Month: %d\n Day of week: %d\n" |
2763 " Day: %d\n Hour: %d\n Minute: %d\n Second: %d\n" | |
2764 " Milliseconds: %d\n", | |
2765 systime->wYear, systime->wMonth, systime->wDayOfWeek, systime->wDay, | |
2766 systime->wHour, systime->wMinute, systime->wSecond, systime->wMilliseconds); | |
1 | 2767 } |
2768 | |
2769 int WINAPI expGetSystemTime(SYSTEMTIME* systime) | |
2770 { | |
2771 time_t local_time; | |
2772 struct tm *local_tm; | |
2773 struct timeval tv; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2774 |
128 | 2775 dbgprintf("GetSystemTime(0x%x)\n", systime); |
1 | 2776 gettimeofday(&tv, NULL); |
2777 local_time=tv.tv_sec; | |
2778 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
|
2779 |
1 | 2780 systime->wYear = local_tm->tm_year + 1900; |
2781 systime->wMonth = local_tm->tm_mon + 1; | |
2782 systime->wDayOfWeek = local_tm->tm_wday; | |
2783 systime->wDay = local_tm->tm_mday; | |
2784 systime->wHour = local_tm->tm_hour; | |
2785 systime->wMinute = local_tm->tm_min; | |
2786 systime->wSecond = local_tm->tm_sec; | |
2787 systime->wMilliseconds = (tv.tv_usec / 1000) % 1000; | |
128 | 2788 dbgprintf(" Year: %d\n Month: %d\n Day of week: %d\n" |
2789 " Day: %d\n Hour: %d\n Minute: %d\n Second: %d\n" | |
2790 " Milliseconds: %d\n", | |
2791 systime->wYear, systime->wMonth, systime->wDayOfWeek, systime->wDay, | |
2792 systime->wHour, systime->wMinute, systime->wSecond, systime->wMilliseconds); | |
2069 | 2793 return 0; |
1 | 2794 } |
2795 | |
2796 int WINAPI expGetEnvironmentVariableA(const char* name, char* field, int size) | |
2797 { | |
128 | 2798 char *p; |
2799 // printf("%s %x %x\n", name, field, size); | |
1 | 2800 if(field)field[0]=0; |
128 | 2801 /* |
2802 p = getenv(name); | |
2803 if (p) strncpy(field,p,size); | |
2804 */ | |
2805 if (strcmp(name,"__MSVCRT_HEAP_SELECT")==0) | |
2806 strcpy(field,"__GLOBAL_HEAP_SELECTED,1"); | |
2807 dbgprintf("GetEnvironmentVariableA(0x%x='%s', 0x%x, %d) => %d\n", name, name, field, size, strlen(field)); | |
2808 return strlen(field); | |
2809 } | |
2810 | |
2811 void* WINAPI expCoTaskMemAlloc(ULONG cb) | |
2812 { | |
2813 return my_mreq(cb, 0); | |
2814 } | |
2815 void WINAPI expCoTaskMemFree(void* cb) | |
2816 { | |
2817 my_release(cb); | |
2818 } | |
2819 | |
2820 void* CoTaskMemAlloc(ULONG cb){return expCoTaskMemAlloc(cb);} | |
2821 void CoTaskMemFree(void* cb){expCoTaskMemFree(cb);} | |
2822 | |
2823 struct COM_OBJECT_INFO | |
2824 { | |
2825 GUID clsid; | |
2826 long (*GetClassObject) (GUID* clsid, GUID* iid, void** ppv); | |
2827 }; | |
2828 | |
2829 static struct COM_OBJECT_INFO* com_object_table=0; | |
2830 static int com_object_size=0; | |
2831 int RegisterComClass(GUID* clsid, GETCLASSOBJECT gcs) | |
2832 { | |
2069 | 2833 if(!clsid || !gcs) |
2834 return -1; | |
128 | 2835 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
|
2836 com_object_table[com_object_size-1].clsid=*clsid; |
128 | 2837 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
|
2838 return 0; |
128 | 2839 } |
2840 | |
2069 | 2841 int UnregisterComClass(GUID* clsid, GETCLASSOBJECT gcs) |
2842 { | |
2843 int found = 0; | |
2844 int i = 0; | |
2845 if(!clsid || !gcs) | |
2846 return -1; | |
2847 | |
2848 if (com_object_table == 0) | |
2849 printf("Warning: UnregisterComClass() called without any registered class\n"); | |
2850 while (i < com_object_size) | |
2851 { | |
2852 if (found && i > 0) | |
2853 { | |
2854 memcpy(&com_object_table[i - 1].clsid, | |
2855 &com_object_table[i].clsid, sizeof(GUID)); | |
2856 com_object_table[i - 1].GetClassObject = | |
2857 com_object_table[i].GetClassObject; | |
2858 } | |
2859 else if (memcmp(&com_object_table[i].clsid, clsid, sizeof(GUID)) == 0 | |
2860 && com_object_table[i].GetClassObject == gcs) | |
2861 { | |
2862 found++; | |
2863 } | |
2864 i++; | |
2865 } | |
2866 if (found) | |
2867 { | |
2868 if (--com_object_size == 0) | |
2869 { | |
2870 free(com_object_table); | |
2871 com_object_table = 0; | |
2872 } | |
2873 } | |
2874 return 0; | |
2875 } | |
2876 | |
2877 | |
128 | 2878 GUID IID_IUnknown={0x00000000, 0x0000, 0x0000, |
2879 {0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}}; | |
2880 GUID IID_IClassFactory={0x00000001, 0x0000, 0x0000, | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2881 {0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}}; |
128 | 2882 |
2883 long WINAPI expCoCreateInstance(GUID* rclsid, struct IUnknown* pUnkOuter, | |
2884 long dwClsContext, GUID* riid, void** ppv) | |
2885 { | |
2886 int i; | |
2887 struct COM_OBJECT_INFO* ci=0; | |
2888 for(i=0; i<com_object_size; i++) | |
2889 if(!memcmp(rclsid, &com_object_table[i].clsid, sizeof(GUID))) | |
2890 ci=&com_object_table[i]; | |
2891 if(!ci)return 0x80040154; | |
2892 // in 'real' world we should mess with IClassFactory here | |
2893 i=ci->GetClassObject(rclsid, riid, ppv); | |
2894 return i; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2895 } |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2896 |
128 | 2897 long CoCreateInstance(GUID* rclsid, struct IUnknown* pUnkOuter, |
2898 long dwClsContext, GUID* riid, void** ppv) | |
2899 { | |
2900 return expCoCreateInstance(rclsid, pUnkOuter, dwClsContext, riid, ppv); | |
2901 } | |
2902 | |
2903 int WINAPI | |
2904 expIsRectEmpty( | |
2905 CONST RECT *lprc) | |
2906 { | |
2907 dbgprintf("IsRectEmpty(0x%x)"); | |
2908 if((!lprc) || (lprc->right==lprc->left) || (lprc->top==lprc->bottom)) | |
2909 { | |
2910 dbgprintf(" => TRUE\n"); | |
2911 return TRUE; | |
2912 } | |
2913 dbgprintf(" => FALSE\n"); | |
2914 return FALSE; | |
2915 } | |
2916 | |
2917 int _adjust_fdiv=0; //what's this? | |
2918 | |
2919 | |
2920 | |
2921 | |
2922 unsigned int WINAPI expGetTempPathA(unsigned int len, char* path) | |
2923 { | |
2924 dbgprintf("GetTempPathA(%d, 0x%x)", len, path); | |
2925 if(len<5) | |
2926 { | |
2927 dbgprintf(" => 0\n"); | |
2928 return 0; | |
2929 } | |
2930 strcpy(path, "/tmp"); | |
2931 dbgprintf(" => 5 ( '/tmp' )\n"); | |
2932 return 5; | |
2933 } | |
2934 /* | |
2935 FYI: | |
2936 typedef struct | |
2937 { | |
2938 DWORD dwFileAttributes; | |
2939 FILETIME ftCreationTime; | |
2940 FILETIME ftLastAccessTime; | |
2941 FILETIME ftLastWriteTime; | |
2942 DWORD nFileSizeHigh; | |
2943 DWORD nFileSizeLow; | |
2944 DWORD dwReserved0; | |
2945 DWORD dwReserved1; | |
2946 CHAR cFileName[260]; | |
2947 CHAR cAlternateFileName[14]; | |
2948 } WIN32_FIND_DATAA, *LPWIN32_FIND_DATAA; | |
2949 */ | |
2950 | |
2951 HANDLE WINAPI expFindFirstFileA(LPCSTR s, LPWIN32_FIND_DATAA lpfd) | |
2952 { | |
2953 dbgprintf("FindFirstFileA(0x%x='%s', 0x%x) => 0\n", s, s, lpfd); | |
2954 strcpy(lpfd->cFileName, "msms001.vwp"); | |
2955 strcpy(lpfd->cAlternateFileName, "msms001.vwp"); | |
2956 return (HANDLE)0; | |
2957 } | |
2958 WIN_BOOL WINAPI expFindNextFileA(HANDLE h,LPWIN32_FIND_DATAA p) | |
2959 { | |
2960 dbgprintf("FindNextFileA(0x%x, 0x%x) => 0\n", h, p); | |
1 | 2961 return 0; |
2962 } | |
128 | 2963 WIN_BOOL WINAPI expFindClose(HANDLE h) |
2964 { | |
2965 dbgprintf("FindClose(0x%x) => 0\n", h); | |
2966 return 0; | |
2967 } | |
2968 UINT WINAPI expSetErrorMode(UINT i) | |
2969 { | |
2970 dbgprintf("SetErrorMode(%d) => 0\n", i); | |
2971 return 0; | |
2972 } | |
2973 UINT WINAPI expGetWindowsDirectoryA(LPSTR s,UINT c) | |
2974 { | |
2975 char windir[]="c:\\windows"; | |
2976 int result; | |
2977 strncpy(s, windir, c); | |
2978 result=1+((c<strlen(windir))?c:strlen(windir)); | |
2979 dbgprintf("GetWindowsDirectoryA(0x%x, %d) => %d\n", s, c, result); | |
2980 return result; | |
2981 } | |
2982 | |
2983 WIN_BOOL WINAPI expDeleteFileA(LPCSTR s) | |
2984 { | |
2985 dbgprintf("DeleteFileA(0x%x='%s') => 0\n", s, s); | |
2986 return 0; | |
2987 } | |
2988 WIN_BOOL WINAPI expFileTimeToLocalFileTime(const FILETIME* cpf, LPFILETIME pf) | |
2989 { | |
2990 dbgprintf("FileTimeToLocalFileTime(0x%x, 0x%x) => 0\n", cpf, pf); | |
2991 return 0; | |
2992 } | |
2993 | |
2994 UINT WINAPI expGetTempFileNameA(LPCSTR cs1,LPCSTR cs2,UINT i,LPSTR ps) | |
2995 { | |
2996 char mask[16]="/tmp/AP_XXXXXX"; | |
2997 int result; | |
2998 dbgprintf("GetTempFileNameA(0x%x='%s', 0x%x='%s', %d, 0x%x)", cs1, cs1, cs2, cs2, i, ps); | |
2999 if(i && i<10) | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
3000 { |
128 | 3001 dbgprintf(" => -1\n"); |
3002 return -1; | |
3003 } | |
3004 result=mkstemp(mask); | |
3005 sprintf(ps, "AP%d", result); | |
3006 dbgprintf(" => %d\n", strlen(ps)); | |
3007 return strlen(ps); | |
3008 } | |
3009 // | |
3010 // This func might need proper implementation if we want AngelPotion codec. | |
3011 // They try to open APmpeg4v1.apl with it. | |
3012 // DLL will close opened file with CloseHandle(). | |
3013 // | |
3014 HANDLE WINAPI expCreateFileA(LPCSTR cs1,DWORD i1,DWORD i2, | |
3015 LPSECURITY_ATTRIBUTES p1, DWORD i3,DWORD i4,HANDLE i5) | |
3016 { | |
3017 dbgprintf("CreateFileA(0x%x='%s', %d, %d, 0x%x, %d, %d, 0x%x)\n", cs1, cs1, i1, | |
3018 i2, p1, i3, i4, i5); | |
3019 if((!cs1) || (strlen(cs1)<2))return -1; | |
3128 | 3020 |
3021 if(strncmp(cs1, "AP", 2) == 0) | |
128 | 3022 { |
3023 int result; | |
3024 char* tmp=(char*)malloc(strlen(def_path)+50); | |
3025 strcpy(tmp, def_path); | |
3026 strcat(tmp, "/"); | |
3027 strcat(tmp, "APmpg4v1.apl"); | |
3028 result=open(tmp, O_RDONLY); | |
3029 free(tmp); | |
3030 return result; | |
3128 | 3031 } |
3032 if (strstr(cs1, "vp3")) | |
3033 { | |
3034 int r; | |
3035 int flg = 0; | |
3036 char* tmp=(char*)malloc(20 + strlen(cs1)); | |
3037 strcpy(tmp, "/tmp/"); | |
3038 strcat(tmp, cs1); | |
3039 r = 4; | |
3040 while (tmp[r]) | |
3041 { | |
3042 if (tmp[r] == ':' || tmp[r] == '\\') | |
3043 tmp[r] = '_'; | |
3044 r++; | |
3045 } | |
3046 if (GENERIC_READ & i1) | |
3047 flg |= O_RDONLY; | |
3048 else if (GENERIC_WRITE & i1) | |
3049 { | |
3050 flg |= O_WRONLY; | |
3051 printf("Warning: openning filename %s %d (flags; 0x%x) for write\n", tmp, r, flg); | |
3052 } | |
3053 r=open(tmp, flg); | |
3054 free(tmp); | |
3055 return r; | |
3056 } | |
3057 | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
3058 return atoi(cs1+2); |
128 | 3059 } |
3060 static char sysdir[]="."; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
3061 LPCSTR WINAPI expGetSystemDirectoryA() |
128 | 3062 { |
3063 dbgprintf("GetSystemDirectoryA() => 0x%x='%s'\n", sysdir, sysdir); | |
3064 return sysdir; | |
3065 } | |
3066 WIN_BOOL WINAPI expReadFile(HANDLE h,LPVOID pv,DWORD size,LPDWORD rd,LPOVERLAPPED unused) | |
3067 { | |
3068 int result; | |
3069 dbgprintf("ReadFile(%d, 0x%x, %d -> 0x%x)\n", h, pv, size, rd); | |
3070 result=read(h, pv, size); | |
3071 if(rd)*rd=result; | |
3072 if(!result)return 0; | |
3073 return 1; | |
3074 } | |
3075 | |
3076 WIN_BOOL WINAPI expWriteFile(HANDLE h,LPCVOID pv,DWORD size,LPDWORD wr,LPOVERLAPPED unused) | |
3077 { | |
3078 int result; | |
3079 dbgprintf("WriteFile(%d, 0x%x, %d -> 0x%x)\n", h, pv, size, wr); | |
3080 if(h==1234)h=1; | |
3081 result=write(h, pv, size); | |
3082 if(wr)*wr=result; | |
3083 if(!result)return 0; | |
3084 return 1; | |
3085 } | |
3086 DWORD WINAPI expSetFilePointer(HANDLE h, LONG val, LPLONG ext, DWORD whence) | |
3087 { | |
3088 int wh; | |
3089 dbgprintf("SetFilePointer(%d, %d, 0x%x, %d)\n", h, val, ext, whence); | |
3090 //why would DLL want temporary file with >2Gb size? | |
3091 switch(whence) | |
3092 { | |
3093 case FILE_BEGIN: | |
3094 wh=SEEK_SET;break; | |
3095 case FILE_END: | |
3096 wh=SEEK_END;break; | |
3097 case FILE_CURRENT: | |
3098 wh=SEEK_CUR;break; | |
3099 default: | |
3100 return -1; | |
3101 } | |
3102 return lseek(h, val, wh); | |
3103 } | |
3104 | |
3105 HDRVR WINAPI expOpenDriverA(LPCSTR szDriverName, LPCSTR szSectionName, | |
3106 LPARAM lParam2) | |
3107 { | |
3108 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
|
3109 return -1; |
128 | 3110 } |
3111 HDRVR WINAPI expOpenDriver(LPCSTR szDriverName, LPCSTR szSectionName, | |
3112 LPARAM lParam2) | |
3113 { | |
3114 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
|
3115 return -1; |
128 | 3116 } |
1 | 3117 |
3118 | |
128 | 3119 WIN_BOOL |
3120 WINAPI | |
3121 expGetProcessAffinityMask( | |
3122 HANDLE hProcess, | |
3123 LPDWORD lpProcessAffinityMask, | |
3124 LPDWORD lpSystemAffinityMask | |
3125 ) | |
3126 { | |
3127 dbgprintf("GetProcessAffinityMask(0x%x, 0x%x, 0x%x) => 1\n", | |
3128 hProcess, lpProcessAffinityMask, lpSystemAffinityMask); | |
3129 if(lpProcessAffinityMask)*lpProcessAffinityMask=1; | |
3130 if(lpSystemAffinityMask)*lpSystemAffinityMask=1; | |
3131 return 1; | |
1 | 3132 } |
3133 | |
713 | 3134 int WINAPI expMulDiv(int nNumber, int nNumerator, int nDenominator) |
3135 { | |
3136 static const long long max_int=0x7FFFFFFFLL; | |
3137 static const long long min_int=-0x80000000LL; | |
3138 long long tmp=(long long)nNumber*(long long)nNumerator; | |
3139 if(!nDenominator)return 1; | |
3140 tmp/=nDenominator; | |
3141 if(tmp<min_int) return 1; | |
3142 if(tmp>max_int) return 1; | |
3143 return (int)tmp; | |
3144 } | |
3145 | |
3146 LONG WINAPI explstrcmpiA(const char* str1, const char* str2) | |
3147 { | |
3148 LONG result=strcasecmp(str1, str2); | |
3149 dbgprintf("strcmpi(0x%x='%s', 0x%x='%s') => %d\n", str1, str1, str2, str2, result); | |
3150 return result; | |
3151 } | |
3152 | |
3153 LONG WINAPI explstrlenA(const char* str1) | |
3154 { | |
3155 LONG result=strlen(str1); | |
3134 | 3156 dbgprintf("strlen(0x%x='%.50s') => %d\n", str1, str1, result); |
713 | 3157 return result; |
3158 } | |
3159 | |
3160 LONG WINAPI explstrcpyA(char* str1, const char* str2) | |
3161 { | |
3162 int result= (int) strcpy(str1, str2); | |
3134 | 3163 dbgprintf("strcpy(0x%.50x, 0x%.50x='%.50s') => %d\n", str1, str2, str2, result); |
713 | 3164 return result; |
3165 } | |
2069 | 3166 LONG WINAPI explstrcpynA(char* str1, const char* str2,int len) |
3167 { | |
3168 int result; | |
3169 if (strlen(str2)>len) | |
3170 result = (int) strncpy(str1, str2,len); | |
3171 else | |
3172 result = (int) strcpy(str1,str2); | |
3173 dbgprintf("strncpy(0x%x, 0x%x='%s' len %d strlen %d) => %x\n", str1, str2, str2,len, strlen(str2),result); | |
3174 return result; | |
3175 } | |
3176 LONG WINAPI explstrcatA(char* str1, const char* str2) | |
3177 { | |
3178 int result= (int) strcat(str1, str2); | |
3179 dbgprintf("strcat(0x%x, 0x%x='%s') => %d\n", str1, str2, str2, result); | |
3180 return result; | |
3181 } | |
3182 | |
128 | 3183 |
497 | 3184 LONG WINAPI expInterlockedExchange(long *dest, long l) |
3185 { | |
3186 long retval; | |
3187 retval = *dest; | |
3188 *dest = l; | |
3189 return retval; | |
3190 } | |
3191 | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
3192 void WINAPI expInitCommonControls(void) |
1543 | 3193 { |
2069 | 3194 printf("InitCommonControls called!\n"); |
3195 return; | |
1543 | 3196 } |
3197 | |
2396 | 3198 HRESULT WINAPI expCoCreateFreeThreadedMarshaler(void *pUnkOuter, void **ppUnkInner) |
3199 { | |
3200 printf("CoCreateFreeThreadedMarshaler(%p, %p) called!\n", | |
3201 pUnkOuter, ppUnkInner); | |
3202 return E_FAIL; | |
3203 // return S_OK; | |
3204 } | |
3205 | |
2779 | 3206 |
3207 int WINAPI expDuplicateHandle( | |
3208 HANDLE hSourceProcessHandle, // handle to source process | |
3209 HANDLE hSourceHandle, // handle to duplicate | |
3210 HANDLE hTargetProcessHandle, // handle to target process | |
3211 HANDLE* lpTargetHandle, // duplicate handle | |
3212 DWORD dwDesiredAccess, // requested access | |
3213 int bInheritHandle, // handle inheritance option | |
3214 DWORD dwOptions // optional actions | |
3215 ) | |
3216 { | |
3217 dbgprintf("DuplicateHandle(%p, %p, %p, %p, 0x%x, %d, %d) called\n", | |
3218 hSourceProcessHandle, hSourceHandle, hTargetProcessHandle, | |
3219 lpTargetHandle, dwDesiredAccess, bInheritHandle, dwOptions); | |
3220 *lpTargetHandle = hSourceHandle; | |
3221 return 1; | |
3222 } | |
3223 | |
3128 | 3224 // required by PIM1 codec (used by win98 PCTV Studio capture sw) |
3033 | 3225 HRESULT WINAPI expCoInitialize( |
3226 LPVOID lpReserved /* [in] pointer to win32 malloc interface | |
3227 (obsolete, should be NULL) */ | |
3228 ) | |
3229 { | |
3230 /* | |
3231 * Just delegate to the newer method. | |
3232 */ | |
3233 return 0; //CoInitializeEx(lpReserved, COINIT_APARTMENTTHREADED); | |
3234 } | |
3235 | |
3236 | |
2779 | 3237 |
1 | 3238 struct exports |
3239 { | |
3240 char name[64]; | |
3241 int id; | |
3242 void* func; | |
3243 }; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
3244 struct libs |
1 | 3245 { |
3246 char name[64]; | |
3247 int length; | |
3248 struct exports* exps; | |
3249 }; | |
3250 | |
3251 #define FF(X,Y) \ | |
3252 {#X, Y, (void*)exp##X}, | |
3253 | |
3254 struct exports exp_kernel32[]={ | |
3255 FF(IsBadWritePtr, 357) | |
3256 FF(IsBadReadPtr, 354) | |
3257 FF(IsBadStringPtrW, -1) | |
3128 | 3258 FF(IsBadStringPtrA, -1) |
1 | 3259 FF(DisableThreadLibraryCalls, -1) |
3260 FF(CreateThread, -1) | |
3261 FF(CreateEventA, -1) | |
3262 FF(SetEvent, -1) | |
3263 FF(ResetEvent, -1) | |
3264 FF(WaitForSingleObject, -1) | |
3265 FF(GetSystemInfo, -1) | |
3266 FF(GetVersion, 332) | |
3267 FF(HeapCreate, 461) | |
3268 FF(HeapAlloc, -1) | |
3269 FF(HeapDestroy, -1) | |
3270 FF(HeapFree, -1) | |
3271 FF(HeapSize, -1) | |
2069 | 3272 FF(HeapReAlloc,-1) |
1 | 3273 FF(GetProcessHeap, -1) |
3274 FF(VirtualAlloc, -1) | |
3275 FF(VirtualFree, -1) | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
3276 FF(InitializeCriticalSection, -1) |
1 | 3277 FF(EnterCriticalSection, -1) |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
3278 FF(LeaveCriticalSection, -1) |
1 | 3279 FF(DeleteCriticalSection, -1) |
3280 FF(TlsAlloc, -1) | |
3281 FF(TlsFree, -1) | |
3282 FF(TlsGetValue, -1) | |
3283 FF(TlsSetValue, -1) | |
3284 FF(GetCurrentThreadId, -1) | |
128 | 3285 FF(GetCurrentProcess, -1) |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
3286 FF(LocalAlloc, -1) |
2069 | 3287 FF(LocalReAlloc,-1) |
1 | 3288 FF(LocalLock, -1) |
3289 FF(GlobalAlloc, -1) | |
128 | 3290 FF(GlobalReAlloc, -1) |
1 | 3291 FF(GlobalLock, -1) |
3128 | 3292 FF(GlobalSize, -1) |
1 | 3293 FF(MultiByteToWideChar, 427) |
3294 FF(WideCharToMultiByte, -1) | |
3295 FF(GetVersionExA, -1) | |
3296 FF(CreateSemaphoreA, -1) | |
3297 FF(QueryPerformanceCounter, -1) | |
3298 FF(QueryPerformanceFrequency, -1) | |
3299 FF(LocalHandle, -1) | |
3300 FF(LocalUnlock, -1) | |
3301 FF(LocalFree, -1) | |
3302 FF(GlobalHandle, -1) | |
3303 FF(GlobalUnlock, -1) | |
3304 FF(GlobalFree, -1) | |
3305 FF(LoadResource, -1) | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
3306 FF(ReleaseSemaphore, -1) |
1 | 3307 FF(FindResourceA, -1) |
3308 FF(LockResource, -1) | |
3309 FF(FreeResource, -1) | |
3310 FF(SizeofResource, -1) | |
3311 FF(CloseHandle, -1) | |
3312 FF(GetCommandLineA, -1) | |
3313 FF(GetEnvironmentStringsW, -1) | |
3314 FF(FreeEnvironmentStringsW, -1) | |
128 | 3315 FF(FreeEnvironmentStringsA, -1) |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
3316 FF(GetEnvironmentStrings, -1) |
1 | 3317 FF(GetStartupInfoA, -1) |
3318 FF(GetStdHandle, -1) | |
3319 FF(GetFileType, -1) | |
3320 FF(SetHandleCount, -1) | |
3321 FF(GetACP, -1) | |
3322 FF(GetModuleFileNameA, -1) | |
3323 FF(SetUnhandledExceptionFilter, -1) | |
3324 FF(LoadLibraryA, -1) | |
3325 FF(GetProcAddress, -1) | |
3326 FF(FreeLibrary, -1) | |
3327 FF(CreateFileMappingA, -1) | |
3328 FF(OpenFileMappingA, -1) | |
3329 FF(MapViewOfFile, -1) | |
3330 FF(UnmapViewOfFile, -1) | |
3331 FF(Sleep, -1) | |
3332 FF(GetModuleHandleA, -1) | |
128 | 3333 FF(GetProfileIntA, -1) |
1 | 3334 FF(GetPrivateProfileIntA, -1) |
3335 FF(GetPrivateProfileStringA, -1) | |
3336 FF(WritePrivateProfileStringA, -1) | |
3337 FF(GetLastError, -1) | |
3338 FF(SetLastError, -1) | |
3339 FF(InterlockedIncrement, -1) | |
3340 FF(InterlockedDecrement, -1) | |
3341 FF(GetTimeZoneInformation, -1) | |
3342 FF(OutputDebugStringA, -1) | |
3343 FF(GetLocalTime, -1) | |
3344 FF(GetSystemTime, -1) | |
3345 FF(GetEnvironmentVariableA, -1) | |
121 | 3346 FF(RtlZeroMemory,-1) |
3347 FF(RtlMoveMemory,-1) | |
3348 FF(RtlFillMemory,-1) | |
128 | 3349 FF(GetTempPathA,-1) |
3350 FF(FindFirstFileA,-1) | |
3351 FF(FindNextFileA,-1) | |
3352 FF(FindClose,-1) | |
3353 FF(FileTimeToLocalFileTime,-1) | |
3354 FF(DeleteFileA,-1) | |
3355 FF(ReadFile,-1) | |
3356 FF(WriteFile,-1) | |
3357 FF(SetFilePointer,-1) | |
3358 FF(GetTempFileNameA,-1) | |
3359 FF(CreateFileA,-1) | |
3360 FF(GetSystemDirectoryA,-1) | |
3361 FF(GetWindowsDirectoryA,-1) | |
3362 FF(SetErrorMode, -1) | |
3363 FF(IsProcessorFeaturePresent, -1) | |
3364 FF(GetProcessAffinityMask, -1) | |
497 | 3365 FF(InterlockedExchange, -1) |
3366 FF(MulDiv, -1) | |
713 | 3367 FF(lstrcmpiA, -1) |
3368 FF(lstrlenA, -1) | |
3369 FF(lstrcpyA, -1) | |
2069 | 3370 FF(lstrcatA, -1) |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
3371 FF(lstrcpynA,-1) |
2069 | 3372 FF(GetProcessVersion,-1) |
3373 FF(GetCurrentThread,-1) | |
3374 FF(GetOEMCP,-1) | |
3375 FF(GetCPInfo,-1) | |
2779 | 3376 FF(DuplicateHandle,-1) |
1 | 3377 }; |
3378 | |
3379 struct exports exp_msvcrt[]={ | |
3380 FF(malloc, -1) | |
3381 FF(_initterm, -1) | |
3382 FF(free, -1) | |
3383 {"??3@YAXPAX@Z", -1, expdelete}, | |
3384 {"??2@YAPAXI@Z", -1, expnew}, | |
128 | 3385 {"_adjust_fdiv", -1, (void*)&_adjust_fdiv}, |
1 | 3386 FF(strrchr, -1) |
3387 FF(strchr, -1) | |
128 | 3388 FF(strlen, -1) |
3389 FF(strcpy, -1) | |
3390 FF(strcmp, -1) | |
2668 | 3391 FF(strncmp, -1) |
128 | 3392 FF(strcat, -1) |
3128 | 3393 FF(_stricmp,-1) |
713 | 3394 FF(isalnum, -1) |
128 | 3395 FF(memmove, -1) |
3396 FF(memcmp, -1) | |
3397 FF(time, -1) | |
2139 | 3398 FF(_ftol,-1) |
3399 FF(rand, -1) | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
3400 FF(log10, -1) |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
3401 FF(pow, -1) |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
3402 FF(cos, -1) |
2139 | 3403 FF(srand, -1) |
3404 FF(sprintf,-1) | |
3405 FF(sscanf,-1) | |
3406 FF(fopen,-1) | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
3407 FF(fprintf,-1) |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
3408 FF(printf,-1) |
1 | 3409 }; |
3410 struct exports exp_winmm[]={ | |
3411 FF(GetDriverModuleHandle, -1) | |
3412 FF(timeGetTime, -1) | |
3413 FF(DefDriverProc, -1) | |
128 | 3414 FF(OpenDriverA, -1) |
1 | 3415 FF(OpenDriver, -1) |
3416 }; | |
3417 struct exports exp_user32[]={ | |
3418 FF(LoadStringA, -1) | |
3419 FF(wsprintfA, -1) | |
3420 FF(GetDC, -1) | |
3421 FF(GetDesktopWindow, -1) | |
3422 FF(ReleaseDC, -1) | |
128 | 3423 FF(IsRectEmpty, -1) |
3424 FF(LoadCursorA,-1) | |
3425 FF(SetCursor,-1) | |
2069 | 3426 FF(GetCursorPos,-1) |
3427 FF(GetCursorPos,-1) | |
3428 FF(RegisterWindowMessageA,-1) | |
3429 FF(GetSystemMetrics,-1) | |
3430 FF(GetSysColor,-1) | |
3431 FF(GetSysColorBrush,-1) | |
3128 | 3432 FF(GetWindowDC, -1) |
1 | 3433 }; |
3434 struct exports exp_advapi32[]={ | |
3435 FF(RegOpenKeyA, -1) | |
3436 FF(RegOpenKeyExA, -1) | |
3437 FF(RegCreateKeyExA, -1) | |
3438 FF(RegQueryValueExA, -1) | |
3439 FF(RegSetValueExA, -1) | |
3440 FF(RegCloseKey, -1) | |
2069 | 3441 FF(RegEnumValueA, -1) |
1 | 3442 }; |
3443 struct exports exp_gdi32[]={ | |
3444 FF(CreateCompatibleDC, -1) | |
3445 FF(GetDeviceCaps, -1) | |
3446 FF(DeleteDC, -1) | |
3447 FF(GetSystemPaletteEntries, -1) | |
3128 | 3448 FF(CreateFontA, -1) |
1 | 3449 }; |
3450 struct exports exp_version[]={ | |
3451 FF(GetFileVersionInfoSizeA, -1) | |
3452 }; | |
128 | 3453 struct exports exp_ole32[]={ |
3454 FF(CoTaskMemAlloc, -1) | |
3455 FF(CoTaskMemFree, -1) | |
3456 FF(CoCreateInstance, -1) | |
3457 FF(StringFromGUID2, -1) | |
2396 | 3458 FF(CoCreateFreeThreadedMarshaler,-1) |
3033 | 3459 FF(CoInitialize, -1) |
128 | 3460 }; |
130 | 3461 struct exports exp_crtdll[]={ |
3462 FF(memcpy, -1) | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
3463 FF(wcscpy, -1) |
130 | 3464 }; |
2069 | 3465 struct exports exp_comctl32[]={ |
3466 FF(StringFromGUID2, -1) | |
3467 FF(InitCommonControls, 17) | |
3468 }; | |
1 | 3469 #define LL(X) \ |
3470 {#X".dll", sizeof(exp_##X)/sizeof(struct exports), exp_##X}, | |
3471 | |
3472 struct libs libraries[]={ | |
3473 LL(kernel32) | |
3474 LL(msvcrt) | |
3475 LL(winmm) | |
3476 LL(user32) | |
3477 LL(advapi32) | |
3478 LL(gdi32) | |
3479 LL(version) | |
128 | 3480 LL(ole32) |
130 | 3481 LL(crtdll) |
2069 | 3482 LL(comctl32) |
1 | 3483 }; |
3484 | |
2069 | 3485 |
1 | 3486 void* LookupExternal(const char* library, int ordinal) |
3487 { | |
3488 char* answ; | |
3489 int i,j; | |
3490 if(library==0) | |
3491 { | |
3492 printf("ERROR: library=0\n"); | |
3493 return (void*)ext_unknown; | |
3494 } | |
3495 // printf("%x %x\n", &unk_exp1, &unk_exp2); | |
3496 | |
3497 for(i=0; i<sizeof(libraries)/sizeof(struct libs); i++) | |
3498 { | |
3499 if(strcasecmp(library, libraries[i].name)) | |
3500 continue; | |
3501 for(j=0; j<libraries[i].length; j++) | |
3502 { | |
3503 if(ordinal!=libraries[i].exps[j].id) | |
3504 continue; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
3505 //printf("Hit: 0x%p\n", libraries[i].exps[j].func); |
1 | 3506 return libraries[i].exps[j].func; |
3507 } | |
3508 } | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
3509 printf("External func %s:%d\n", library, ordinal); |
1 | 3510 if(pos>150)return 0; |
3511 answ=(char*)extcode+pos*0x64; | |
3512 memcpy(answ, &unk_exp1, 0x64); | |
3513 *(int*)(answ+9)=pos; | |
3514 *(int*)(answ+47)-=((int)answ-(int)&unk_exp1); | |
3515 sprintf(export_names[pos], "%s:%d", library, ordinal); | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
3516 pos++; |
1 | 3517 return (void*)answ; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
3518 } |
1 | 3519 |
3520 void* LookupExternalByName(const char* library, const char* name) | |
3521 { | |
3522 char* answ; | |
3523 int i,j; | |
3524 // return (void*)ext_unknown; | |
3525 if(library==0) | |
3526 { | |
3527 printf("ERROR: library=0\n"); | |
3528 return (void*)ext_unknown; | |
3529 } | |
3530 if(name==0) | |
3531 { | |
3532 printf("ERROR: name=0\n"); | |
3533 return (void*)ext_unknown; | |
3534 } | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
3535 //printf("External func %s:%s\n", library, name); |
1 | 3536 for(i=0; i<sizeof(libraries)/sizeof(struct libs); i++) |
3537 { | |
3538 if(strcasecmp(library, libraries[i].name)) | |
3539 continue; | |
3540 for(j=0; j<libraries[i].length; j++) | |
3541 { | |
3542 if(strcmp(name, libraries[i].exps[j].name)) | |
3543 continue; | |
3544 // printf("Hit: 0x%08X\n", libraries[i].exps[j].func); | |
3545 return libraries[i].exps[j].func; | |
3546 } | |
3547 } | |
128 | 3548 // printf("%s %s\n", library, name); |
3549 if(pos>150)return 0; | |
1 | 3550 strcpy(export_names[pos], name); |
3551 answ=(char*)extcode+pos*0x64; | |
3552 memcpy(answ, &unk_exp1, 0x64); | |
3553 *(int*)(answ+9)=pos; | |
3554 *(int*)(answ+47)-=((int)answ-(int)&unk_exp1); | |
3555 pos++; | |
3556 return (void*)answ; | |
3557 // memcpy(extcode, &unk_exp1, 0x64); | |
3558 // *(int*)(extcode+52)-=((int)extcode-(int)&unk_exp1); | |
3559 // return (void*)extcode; | |
3560 // printf("Unknown func %s:%s\n", library, name); | |
3561 // return (void*)ext_unknown; | |
3562 } | |
3563 | |
2069 | 3564 void my_garbagecollection(void) |
128 | 3565 { |
3566 #ifdef GARBAGE | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
3567 int unfree = 0, unfreecnt = 0; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
3568 |
3134 | 3569 free_registry(); |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
3570 while (last_alloc) |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
3571 { |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
3572 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
|
3573 unfree += my_size(mem); |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
3574 unfreecnt++; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
3575 my_release(mem); |
128 | 3576 } |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
3577 printf("Total Unfree %d bytes cnt %d [%p,%d]\n",unfree, unfreecnt, last_alloc, alccnt); |
128 | 3578 #endif |
3134 | 3579 g_tls = NULL; |
3580 list = NULL; | |
128 | 3581 } |