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