Mercurial > mplayer.hg
annotate loader/win32.c @ 3435:7b78672b7ad4
support in dbgprintf for mp_msg (mplayer only)
author | alex |
---|---|
date | Mon, 10 Dec 2001 16:06:10 +0000 |
parents | ce4df7bff5e1 |
children | 03caf0beaecc |
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 | |
3128 | 1191 #undef CRITSECS_NEWTYPE |
1192 //#define CRITSECS_NEWTYPE 1 | |
1193 | |
1194 #ifdef CRITSECS_NEWTYPE | |
2579 | 1195 #define CRITSECS_LIST_MAX 20 |
1196 static struct critsecs_list_t critsecs_list[CRITSECS_LIST_MAX]; | |
1197 | |
1198 int critsecs_get_pos(CRITICAL_SECTION *cs_win) | |
1199 { | |
1200 int i; | |
3128 | 1201 |
2579 | 1202 for (i=0; i < CRITSECS_LIST_MAX; i++) |
1203 if (critsecs_list[i].cs_win == cs_win) | |
1204 return(i); | |
1205 return(-1); | |
1206 } | |
1207 | |
1208 int critsecs_get_unused(void) | |
1209 { | |
1210 int i; | |
3128 | 1211 |
2579 | 1212 for (i=0; i < CRITSECS_LIST_MAX; i++) |
1213 if (critsecs_list[i].cs_win == NULL) | |
1214 return(i); | |
1215 return(-1); | |
1216 } | |
1217 | |
1218 #if 0 | |
1219 #define critsecs_get_unix(cs_win) (critsecs_list[critsecs_get_pos(cs_win)].cs_win) | |
1220 #else | |
1221 struct CRITSECT *critsecs_get_unix(CRITICAL_SECTION *cs_win) | |
1222 { | |
1223 int i; | |
3128 | 1224 |
2579 | 1225 for (i=0; i < CRITSECS_LIST_MAX; i++) |
2670 | 1226 if (critsecs_list[i].cs_win == cs_win && critsecs_list[i].cs_unix) |
2579 | 1227 return(critsecs_list[i].cs_unix); |
1228 return(NULL); | |
1229 } | |
1230 #endif | |
3128 | 1231 #endif |
2579 | 1232 |
1 | 1233 void WINAPI expInitializeCriticalSection(CRITICAL_SECTION* c) |
1234 { | |
128 | 1235 dbgprintf("InitializeCriticalSection(0x%x)\n", c); |
1 | 1236 /* if(sizeof(pthread_mutex_t)>sizeof(CRITICAL_SECTION)) |
1237 { | |
1238 printf(" ERROR:::: sizeof(pthread_mutex_t) is %d, expected <=%d!\n", | |
1239 sizeof(pthread_mutex_t), sizeof(CRITICAL_SECTION)); | |
1240 return; | |
1241 }*/ | |
1242 /* pthread_mutex_init((pthread_mutex_t*)c, NULL); */ | |
2579 | 1243 #ifdef CRITSECS_NEWTYPE |
1244 { | |
1245 struct CRITSECT *cs; | |
1246 int i = critsecs_get_unused(); | |
1247 | |
1248 if (i < 0) | |
1249 { | |
1250 printf("InitializeCriticalSection(%p) - no more space in list\n", c); | |
1251 return; | |
1252 } | |
2670 | 1253 printf("got unused space at %d\n", i); |
1254 cs = expmalloc(sizeof(struct CRITSECT)); | |
1255 if (!cs) | |
1256 { | |
1257 printf("InitializeCriticalSection(%p) - out of memory\n", c); | |
1258 return; | |
1259 } | |
2579 | 1260 pthread_mutex_init(&cs->mutex, NULL); |
1261 cs->locked = 0; | |
1262 critsecs_list[i].cs_win = c; | |
1263 critsecs_list[i].cs_unix = cs; | |
1264 dbgprintf("InitializeCriticalSection -> itemno=%d, cs_win=%p, cs_unix=%p\n", | |
1265 i, c, cs); | |
1266 } | |
1267 #else | |
1268 { | |
3134 | 1269 struct CRITSECT* cs = mreq_private(sizeof(struct CRITSECT), 0, AREATYPE_CRITSECT); |
1270 pthread_mutex_init(&cs->mutex, NULL); | |
1271 cs->locked=0; | |
1272 *(void**)c = cs; | |
2579 | 1273 } |
1274 #endif | |
1 | 1275 return; |
2579 | 1276 } |
1277 | |
1 | 1278 void WINAPI expEnterCriticalSection(CRITICAL_SECTION* c) |
1279 { | |
2579 | 1280 #ifdef CRITSECS_NEWTYPE |
1281 struct CRITSECT* cs = critsecs_get_unix(c); | |
1282 #else | |
128 | 1283 struct CRITSECT* cs=*(struct CRITSECT**)c; |
2579 | 1284 #endif |
128 | 1285 dbgprintf("EnterCriticalSection(0x%x)\n",c); |
2069 | 1286 if (!cs) |
1287 { | |
2670 | 1288 printf("entered uninitialized critisec!\n"); |
2069 | 1289 expInitializeCriticalSection(c); |
2579 | 1290 #ifdef CRITSECS_NEWTYPE |
1291 cs=critsecs_get_unix(c); | |
1292 #else | |
2069 | 1293 cs=*(struct CRITSECT**)c; |
2579 | 1294 #endif |
2069 | 1295 printf("Win32 Warning: Accessed uninitialized Critical Section (%p)!\n", c); |
1296 } | |
1 | 1297 if(cs->locked) |
1298 if(cs->id==pthread_self()) | |
1299 return; | |
1300 pthread_mutex_lock(&(cs->mutex)); | |
1301 cs->locked=1; | |
1302 cs->id=pthread_self(); | |
1303 return; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1304 } |
1 | 1305 void WINAPI expLeaveCriticalSection(CRITICAL_SECTION* c) |
1306 { | |
2579 | 1307 #ifdef CRITSECS_NEWTYPE |
1308 struct CRITSECT* cs = critsecs_get_unix(c); | |
1309 #else | |
128 | 1310 struct CRITSECT* cs=*(struct CRITSECT**)c; |
2579 | 1311 #endif |
128 | 1312 // struct CRITSECT* cs=(struct CRITSECT*)c; |
1313 dbgprintf("LeaveCriticalSection(0x%x)\n",c); | |
2069 | 1314 if (!cs) |
1315 { | |
1316 printf("Win32 Warning: Leaving noninitialized Critical Section %p!!\n", c); | |
1317 return; | |
1318 } | |
1 | 1319 cs->locked=0; |
1320 pthread_mutex_unlock(&(cs->mutex)); | |
1321 return; | |
1322 } | |
1323 void WINAPI expDeleteCriticalSection(CRITICAL_SECTION *c) | |
1324 { | |
2579 | 1325 #ifdef CRITSECS_NEWTYPE |
1326 struct CRITSECT* cs = critsecs_get_unix(c); | |
1327 #else | |
128 | 1328 struct CRITSECT* cs=*(struct CRITSECT**)c; |
2579 | 1329 #endif |
128 | 1330 // struct CRITSECT* cs=(struct CRITSECT*)c; |
1331 dbgprintf("DeleteCriticalSection(0x%x)\n",c); | |
1332 pthread_mutex_destroy(&(cs->mutex)); | |
2579 | 1333 // free(cs); |
1334 #ifdef CRITSECS_NEWTYPE | |
1335 { | |
1336 int i = critsecs_get_pos(c); | |
3128 | 1337 |
2579 | 1338 if (i < 0) |
1339 { | |
1340 printf("DeleteCriticalSection(%p) error (critsec not found)\n", c); | |
1341 return; | |
1342 } | |
3128 | 1343 |
2579 | 1344 critsecs_list[i].cs_win = NULL; |
2670 | 1345 expfree(critsecs_list[i].cs_unix); |
2579 | 1346 critsecs_list[i].cs_unix = NULL; |
1347 dbgprintf("DeleteCriticalSection -> itemno=%d\n", i); | |
1348 } | |
1349 #endif | |
1 | 1350 return; |
1351 } | |
1352 int WINAPI expGetCurrentThreadId() | |
1353 { | |
128 | 1354 dbgprintf("GetCurrentThreadId() => %d\n", getpid()); |
1355 return getpid(); | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1356 } |
128 | 1357 int WINAPI expGetCurrentProcess() |
1358 { | |
1359 dbgprintf("GetCurrentProcess() => %d\n", getpid()); | |
1 | 1360 return getpid(); |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1361 } |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1362 |
2779 | 1363 extern void* fs_seg; |
1364 | |
3128 | 1365 #if 0 |
1366 // this version is required for Quicktime codecs (.qtx/.qts) to work. | |
1367 // (they assume some pointers at FS: segment) | |
1368 | |
2779 | 1369 //static int tls_count; |
1370 static int tls_use_map[64]; | |
1371 int WINAPI expTlsAlloc() | |
1372 { | |
1373 int i; | |
1374 for(i=0; i<64; i++) | |
1375 if(tls_use_map[i]==0) | |
1376 { | |
1377 tls_use_map[i]=1; | |
1378 return i; | |
1379 } | |
1380 return -1; | |
1381 } | |
1382 | |
1383 int WINAPI expTlsSetValue(int index, void* value) | |
1384 { | |
1385 if((index<0) || (index>64)) | |
1386 return 0; | |
1387 *(void**)((char*)fs_seg+0x88+4*index) = value; | |
1388 return 1; | |
1389 } | |
1390 | |
1391 void* WINAPI expTlsGetValue(int index) | |
1392 { | |
1393 if((index<0) || (index>64)) | |
1394 return 0; | |
1395 return *(void**)((char*)fs_seg+0x88+index); | |
1396 } | |
1397 | |
1398 int WINAPI expTlsFree(int index) | |
1399 { | |
1400 if((index<0) || (index>64)) | |
1401 return 0; | |
1402 tls_use_map[index]=0; | |
1403 return 1; | |
1404 } | |
1405 | |
1406 #else | |
2069 | 1407 struct tls_s { |
1 | 1408 void* value; |
1409 int used; | |
1410 struct tls_s* prev; | |
1411 struct tls_s* next; | |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1412 }; |
2069 | 1413 |
1 | 1414 void* WINAPI expTlsAlloc() |
1415 { | |
1416 if(g_tls==NULL) | |
1417 { | |
1418 g_tls=my_mreq(sizeof(tls_t), 0); | |
1419 g_tls->next=g_tls->prev=NULL; | |
1420 } | |
1421 else | |
1422 { | |
1423 g_tls->next=my_mreq(sizeof(tls_t), 0); | |
1424 g_tls->next->prev=g_tls; | |
1425 g_tls->next->next=NULL; | |
1426 g_tls=g_tls->next; | |
1427 } | |
128 | 1428 dbgprintf("TlsAlloc() => 0x%x\n", g_tls); |
2670 | 1429 if (g_tls) |
1430 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
|
1431 return g_tls; |
1 | 1432 } |
1433 | |
1434 int WINAPI expTlsSetValue(tls_t* index, void* value) | |
1435 { | |
128 | 1436 int result; |
1 | 1437 if(index==0) |
128 | 1438 result=0; |
1439 else | |
1440 { | |
1441 index->value=value; | |
1442 result=1; | |
1443 } | |
1444 dbgprintf("TlsSetValue(index 0x%x, value 0x%x) => %d \n", index, value, result ); | |
1445 return result; | |
1 | 1446 } |
1447 void* WINAPI expTlsGetValue(tls_t* index) | |
1448 { | |
128 | 1449 void* result; |
1 | 1450 if(index==0) |
128 | 1451 result=0; |
1452 else | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1453 result=index->value; |
128 | 1454 dbgprintf("TlsGetValue(index 0x%x) => 0x%x\n", index, result); |
1455 return result; | |
1 | 1456 } |
1457 int WINAPI expTlsFree(tls_t* index) | |
1458 { | |
128 | 1459 int result; |
1 | 1460 if(index==0) |
128 | 1461 result=0; |
1462 else | |
1463 { | |
1464 if(index->next) | |
1465 index->next->prev=index->prev; | |
1466 if(index->prev) | |
1467 index->prev->next=index->next; | |
1468 my_release((void*)index); | |
1469 result=1; | |
1470 } | |
1471 dbgprintf("TlsFree(index 0x%x) => %d\n", index, result); | |
1472 return result; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1473 } |
2779 | 1474 #endif |
1475 | |
1 | 1476 void* WINAPI expLocalAlloc(int flags, int size) |
1477 { | |
1478 void* z; | |
1479 if(flags&GMEM_ZEROINIT) | |
1480 z=my_mreq(size, 1); | |
1481 else | |
1482 z=my_mreq(size, 0); | |
1483 if(z==0) | |
1484 printf("LocalAlloc() failed\n"); | |
128 | 1485 dbgprintf("LocalAlloc(%d, flags 0x%x) => 0x%x\n", size, flags, z); |
1 | 1486 return z; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1487 } |
2069 | 1488 |
1489 void* WINAPI expLocalReAlloc(int handle,int size, int flags) | |
1490 { | |
1491 void *newpointer; | |
1492 int oldsize; | |
1493 | |
1494 newpointer=NULL; | |
1495 if (flags & LMEM_MODIFY) { | |
1496 dbgprintf("LocalReAlloc MODIFY\n"); | |
1497 return (void *)handle; | |
1498 } | |
1499 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
|
1500 newpointer = my_realloc((void *)handle,size); |
2069 | 1501 dbgprintf("LocalReAlloc(%x %d(old %d), flags 0x%x) => 0x%x\n", handle,size,oldsize, flags,newpointer); |
1502 | |
1503 return newpointer; | |
1504 } | |
1505 | |
1 | 1506 void* WINAPI expLocalLock(void* z) |
1507 { | |
128 | 1508 dbgprintf("LocalLock(0x%x) => 0x%x\n", z, z); |
1 | 1509 return z; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1510 } |
128 | 1511 |
1 | 1512 void* WINAPI expGlobalAlloc(int flags, int size) |
1513 { | |
1514 void* z; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1515 dbgprintf("GlobalAlloc(%d, flags 0x%X)\n", size, flags); |
1 | 1516 if(flags&GMEM_ZEROINIT) |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1517 z=my_mreq(size, 1); |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1518 //z=calloc(size, 1); |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1519 else |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1520 z=my_mreq(size, 0); |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1521 //z=malloc(size); |
1 | 1522 if(z==0) |
128 | 1523 printf("GlobalAlloc() failed\n"); |
1524 dbgprintf("GlobalAlloc(%d, flags 0x%x) => 0x%x\n", size, flags, z); | |
1 | 1525 return z; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1526 } |
1 | 1527 void* WINAPI expGlobalLock(void* z) |
1528 { | |
128 | 1529 dbgprintf("GlobalLock(0x%x) => 0x%x\n", z, z); |
1 | 1530 return z; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1531 } |
3128 | 1532 // pvmjpg20 - but doesn't work anyway |
1533 int WINAPI expGlobalSize(void* amem) | |
1534 { | |
1535 int size = 100000; | |
1536 #ifdef GARBAGE | |
1537 alloc_header* header = last_alloc; | |
1538 alloc_header* mem = (alloc_header*) amem - 1; | |
1539 if (amem == 0) | |
1540 return 0; | |
1541 pthread_mutex_lock(&memmut); | |
1542 while (header) | |
1543 { | |
1544 if (header->deadbeef != 0xdeadbeef) | |
1545 { | |
1546 printf("FATAL found corrupted memory! %p 0x%lx (%d)\n", header, header->deadbeef, alccnt); | |
1547 break; | |
1548 } | |
1549 | |
1550 if (header == mem) | |
1551 { | |
1552 size = header->size; | |
1553 break; | |
1554 } | |
1555 | |
1556 header = header->prev; | |
1557 } | |
1558 pthread_mutex_unlock(&memmut); | |
1559 #endif | |
1560 | |
1561 dbgprintf("GlobalSize(0x%x)\n", amem); | |
1562 return size; | |
1563 } | |
1 | 1564 int WINAPI expLoadStringA(long instance, long id, void* buf, long size) |
1565 { | |
128 | 1566 int result=LoadStringA(instance, id, buf, size); |
1567 // if(buf) | |
1568 dbgprintf("LoadStringA(instance 0x%x, id 0x%x, buffer 0x%x, size %d) => %d ( %s )\n", | |
1569 instance, id, buf, size, result, buf); | |
1570 // else | |
1571 // 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
|
1572 // instance, id, buf, size, result); |
128 | 1573 return result; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1574 } |
1 | 1575 |
128 | 1576 long WINAPI expMultiByteToWideChar(long v1, long v2, char* s1, long siz1, short* s2, int siz2) |
1 | 1577 { |
1578 #warning FIXME | |
128 | 1579 int i; |
1580 int result; | |
1 | 1581 if(s2==0) |
128 | 1582 result=1; |
1583 else | |
1584 { | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1585 if(siz1>siz2/2)siz1=siz2/2; |
128 | 1586 for(i=1; i<=siz1; i++) |
1587 { | |
1588 *s2=*s1; | |
1589 if(!*s1)break; | |
1590 s2++; | |
1591 s1++; | |
1592 } | |
1593 result=i; | |
1594 } | |
1595 if(s1) | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1596 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
|
1597 "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
|
1598 v1, v2, s1, s1, siz1, s2, siz2, result); |
128 | 1599 else |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1600 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
|
1601 "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
|
1602 v1, v2, siz1, s2, siz2, result); |
128 | 1603 return result; |
1604 } | |
1605 static void wch_print(const short* str) | |
1606 { | |
1607 dbgprintf(" src: "); | |
1608 while(*str)dbgprintf("%c", *str++); | |
1609 dbgprintf("\n"); | |
1 | 1610 } |
1611 long WINAPI expWideCharToMultiByte(long v1, long v2, short* s1, long siz1, char* s2, int siz2, char* c3, int* siz3) | |
1612 { | |
1613 int result; | |
128 | 1614 dbgprintf("WideCharToMultiByte(codepage %d, flags 0x%x, src 0x%x, src size %d, " |
1615 "dest 0x%x, dest size %d, defch 0x%x, used_defch 0x%x)", v1, v2, s1, siz1, s2, siz2, c3, siz3); | |
1 | 1616 result=WideCharToMultiByte(v1, v2, s1, siz1, s2, siz2, c3, siz3); |
1617 dbgprintf("=> %d\n", result); | |
2069 | 1618 //if(s1)wch_print(s1); |
128 | 1619 if(s2)dbgprintf(" dest: %s\n", s2); |
1 | 1620 return result; |
1621 } | |
1622 long WINAPI expGetVersionExA(OSVERSIONINFOA* c) | |
1623 { | |
128 | 1624 dbgprintf("GetVersionExA(0x%x) => 1\n"); |
1625 c->dwOSVersionInfoSize=sizeof(*c); | |
1 | 1626 c->dwMajorVersion=4; |
128 | 1627 c->dwMinorVersion=0; |
1628 c->dwBuildNumber=0x4000457; | |
2069 | 1629 #if 0 |
1630 // leave it here for testing win9x-only codecs | |
1 | 1631 c->dwPlatformId=VER_PLATFORM_WIN32_WINDOWS; |
128 | 1632 strcpy(c->szCSDVersion, " B"); |
2069 | 1633 #else |
1634 c->dwPlatformId=VER_PLATFORM_WIN32_NT; // let's not make DLL assume that it can read CR* registers | |
1635 strcpy(c->szCSDVersion, "Service Pack 3"); | |
1636 #endif | |
128 | 1637 dbgprintf(" Major version: 4\n Minor version: 0\n Build number: 0x4000457\n" |
2069 | 1638 " Platform Id: VER_PLATFORM_WIN32_NT\n Version string: 'Service Pack 3'\n"); |
1 | 1639 return 1; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1640 } |
1 | 1641 HANDLE WINAPI expCreateSemaphoreA(char* v1, long init_count, long max_count, char* name) |
1642 { | |
128 | 1643 pthread_mutex_t *pm; |
1644 pthread_cond_t *pc; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1645 mutex_list* pp; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1646 /* |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1647 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
|
1648 pp=mlist; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1649 while(pp) |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1650 { |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1651 printf("%p => ", pp); |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1652 pp=pp->prev; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1653 } |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1654 printf("0\n"); |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1655 */ |
128 | 1656 if(mlist!=NULL) |
1 | 1657 { |
128 | 1658 mutex_list* pp=mlist; |
1659 if(name!=NULL) | |
1660 do | |
1661 { | |
1662 if((strcmp(pp->name, name)==0) && (pp->type==1)) | |
1663 { | |
1664 dbgprintf("CreateSemaphoreA(0x%x, init_count %d, max_count %d, name 0x%x='%s') => 0x%x", | |
1665 v1, init_count, max_count, name, name, mlist); | |
1666 return (HANDLE)mlist; | |
1667 } | |
2069 | 1668 }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
|
1669 } |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1670 pm=mreq_private(sizeof(pthread_mutex_t), 0, AREATYPE_MUTEX); |
128 | 1671 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
|
1672 pc=mreq_private(sizeof(pthread_cond_t), 0, AREATYPE_COND); |
128 | 1673 pthread_cond_init(pc, NULL); |
1674 if(mlist==NULL) | |
1675 { | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1676 mlist=mreq_private(sizeof(mutex_list), 00, AREATYPE_EVENT); |
128 | 1677 mlist->next=mlist->prev=NULL; |
1678 } | |
1679 else | |
1 | 1680 { |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1681 mlist->next=mreq_private(sizeof(mutex_list), 00, AREATYPE_EVENT); |
128 | 1682 mlist->next->prev=mlist; |
1683 mlist->next->next=NULL; | |
1684 mlist=mlist->next; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1685 // printf("new semaphore %p\n", mlist); |
1 | 1686 } |
128 | 1687 mlist->type=1; /* Type Semaphore */ |
1688 mlist->pm=pm; | |
1689 mlist->pc=pc; | |
1690 mlist->state=0; | |
1691 mlist->reset=0; | |
1692 mlist->semaphore=init_count; | |
1693 if(name!=NULL) | |
1694 strncpy(mlist->name, name, 64); | |
1695 else | |
1696 mlist->name[0]=0; | |
1697 if(pm==NULL) | |
1698 dbgprintf("ERROR::: CreateSemaphoreA failure\n"); | |
1699 if(name) | |
1700 dbgprintf("CreateSemaphoreA(0x%x, init_count %d, max_count %d, name 0x%x='%s') => 0x%x", | |
1701 v1, init_count, max_count, name, name, mlist); | |
1702 else | |
1703 dbgprintf("CreateSemaphoreA(0x%x, init_count %d, max_count %d, name 0) => 0x%x", | |
1704 v1, init_count, max_count, mlist); | |
1705 return (HANDLE)mlist; | |
1 | 1706 } |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1707 |
1 | 1708 long WINAPI expReleaseSemaphore(long hsem, long increment, long* prev_count) |
1709 { | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1710 // The state of a semaphore object is signaled when its count |
1 | 1711 // is greater than zero and nonsignaled when its count is equal to zero |
1712 // 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
|
1713 // state, the count of the semaphore is decreased by one. |
128 | 1714 mutex_list *ml = (mutex_list *)hsem; |
1 | 1715 |
128 | 1716 pthread_mutex_lock(ml->pm); |
1717 if (prev_count != 0) *prev_count = ml->semaphore; | |
1718 if (ml->semaphore == 0) pthread_cond_signal(ml->pc); | |
1719 ml->semaphore += increment; | |
1720 pthread_mutex_unlock(ml->pm); | |
1721 dbgprintf("ReleaseSemaphore(semaphore 0x%x, increment %d, prev_count 0x%x) => 1\n", | |
1722 hsem, increment, prev_count); | |
1723 return 1; | |
1 | 1724 } |
1725 | |
1726 | |
1727 long WINAPI expRegOpenKeyExA(long key, const char* subkey, long reserved, long access, int* newkey) | |
1728 { | |
128 | 1729 long result=RegOpenKeyExA(key, subkey, reserved, access, newkey); |
1730 dbgprintf("RegOpenKeyExA(key 0x%x, subkey %s, reserved %d, access 0x%x, pnewkey 0x%x) => %d\n", | |
1731 key, subkey, reserved, access, newkey, result); | |
1732 if(newkey)dbgprintf(" New key: 0x%x\n", *newkey); | |
1733 return result; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1734 } |
1 | 1735 long WINAPI expRegCloseKey(long key) |
1736 { | |
128 | 1737 long result=RegCloseKey(key); |
1738 dbgprintf("RegCloseKey(0x%x) => %d\n", key, result); | |
1739 return result; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1740 } |
1 | 1741 long WINAPI expRegQueryValueExA(long key, const char* value, int* reserved, int* type, int* data, int* count) |
1742 { | |
128 | 1743 long result=RegQueryValueExA(key, value, reserved, type, data, count); |
1744 dbgprintf("RegQueryValueExA(key 0x%x, value %s, reserved 0x%x, data 0x%x, count 0x%x)" | |
1745 " => 0x%x\n", key, value, reserved, data, count, result); | |
1746 if(data && count)dbgprintf(" read %d bytes: '%s'\n", *count, data); | |
1747 return result; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1748 } |
1 | 1749 long WINAPI expRegCreateKeyExA(long key, const char* name, long reserved, |
1750 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
|
1751 void* sec_attr, int* newkey, int* status) |
1 | 1752 { |
128 | 1753 long result=RegCreateKeyExA(key, name, reserved, classs, options, security, sec_attr, newkey, status); |
1754 dbgprintf("RegCreateKeyExA(key 0x%x, name 0x%x='%s', reserved=0x%x," | |
1755 " 0x%x, 0x%x, 0x%x, newkey=0x%x, status=0x%x) => %d\n", | |
1756 key, name, name, reserved, classs, options, security, sec_attr, newkey, status, result); | |
1757 if(!result && newkey) dbgprintf(" New key: 0x%x\n", *newkey); | |
1758 if(!result && status) dbgprintf(" New key status: 0x%x\n", *status); | |
1759 return result; | |
1 | 1760 } |
1761 long WINAPI expRegSetValueExA(long key, const char* name, long v1, long v2, void* data, long size) | |
1762 { | |
128 | 1763 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
|
1764 dbgprintf("RegSetValueExA(key 0x%x, name '%s', 0x%x, 0x%x, data 0x%x -> 0x%x '%s', size=%d) => %d", |
128 | 1765 key, name, v1, v2, data, *(int*)data, data, size, result); |
1766 return result; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1767 } |
1 | 1768 |
3134 | 1769 long WINAPI expRegOpenKeyA (long hKey, LPCSTR lpSubKey, int* phkResult) |
1770 { | |
128 | 1771 long result=RegOpenKeyExA(hKey, lpSubKey, 0, 0, phkResult); |
1772 dbgprintf("RegOpenKeyExA(key 0x%x, subkey '%s', 0x%x) => %d\n", | |
1773 hKey, lpSubKey, phkResult, result); | |
1774 if(!result && phkResult) dbgprintf(" New key: 0x%x\n", *phkResult); | |
1775 return result; | |
1 | 1776 } |
1777 | |
2069 | 1778 DWORD WINAPI expRegEnumValueA(HKEY hkey, DWORD index, LPSTR value, LPDWORD val_count, |
1779 LPDWORD reserved, LPDWORD type, LPBYTE data, LPDWORD count) | |
1780 { | |
1781 return RegEnumValueA(hkey, index, value, val_count, | |
1782 reserved, type, data, count); | |
1783 } | |
1784 | |
1 | 1785 long WINAPI expQueryPerformanceCounter(long long* z) |
1786 { | |
1787 longcount(z); | |
128 | 1788 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
|
1789 return 1; |
1 | 1790 } |
1791 | |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1792 /* |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1793 * 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
|
1794 */ |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1795 static double linux_cpuinfo_freq() |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1796 { |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1797 double freq=-1; |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1798 FILE *f; |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1799 char line[200]; |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1800 char *s,*value; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1801 |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1802 f = fopen ("/proc/cpuinfo", "r"); |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1803 if (f != NULL) { |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1804 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
|
1805 /* 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
|
1806 if (!(value = strchr(line,':'))) |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1807 continue; |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1808 /* terminate the valuename */ |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1809 *value++ = '\0'; |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1810 /* skip any leading spaces */ |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1811 while (*value==' ') value++; |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1812 if ((s=strchr(value,'\n'))) |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1813 *s='\0'; |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1814 |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1815 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
|
1816 && sscanf(value, "%lf", &freq) == 1) { |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1817 freq*=1000; |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1818 break; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1819 } |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1820 } |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1821 fclose(f); |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1822 } |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1823 return freq; |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1824 } |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1825 |
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 static double |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1828 solaris_kstat_freq() |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1829 { |
1679
73c8f54305b1
Add a few ifdefs, so that the code compiles on old solaris releases (2.6 and 7)
jkeil
parents:
1543
diff
changeset
|
1830 #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
|
1831 /* |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1832 * 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
|
1833 */ |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1834 kstat_ctl_t *kc; |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1835 kstat_t *ksp; |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1836 kstat_named_t *kdata; |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1837 int mhz = 0; |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1838 |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1839 kc = kstat_open(); |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1840 if (kc != NULL) |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1841 { |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1842 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
|
1843 |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1844 /* 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
|
1845 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
|
1846 { |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1847 /* 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
|
1848 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
|
1849 { |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1850 /* |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1851 * 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
|
1852 * data type |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1853 */ |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1854 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
|
1855 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
|
1856 mhz = kdata->value.i32; |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1857 } |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1858 } |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1859 kstat_close(kc); |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1860 } |
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 if (mhz > 0) |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1863 return mhz * 1000.; |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1864 #endif /* HAVE_LIBKSTAT */ |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1865 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
|
1866 } |
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 * 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
|
1870 */ |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1871 static double tsc_freq() |
1 | 1872 { |
128 | 1873 static double ofreq=0.0; |
1874 int i; | |
1 | 1875 int x,y; |
128 | 1876 i=time(NULL); |
1877 if (ofreq != 0.0) return ofreq; | |
1 | 1878 while(i==time(NULL)); |
1879 x=localcount(); | |
1880 i++; | |
1881 while(i==time(NULL)); | |
1882 y=localcount(); | |
128 | 1883 ofreq = (double)(y-x)/1000.; |
1884 return ofreq; | |
1 | 1885 } |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1886 |
1 | 1887 static double CPU_Freq() |
1888 { | |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1889 double freq; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1890 |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1891 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
|
1892 return freq; |
1 | 1893 |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1894 if ((freq = solaris_kstat_freq()) > 0) |
1 | 1895 return freq; |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
1096
diff
changeset
|
1896 |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1897 return tsc_freq(); |
1 | 1898 } |
1899 | |
1900 long WINAPI expQueryPerformanceFrequency(long long* z) | |
1901 { | |
1902 *z=(long long)CPU_Freq(); | |
128 | 1903 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
|
1904 return 1; |
1 | 1905 } |
1906 long WINAPI exptimeGetTime() | |
1907 { | |
1908 struct timeval t; | |
128 | 1909 long result; |
1 | 1910 gettimeofday(&t, 0); |
128 | 1911 result=1000*t.tv_sec+t.tv_usec/1000; |
1912 dbgprintf("timeGetTime() => %d\n", result); | |
1913 return result; | |
1 | 1914 } |
1915 void* WINAPI expLocalHandle(void* v) | |
1916 { | |
128 | 1917 dbgprintf("LocalHandle(0x%x) => 0x%x\n", v, v); |
1 | 1918 return v; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1919 } |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1920 |
1 | 1921 void* WINAPI expGlobalHandle(void* v) |
1922 { | |
128 | 1923 dbgprintf("GlobalHandle(0x%x) => 0x%x\n", v, v); |
1 | 1924 return v; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1925 } |
1 | 1926 int WINAPI expGlobalUnlock(void* v) |
1927 { | |
128 | 1928 dbgprintf("GlobalUnlock(0x%x) => 1\n", v); |
1 | 1929 return 1; |
1930 } | |
1931 void* WINAPI expGlobalFree(void* v) | |
1932 { | |
128 | 1933 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
|
1934 my_release(v); |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1935 //free(v); |
1 | 1936 return 0; |
128 | 1937 } |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1938 |
128 | 1939 void* WINAPI expGlobalReAlloc(void* v, int size, int flags) |
1940 { | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1941 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
|
1942 //void* result=realloc(v, size); |
128 | 1943 dbgprintf("GlobalReAlloc(0x%x, size %d, flags 0x%x) => 0x%x\n", v,size,flags,result); |
1944 return result; | |
1945 } | |
1 | 1946 |
1947 int WINAPI expLocalUnlock(void* v) | |
1948 { | |
128 | 1949 dbgprintf("LocalUnlock(0x%x) => 1\n", v); |
1 | 1950 return 1; |
1951 } | |
128 | 1952 // |
1 | 1953 void* WINAPI expLocalFree(void* v) |
1954 { | |
128 | 1955 dbgprintf("LocalFree(0x%x) => 0\n", v); |
1 | 1956 my_release(v); |
1957 return 0; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1958 } |
1 | 1959 HRSRC WINAPI expFindResourceA(HMODULE module, char* name, char* type) |
1960 { | |
128 | 1961 HRSRC result=FindResourceA(module, name, type); |
1962 dbgprintf("FindResourceA(module 0x%x, name 0x%x, type 0x%x) => 0x%x\n", module, name, type, result); | |
1963 return result; | |
1 | 1964 } |
128 | 1965 extern HRSRC WINAPI LoadResource(HMODULE, HRSRC); |
1 | 1966 HGLOBAL WINAPI expLoadResource(HMODULE module, HRSRC res) |
1967 { | |
128 | 1968 HGLOBAL result=LoadResource(module, res); |
1969 dbgprintf("LoadResource(module 0x%x, resource 0x%x) => 0x%x\n", module, res, result); | |
1970 return result; | |
1 | 1971 } |
1972 void* WINAPI expLockResource(long res) | |
1973 { | |
128 | 1974 void* result=LockResource(res); |
1975 dbgprintf("LockResource(0x%x) => 0x%x\n", res, result); | |
1976 return result; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1977 } |
1 | 1978 int WINAPI expFreeResource(long res) |
1979 { | |
128 | 1980 int result=FreeResource(res); |
1981 dbgprintf("FreeResource(0x%x) => %d\n", res, result); | |
1982 return result; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1983 } |
1 | 1984 //bool fun(HANDLE) |
1985 //!0 on success | |
1986 int WINAPI expCloseHandle(long v1) | |
1987 { | |
128 | 1988 dbgprintf("CloseHandle(0x%x) => 1\n", v1); |
1 | 1989 return 1; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
1990 } |
1 | 1991 |
1992 const char* WINAPI expGetCommandLineA() | |
1993 { | |
128 | 1994 dbgprintf("GetCommandLineA() => \"c:\\aviplay.exe\"\n"); |
1 | 1995 return "c:\\aviplay.exe"; |
1996 } | |
128 | 1997 static short envs[]={'p', 'a', 't', 'h', ' ', 'c', ':', '\\', 0, 0}; |
1 | 1998 LPWSTR WINAPI expGetEnvironmentStringsW() |
1999 { | |
128 | 2000 dbgprintf("GetEnvironmentStringsW() => 0\n", envs); |
2001 return 0; | |
1 | 2002 } |
121 | 2003 void * WINAPI expRtlZeroMemory(void *p, size_t len) |
2004 { | |
2005 void* result=memset(p,0,len); | |
2006 dbgprintf("RtlZeroMemory(0x%x, len %d) => 0x%x\n",p,len,result); | |
2007 return result; | |
2008 } | |
2009 void * WINAPI expRtlMoveMemory(void *dst, void *src, size_t len) | |
2010 { | |
2011 void* result=memmove(dst,src,len); | |
2012 dbgprintf("RtlMoveMemory (dest 0x%x, src 0x%x, len %d) => 0x%x\n",dst,src,len,result); | |
2013 return result; | |
2014 } | |
2015 | |
2016 void * WINAPI expRtlFillMemory(void *p, int ch, size_t len) | |
2017 { | |
2018 void* result=memset(p,ch,len); | |
2019 dbgprintf("RtlFillMemory(0x%x, char 0x%x, len %d) => 0x%x\n",p,ch,len,result); | |
2020 return result; | |
2021 } | |
1 | 2022 int WINAPI expFreeEnvironmentStringsW(short* strings) |
2023 { | |
128 | 2024 dbgprintf("FreeEnvironmentStringsW(0x%x) => 1\n", strings); |
1 | 2025 return 1; |
2026 } | |
128 | 2027 int WINAPI expFreeEnvironmentStringsA(char* strings) |
2028 { | |
2029 dbgprintf("FreeEnvironmentStringsA(0x%x) => 1\n", strings); | |
2030 return 1; | |
2031 } | |
2032 static const char ch_envs[]= | |
2033 "__MSVCRT_HEAP_SELECT=__GLOBAL_HEAP_SELECTED,1\r\n" | |
2034 "PATH=C:\\;C:\\windows\\;C:\\windows\\system\r\n"; | |
1 | 2035 LPCSTR WINAPI expGetEnvironmentStrings() |
2036 { | |
128 | 2037 dbgprintf("GetEnvironmentStrings() => 0x%x\n", ch_envs); |
2038 return (LPCSTR)ch_envs; | |
2039 // dbgprintf("GetEnvironmentStrings() => 0\n"); | |
2040 // return 0; | |
1 | 2041 } |
2042 | |
2043 int WINAPI expGetStartupInfoA(STARTUPINFOA *s) | |
2044 { | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2045 int i; |
128 | 2046 dbgprintf("GetStartupInfoA(0x%x) => 1\n"); |
1 | 2047 memset(s, 0, sizeof(*s)); |
2048 s->cb=sizeof(*s); | |
128 | 2049 // s->lpReserved="Reserved"; |
2050 // s->lpDesktop="Desktop"; | |
2051 // s->lpTitle="Title"; | |
2052 // s->dwX=s->dwY=0; | |
2053 // s->dwXSize=s->dwYSize=200; | |
2054 s->dwFlags=s->wShowWindow=1; | |
2055 // s->hStdInput=s->hStdOutput=s->hStdError=0x1234; | |
2056 dbgprintf(" cb=%d\n", s->cb); | |
2057 dbgprintf(" lpReserved='%s'\n", s->lpReserved); | |
2058 dbgprintf(" lpDesktop='%s'\n", s->lpDesktop); | |
2059 dbgprintf(" lpTitle='%s'\n", s->lpTitle); | |
2060 dbgprintf(" dwX=%d dwY=%d dwXSize=%d dwYSize=%d\n", | |
2061 s->dwX, s->dwY, s->dwXSize, s->dwYSize); | |
2062 dbgprintf(" dwXCountChars=%d dwYCountChars=%d dwFillAttribute=%d\n", | |
2063 s->dwXCountChars, s->dwYCountChars, s->dwFillAttribute); | |
2064 dbgprintf(" dwFlags=0x%x wShowWindow=0x%x cbReserved2=0x%x\n", | |
2065 s->dwFlags, s->wShowWindow, s->cbReserved2); | |
2066 dbgprintf(" lpReserved2=0x%x hStdInput=0x%x hStdOutput=0x%x hStdError=0x%x\n", | |
2067 s->lpReserved2, s->hStdInput, s->hStdOutput, s->hStdError); | |
1 | 2068 return 1; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2069 } |
1 | 2070 |
2071 int WINAPI expGetStdHandle(int z) | |
2072 { | |
128 | 2073 dbgprintf("GetStdHandle(0x%x) => 0x%x\n", z+0x1234); |
2074 return z+0x1234; | |
1 | 2075 } |
2076 int WINAPI expGetFileType(int handle) | |
2077 { | |
128 | 2078 dbgprintf("GetFileType(0x%x) => 0x3 = pipe\n", handle); |
2079 return 0x3; | |
1 | 2080 } |
2081 int WINAPI expSetHandleCount(int count) | |
2082 { | |
128 | 2083 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
|
2084 return 1; |
1 | 2085 } |
2086 int WINAPI expGetACP() | |
2087 { | |
128 | 2088 dbgprintf("GetACP() => 0\n"); |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2089 return 0; |
1 | 2090 } |
2091 extern WINE_MODREF *MODULE32_LookupHMODULE(HMODULE m); | |
2092 int WINAPI expGetModuleFileNameA(int module, char* s, int len) | |
2093 { | |
2094 WINE_MODREF *mr; | |
128 | 2095 int result; |
1 | 2096 // printf("File name of module %X requested\n", module); |
2097 if(s==0) | |
128 | 2098 result=0; |
2099 else | |
1 | 2100 if(len<35) |
128 | 2101 result=0; |
2102 else | |
1 | 2103 { |
128 | 2104 result=1; |
2105 strcpy(s, "c:\\windows\\system\\"); | |
2106 mr=MODULE32_LookupHMODULE(module); | |
2107 if(mr==0)//oops | |
2108 strcat(s, "aviplay.dll"); | |
2109 else | |
2110 if(strrchr(mr->filename, '/')==NULL) | |
2111 strcat(s, mr->filename); | |
2112 else | |
2113 strcat(s, strrchr(mr->filename, '/')+1); | |
2114 } | |
2115 if(!s) | |
2116 dbgprintf("GetModuleFileNameA(0x%x, 0x%x, %d) => %d\n", | |
2117 module, s, len, result); | |
1 | 2118 else |
128 | 2119 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
|
2120 module, s, len, result, s); |
128 | 2121 return result; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2122 } |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2123 |
1 | 2124 int WINAPI expSetUnhandledExceptionFilter(void* filter) |
2125 { | |
128 | 2126 dbgprintf("SetUnhandledExceptionFilter(0x%x) => 1\n", filter); |
1 | 2127 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
|
2128 } |
2069 | 2129 |
1 | 2130 int WINAPI expLoadLibraryA(char* name) |
2131 { | |
2069 | 2132 int result = 0; |
713 | 2133 char* lastbc; |
2069 | 2134 int i; |
713 | 2135 if (!name) |
2136 return -1; | |
2137 // we skip to the last backslash | |
2138 // this is effectively eliminating weird characters in | |
2139 // the text output windows | |
2069 | 2140 |
713 | 2141 lastbc = strrchr(name, '\\'); |
2142 if (lastbc) | |
2143 { | |
2144 int i; | |
2145 lastbc++; | |
2146 for (i = 0; 1 ;i++) | |
2147 { | |
2148 name[i] = *lastbc++; | |
2149 if (!name[i]) | |
2150 break; | |
2151 } | |
2152 } | |
2069 | 2153 if(strncmp(name, "c:\\windows\\", 11)==0) name += 11; |
1416 | 2154 if(strncmp(name, ".\\", 2)==0) name += 2; |
2069 | 2155 |
2156 dbgprintf("Entering LoadLibraryA(%s)\n", name); | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2157 // PIMJ is loading kernel32.dll |
3128 | 2158 if (strcasecmp(name, "kernel32.dll") == 0) |
2159 return MODULE_HANDLE_kernel32; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2160 |
2069 | 2161 result=LoadLibraryA(name); |
2162 dbgprintf("Returned LoadLibraryA(0x%x='%s'), def_path=%s => 0x%x\n", name, name, def_path, result); | |
2163 | |
128 | 2164 return result; |
2069 | 2165 } |
1 | 2166 int WINAPI expFreeLibrary(int module) |
2167 { | |
128 | 2168 int result=FreeLibrary(module); |
2169 dbgprintf("FreeLibrary(0x%x) => %d\n", module, result); | |
2170 return result; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2171 } |
1 | 2172 void* WINAPI expGetProcAddress(HMODULE mod, char* name) |
2173 { | |
2069 | 2174 void* result; |
2175 if(mod!=MODULE_HANDLE_kernel32) | |
128 | 2176 result=GetProcAddress(mod, name); |
2177 else | |
2178 result=LookupExternalByName("kernel32.dll", name); | |
2179 dbgprintf("GetProcAddress(0x%x, '%s') => 0x%x\n", mod, name, result); | |
2180 return result; | |
2069 | 2181 } |
1 | 2182 |
2183 long WINAPI expCreateFileMappingA(int hFile, void* lpAttr, | |
2184 long flProtect, long dwMaxHigh, long dwMaxLow, const char* name) | |
2185 { | |
128 | 2186 long result=CreateFileMappingA(hFile, lpAttr, flProtect, dwMaxHigh, dwMaxLow, name); |
2187 if(!name) | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2188 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
|
2189 "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
|
2190 hFile, lpAttr, flProtect, dwMaxHigh, dwMaxLow, result); |
128 | 2191 else |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2192 dbgprintf("CreateFileMappingA(file 0x%x, lpAttr 0x%x," |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2193 "flProtect 0x%x, dwMaxHigh 0x%x, dwMaxLow 0x%x, name 0x%x='%s') => %d\n", |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2194 hFile, lpAttr, flProtect, dwMaxHigh, dwMaxLow, name, name, result); |
128 | 2195 return result; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2196 } |
1 | 2197 |
2198 long WINAPI expOpenFileMappingA(long hFile, long hz, const char* name) | |
2199 { | |
128 | 2200 long result=OpenFileMappingA(hFile, hz, name); |
2201 if(!name) | |
2202 dbgprintf("OpenFileMappingA(0x%x, 0x%x, 0) => %d\n", | |
2203 hFile, hz, result); | |
2204 else | |
2205 dbgprintf("OpenFileMappingA(0x%x, 0x%x, 0x%x='%s') => %d\n", | |
2206 hFile, hz, name, name, result); | |
2207 return result; | |
1 | 2208 } |
2209 | |
2210 void* WINAPI expMapViewOfFile(HANDLE file, DWORD mode, DWORD offHigh, DWORD offLow, DWORD size) | |
2211 { | |
128 | 2212 dbgprintf("MapViewOfFile(0x%x, 0x%x, 0x%x, 0x%x, size %d) => 0x%x\n", |
2213 file,mode,offHigh,offLow,size,(char*)file+offLow); | |
1 | 2214 return (char*)file+offLow; |
2215 } | |
2216 | |
2217 void* WINAPI expUnmapViewOfFile(void* view) | |
2218 { | |
128 | 2219 dbgprintf("UnmapViewOfFile(0x%x) => 0\n", view); |
1 | 2220 return 0; |
2221 } | |
2222 | |
2223 void* WINAPI expSleep(int time) | |
2224 { | |
2069 | 2225 // extern int avm_usleep(int); |
128 | 2226 dbgprintf("Sleep(%d) => 0\n", time); |
2069 | 2227 // avm_usleep(time); |
1 | 2228 usleep(time); |
2229 return 0; | |
2230 } | |
2231 // why does IV32 codec want to call this? I don't know ... | |
2232 void* WINAPI expCreateCompatibleDC(int hdc) | |
2233 { | |
128 | 2234 dbgprintf("CreateCompatibleDC(%d) => 0x81\n", hdc); |
2235 return (void*)0x81; | |
1 | 2236 } |
2237 | |
2238 int WINAPI expGetDeviceCaps(int hdc, int unk) | |
2239 { | |
128 | 2240 dbgprintf("GetDeviceCaps(0x%x, %d) => 0\n", hdc, unk); |
1 | 2241 return 0; |
2242 } | |
2243 | |
2244 WIN_BOOL WINAPI expDeleteDC(int hdc) | |
2245 { | |
128 | 2246 dbgprintf("DeleteDC(0x%x) => 0\n", hdc); |
1 | 2247 return 0; |
2248 } | |
2249 | |
3128 | 2250 // btvvc32.drv wants this one |
2251 void* WINAPI expGetWindowDC(int hdc) | |
2252 { | |
2253 dbgprintf("GetWindowDC(%d) => 0x81\n", hdc); | |
2254 return (void*)0x81; | |
2255 } | |
2256 | |
2257 void* WINAPI expCreateFontA(void) | |
2258 { | |
2259 return 0; | |
2260 } | |
2261 | |
1 | 2262 int expwsprintfA(char* string, char* format, ...) |
2263 { | |
2264 va_list va; | |
128 | 2265 int result; |
1 | 2266 va_start(va, format); |
128 | 2267 result=vsprintf(string, format, va); |
2268 dbgprintf("wsprintfA(0x%x, '%s', ...) => %d\n", string, format, result); | |
2269 va_end(va); | |
2270 return result; | |
1 | 2271 } |
2272 | |
2273 int WINAPI expGetPrivateProfileIntA(const char* appname, const char* keyname, int default_value, const char* filename) | |
2274 { | |
2275 int size=255; | |
2276 char buffer[256]; | |
2277 char* fullname; | |
2278 int result; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2279 |
1 | 2280 buffer[255]=0; |
128 | 2281 if(!(appname && keyname && filename) ) |
2282 { | |
2283 dbgprintf("GetPrivateProfileIntA('%s', '%s', %d, '%s') => %d\n", appname, keyname, default_value, filename, default_value ); | |
2284 return default_value; | |
2285 } | |
1 | 2286 fullname=(char*)malloc(50+strlen(appname)+strlen(keyname)+strlen(filename)); |
2287 strcpy(fullname, "Software\\IniFileMapping\\"); | |
2288 strcat(fullname, appname); | |
2289 strcat(fullname, "\\"); | |
2290 strcat(fullname, keyname); | |
2291 strcat(fullname, "\\"); | |
2292 strcat(fullname, filename); | |
2293 result=RegQueryValueExA(HKEY_LOCAL_MACHINE, fullname, NULL, NULL, (int*)buffer, &size); | |
2294 if((size>=0)&&(size<256)) | |
2295 buffer[size]=0; | |
2296 // 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
|
2297 free(fullname); |
1 | 2298 if(result) |
128 | 2299 result=default_value; |
1 | 2300 else |
128 | 2301 result=atoi(buffer); |
2302 dbgprintf("GetPrivateProfileIntA('%s', '%s', %d, '%s') => %d\n", appname, keyname, default_value, filename, result); | |
2303 return result; | |
1 | 2304 } |
128 | 2305 int WINAPI expGetProfileIntA(const char* appname, const char* keyname, int default_value) |
2306 { | |
2307 dbgprintf("GetProfileIntA -> "); | |
2308 // 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
|
2309 return expGetPrivateProfileIntA(appname, keyname, default_value, "default"); |
128 | 2310 } |
2311 | |
1 | 2312 int WINAPI expGetPrivateProfileStringA(const char* appname, const char* keyname, |
2313 const char* def_val, char* dest, unsigned int len, const char* filename) | |
2314 { | |
2315 int result; | |
2316 int size; | |
2317 char* fullname; | |
128 | 2318 dbgprintf("GetPrivateProfileStringA('%s', '%s', def_val '%s', 0x%x, 0x%x, '%s')", appname, keyname, def_val, dest, len, filename ); |
1 | 2319 if(!(appname && keyname && filename) ) return 0; |
2320 fullname=(char*)malloc(50+strlen(appname)+strlen(keyname)+strlen(filename)); | |
2321 strcpy(fullname, "Software\\IniFileMapping\\"); | |
2322 strcat(fullname, appname); | |
2323 strcat(fullname, "\\"); | |
2324 strcat(fullname, keyname); | |
2325 strcat(fullname, "\\"); | |
2326 strcat(fullname, filename); | |
2327 size=len; | |
2328 result=RegQueryValueExA(HKEY_LOCAL_MACHINE, fullname, NULL, NULL, (int*)dest, &size); | |
2329 // 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
|
2330 free(fullname); |
128 | 2331 if(result) |
2332 { | |
2333 strncpy(dest, def_val, size); | |
2334 if (strlen(def_val)< size) size = strlen(def_val); | |
2335 } | |
2336 dbgprintf(" => %d ( '%s' )\n", size, dest); | |
1 | 2337 return size; |
2338 } | |
2339 int WINAPI expWritePrivateProfileStringA(const char* appname, const char* keyname, | |
2340 const char* string, const char* filename) | |
2341 { | |
2342 int size=256; | |
2343 char* fullname; | |
128 | 2344 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
|
2345 if(!(appname && keyname && filename) ) |
128 | 2346 { |
2347 dbgprintf(" => -1\n"); | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2348 return -1; |
128 | 2349 } |
1 | 2350 fullname=(char*)malloc(50+strlen(appname)+strlen(keyname)+strlen(filename)); |
2351 strcpy(fullname, "Software\\IniFileMapping\\"); | |
2352 strcat(fullname, appname); | |
2353 strcat(fullname, "\\"); | |
2354 strcat(fullname, keyname); | |
2355 strcat(fullname, "\\"); | |
2356 strcat(fullname, filename); | |
2357 RegSetValueExA(HKEY_LOCAL_MACHINE, fullname, 0, REG_SZ, (int*)string, strlen(string)); | |
2358 // printf("RegSetValueExA(%s,%d)\n", string, strlen(string)); | |
2359 // 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
|
2360 free(fullname); |
128 | 2361 dbgprintf(" => 0\n"); |
1 | 2362 return 0; |
2363 } | |
2139 | 2364 int expsprintf(char* str, const char* format, ...) |
2365 { | |
2366 va_list args; | |
2367 int r; | |
2368 dbgprintf("sprintf(%s, %s)\n", str, format); | |
2369 va_start(args, format); | |
2370 r = vsprintf(str, format, args); | |
2371 va_end(args); | |
2372 return r; | |
2373 } | |
2374 int expsscanf(const char* str, const char* format, ...) | |
2375 { | |
2376 va_list args; | |
2377 int r; | |
2378 dbgprintf("sscanf(%s, %s)\n", str, format); | |
2379 va_start(args, format); | |
2380 r = vsscanf(str, format, args); | |
2381 va_end(args); | |
2382 return r; | |
2383 } | |
2384 void* expfopen(const char* path, const char* mode) | |
2385 { | |
2386 printf("fopen: \"%s\" mode:%s\n", path, mode); | |
2387 //return fopen(path, mode); | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2388 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
|
2389 } |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2390 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
|
2391 { |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2392 va_list args; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2393 int r = 0; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2394 #if 1 |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2395 va_start(args, format); |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2396 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
|
2397 va_end(args); |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2398 #endif |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2399 return r; |
2139 | 2400 } |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2401 |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2402 int expprintf(const char* format, ...) |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2403 { |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2404 va_list args; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2405 int r; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2406 va_start(args, format); |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2407 r = vprintf(format, args); |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2408 va_end(args); |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2409 return r; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2410 } |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2411 |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2412 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
|
2413 { |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2414 WCHAR* p = dst; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2415 while ((*p++ = *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 return dst; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2418 } |
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 |
1 | 2421 unsigned int _GetPrivateProfileIntA(const char* appname, const char* keyname, INT default_value, const char* filename) |
2422 { | |
2423 return expGetPrivateProfileIntA(appname, keyname, default_value, filename); | |
2424 } | |
2425 int _GetPrivateProfileStringA(const char* appname, const char* keyname, | |
2426 const char* def_val, char* dest, unsigned int len, const char* filename) | |
2427 { | |
2428 return expGetPrivateProfileStringA(appname, keyname, def_val, dest, len, filename); | |
2429 } | |
2430 int _WritePrivateProfileStringA(const char* appname, const char* keyname, | |
2431 const char* string, const char* filename) | |
2432 { | |
2433 return expWritePrivateProfileStringA(appname, keyname, string, filename); | |
2434 } | |
2435 | |
2436 | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2437 |
1 | 2438 int WINAPI expDefDriverProc(int _private, int id, int msg, int arg1, int arg2) |
2439 { | |
128 | 2440 dbgprintf("DefDriverProc(0x%x, 0x%x, 0x%x, 0x%x, 0x%x) => 0\n", _private, id, msg, arg1, arg2); |
1 | 2441 return 0; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2442 } |
1 | 2443 |
2444 int WINAPI expSizeofResource(int v1, int v2) | |
2445 { | |
128 | 2446 int result=SizeofResource(v1, v2); |
2447 dbgprintf("SizeofResource(0x%x, 0x%x) => %d\n", v1, v2, result); | |
2448 return result; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2449 } |
1 | 2450 |
2451 int WINAPI expGetLastError() | |
2452 { | |
128 | 2453 int result=GetLastError(); |
2454 dbgprintf("GetLastError() => 0x%x\n", result); | |
2455 return result; | |
1 | 2456 } |
2457 | |
2458 void WINAPI expSetLastError(int error) | |
2459 { | |
128 | 2460 dbgprintf("SetLastError(0x%x)\n", error); |
1 | 2461 SetLastError(error); |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2462 } |
1 | 2463 |
2464 char* expstrrchr(char* string, int value) | |
2465 { | |
128 | 2466 char* result=strrchr(string, value); |
2467 if(result) | |
2468 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
|
2469 else |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2470 dbgprintf("strrchr(0x%x='%s', %d) => 0", string, string, value); |
128 | 2471 return result; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2472 } |
1 | 2473 |
2474 char* expstrchr(char* string, int value) | |
2475 { | |
128 | 2476 char* result=strchr(string, value); |
2477 if(result) | |
2478 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
|
2479 else |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2480 dbgprintf("strchr(0x%x='%s', %d) => 0", string, string, value); |
128 | 2481 return result; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2482 } |
128 | 2483 int expstrlen(char* str) |
2484 { | |
2485 int result=strlen(str); | |
2486 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
|
2487 return result; |
128 | 2488 } |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2489 int expstrcpy(char* str1, const char* str2) |
128 | 2490 { |
713 | 2491 int result= (int) strcpy(str1, str2); |
2492 dbgprintf("strcpy(0x%x, 0x%x='%s') => %d\n", str1, str2, str2, result); | |
128 | 2493 return result; |
2494 } | |
2495 int expstrcmp(const char* str1, const char* str2) | |
2496 { | |
2497 int result=strcmp(str1, str2); | |
2498 dbgprintf("strcmp(0x%x='%s', 0x%x='%s') => %d\n", str1, str1, str2, str2, result); | |
2499 return result; | |
2500 } | |
2668 | 2501 int expstrncmp(const char* str1, const char* str2,int x) |
2502 { | |
2503 int result=strncmp(str1, str2,x); | |
2504 dbgprintf("strcmp(0x%x='%s', 0x%x='%s') => %d\n", str1, str1, str2, str2, result); | |
2505 return result; | |
2506 } | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2507 int expstrcat(char* str1, const char* str2) |
128 | 2508 { |
713 | 2509 int result= (int) strcat(str1, str2); |
2510 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
|
2511 return result; |
128 | 2512 } |
713 | 2513 int expisalnum(int c) |
128 | 2514 { |
713 | 2515 int result= (int) isalnum(c); |
2516 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
|
2517 return result; |
713 | 2518 } |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2519 int expmemmove(void* dest, void* src, int n) |
713 | 2520 { |
2521 int result= (int) memmove(dest, src, n); | |
2522 dbgprintf("memmove(0x%x, 0x%x, %d) => %d\n", dest, src, n, result); | |
2523 return result; | |
128 | 2524 } |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2525 int expmemcmp(void* dest, void* src, int n) |
128 | 2526 { |
2527 int result=memcmp(dest, src, n); | |
2528 dbgprintf("memcmp(0x%x, 0x%x, %d) => %d\n", dest, src, n, result); | |
2529 return result; | |
2530 } | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2531 void *expmemcpy(void* dest, void* src, int n) |
130 | 2532 { |
597 | 2533 void *result=memcpy(dest, src, n); |
2534 dbgprintf("memcpy(0x%x, 0x%x, %d) => %p\n", dest, src, n, result); | |
130 | 2535 return result; |
2536 } | |
128 | 2537 time_t exptime(time_t* t) |
2538 { | |
2539 time_t result=time(t); | |
2540 dbgprintf("time(0x%x) => %d\n", t, result); | |
2541 return result; | |
2542 } | |
2543 | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2544 int exprand(void) |
2139 | 2545 { |
2546 return rand(); | |
2547 } | |
2548 | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2549 double explog10(double x) |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2550 { |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2551 return log10(x); |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2552 } |
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 double expcos(double 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 return cos(x); |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2557 } |
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 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
|
2560 { |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2561 return pow(x, y); |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2562 } |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2563 |
2139 | 2564 void expsrand(int seed) |
2565 { | |
2566 srand(seed); | |
2567 } | |
2568 | |
2569 int exp_ftol(float f) | |
2570 { | |
2571 return (int)(f+.5); | |
2572 } | |
2573 | |
3128 | 2574 int exp_stricmp(const char* s1, const char* s2) |
2575 { | |
2576 return strcasecmp(s1, s2); | |
2577 } | |
2578 | |
128 | 2579 int WINAPI expStringFromGUID2(GUID* guid, char* str, int cbMax) |
2580 { | |
2069 | 2581 int result=snprintf(str, cbMax, "%.8x-%.4x-%.4x-%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x", |
2582 guid->f1, guid->f2, guid->f3, | |
2583 (unsigned char)guid->f4[0], (unsigned char)guid->f4[1], | |
2584 (unsigned char)guid->f4[2], (unsigned char)guid->f4[3], | |
2585 (unsigned char)guid->f4[4], (unsigned char)guid->f4[5], | |
2586 (unsigned char)guid->f4[6], (unsigned char)guid->f4[7]); | |
128 | 2587 dbgprintf("StringFromGUID2(0x%x, 0x%x='%s', %d) => %d\n", guid, str, str, cbMax, result); |
2588 return result; | |
2589 } | |
2590 | |
1 | 2591 |
2592 int WINAPI expGetFileVersionInfoSizeA(const char* name, int* lpHandle) | |
2593 { | |
128 | 2594 dbgprintf("GetFileVersionInfoSizeA(0x%x='%s', 0x%X) => 0\n", name, name, lpHandle); |
1 | 2595 return 0; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2596 } |
1 | 2597 |
2598 int WINAPI expIsBadStringPtrW(const short* string, int nchars) | |
2599 { | |
128 | 2600 int result; |
2601 if(string==0)result=1; else result=0; | |
2602 dbgprintf("IsBadStringPtrW(0x%x, %d) => %d", string, nchars, result); | |
2603 if(string)wch_print(string); | |
2604 return result; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2605 } |
3128 | 2606 int WINAPI expIsBadStringPtrA(const char* string, int nchars) |
2607 { | |
2608 return expIsBadStringPtrW((const short*)string, nchars); | |
2609 } | |
1 | 2610 extern long WINAPI InterlockedExchangeAdd( long* dest, long incr ) |
2611 { | |
2612 long ret; | |
2613 __asm__ __volatile__( "lock; xaddl %0,(%1)" | |
2614 : "=r" (ret) : "r" (dest), "0" (incr) : "memory" ); | |
2615 return ret; | |
2616 } | |
2617 | |
2618 extern long WINAPI expInterlockedIncrement( long* dest ) | |
2619 { | |
128 | 2620 long result=InterlockedExchangeAdd( dest, 1 ) + 1; |
2621 dbgprintf("InterlockedIncrement(0x%x => %d) => %d\n", dest, *dest, result); | |
2622 return result; | |
1 | 2623 } |
2624 extern long WINAPI expInterlockedDecrement( long* dest ) | |
2625 { | |
128 | 2626 long result=InterlockedExchangeAdd( dest, -1 ) - 1; |
2627 dbgprintf("InterlockedDecrement(0x%x => %d) => %d\n", dest, *dest, result); | |
2628 return result; | |
1 | 2629 } |
2630 | |
2631 extern void WINAPI expOutputDebugStringA( const char* string ) | |
2632 { | |
128 | 2633 dbgprintf("OutputDebugStringA(0x%x='%s')\n", string); |
1 | 2634 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
|
2635 } |
1 | 2636 |
2637 int WINAPI expGetDC(int hwnd) | |
2638 { | |
128 | 2639 dbgprintf("GetDC(0x%x) => 0\n", hwnd); |
1 | 2640 return 0; |
2641 } | |
2642 | |
2643 int WINAPI expGetDesktopWindow() | |
2644 { | |
128 | 2645 dbgprintf("GetDesktopWindow() => 0\n"); |
1 | 2646 return 0; |
2647 } | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2648 |
1 | 2649 int WINAPI expReleaseDC(int hwnd, int hdc) |
2650 { | |
128 | 2651 dbgprintf("ReleaseDC(0x%x, 0x%x) => 0\n", hwnd, hdc); |
2652 return 0; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2653 } |
128 | 2654 static int cursor[100]; |
2655 | |
2656 int WINAPI expLoadCursorA(int handle,LPCSTR name) | |
2657 { | |
2658 dbgprintf("LoadCursorA(%d, 0x%x='%s') => 0x%x\n", handle, name, (int)&cursor[0]); | |
2659 return (int)&cursor[0]; | |
2660 } | |
2661 int WINAPI expSetCursor(void *cursor) | |
2662 { | |
2663 dbgprintf("SetCursor(0x%x) => 0x%x\n", cursor, cursor); | |
2664 return (int)cursor; | |
2665 } | |
2069 | 2666 int WINAPI expGetCursorPos(void *cursor) |
2667 { | |
2668 dbgprintf("GetCursorPos(0x%x) => 0x%x\n", cursor, cursor); | |
2669 return 1; | |
2670 } | |
2671 int WINAPI expRegisterWindowMessageA(char *message) | |
2672 { | |
2673 dbgprintf("RegisterWindowMessageA(%s)\n", message); | |
2674 return 1; | |
2675 } | |
2676 int WINAPI expGetProcessVersion(int pid) | |
2677 { | |
2678 dbgprintf("GetProcessVersion(%d)\n", pid); | |
2679 return 1; | |
2680 } | |
2681 int WINAPI expGetCurrentThread(void) | |
2682 { | |
2683 dbgprintf("GetCurrentThread()\n"); | |
2779 | 2684 return 0xcfcf9898; |
2069 | 2685 } |
2686 int WINAPI expGetOEMCP(void) | |
2687 { | |
2688 dbgprintf("GetOEMCP()\n"); | |
2689 return 1; | |
2690 } | |
2691 int WINAPI expGetCPInfo(int cp,void *info) | |
2692 { | |
2693 dbgprintf("GetCPInfo()\n"); | |
2694 return 0; | |
2695 } | |
2696 int WINAPI expGetSystemMetrics(int index) | |
2697 { | |
2698 dbgprintf("GetSystemMetrics(%d)\n", index); | |
2699 return 1; | |
2700 } | |
2701 int WINAPI expGetSysColor(int index) | |
2702 { | |
2703 dbgprintf("GetSysColor(%d)\n", index); | |
2704 return 1; | |
2705 } | |
2706 int WINAPI expGetSysColorBrush(int index) | |
2707 { | |
2708 dbgprintf("GetSysColorBrush(%d)\n", index); | |
2709 return 1; | |
2710 } | |
2711 | |
2712 | |
2713 | |
128 | 2714 int WINAPI expGetSystemPaletteEntries(int hdc, int iStartIndex, int nEntries, void* lppe) |
2715 { | |
2716 dbgprintf("GetSystemPaletteEntries(0x%x, 0x%x, 0x%x, 0x%x) => 0\n", | |
2717 hdc, iStartIndex, nEntries, lppe); | |
1 | 2718 return 0; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2719 } |
1 | 2720 |
2721 /* | |
2722 typedef struct _TIME_ZONE_INFORMATION { | |
2723 long Bias; | |
2724 char StandardName[32]; | |
2725 SYSTEMTIME StandardDate; | |
2726 long StandardBias; | |
2727 char DaylightName[32]; | |
2728 SYSTEMTIME DaylightDate; | |
2729 long DaylightBias; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2730 } TIME_ZONE_INFORMATION, *LPTIME_ZONE_INFORMATION; |
1 | 2731 */ |
2732 | |
2733 int WINAPI expGetTimeZoneInformation(LPTIME_ZONE_INFORMATION lpTimeZoneInformation) | |
2734 { | |
128 | 2735 const short name[]={'C', 'e', 'n', 't', 'r', 'a', 'l', ' ', 'S', 't', 'a', |
2736 'n', 'd', 'a', 'r', 'd', ' ', 'T', 'i', 'm', 'e', 0}; | |
2737 const short pname[]={'C', 'e', 'n', 't', 'r', 'a', 'l', ' ', 'D', 'a', 'y', | |
2738 'l', 'i', 'g', 'h', 't', ' ', 'T', 'i', 'm', 'e', 0}; | |
2739 dbgprintf("GetTimeZoneInformation(0x%x) => TIME_ZONE_ID_STANDARD\n"); | |
1 | 2740 memset(lpTimeZoneInformation, 0, sizeof(TIME_ZONE_INFORMATION)); |
128 | 2741 lpTimeZoneInformation->Bias=360;//GMT-6 |
2742 memcpy(lpTimeZoneInformation->StandardName, name, sizeof(name)); | |
2743 lpTimeZoneInformation->StandardDate.wMonth=10; | |
2744 lpTimeZoneInformation->StandardDate.wDay=5; | |
2745 lpTimeZoneInformation->StandardDate.wHour=2; | |
2746 lpTimeZoneInformation->StandardBias=0; | |
2747 memcpy(lpTimeZoneInformation->DaylightName, pname, sizeof(pname)); | |
2748 lpTimeZoneInformation->DaylightDate.wMonth=4; | |
2749 lpTimeZoneInformation->DaylightDate.wDay=1; | |
2750 lpTimeZoneInformation->DaylightDate.wHour=2; | |
2751 lpTimeZoneInformation->DaylightBias=-60; | |
2752 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
|
2753 } |
1 | 2754 |
2755 void WINAPI expGetLocalTime(SYSTEMTIME* systime) | |
2756 { | |
2757 time_t local_time; | |
2758 struct tm *local_tm; | |
2759 struct timeval tv; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2760 |
128 | 2761 dbgprintf("GetLocalTime(0x%x)\n"); |
1 | 2762 gettimeofday(&tv, NULL); |
2763 local_time=tv.tv_sec; | |
2764 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
|
2765 |
1 | 2766 systime->wYear = local_tm->tm_year + 1900; |
2767 systime->wMonth = local_tm->tm_mon + 1; | |
2768 systime->wDayOfWeek = local_tm->tm_wday; | |
2769 systime->wDay = local_tm->tm_mday; | |
2770 systime->wHour = local_tm->tm_hour; | |
2771 systime->wMinute = local_tm->tm_min; | |
2772 systime->wSecond = local_tm->tm_sec; | |
2773 systime->wMilliseconds = (tv.tv_usec / 1000) % 1000; | |
128 | 2774 dbgprintf(" Year: %d\n Month: %d\n Day of week: %d\n" |
2775 " Day: %d\n Hour: %d\n Minute: %d\n Second: %d\n" | |
2776 " Milliseconds: %d\n", | |
2777 systime->wYear, systime->wMonth, systime->wDayOfWeek, systime->wDay, | |
2778 systime->wHour, systime->wMinute, systime->wSecond, systime->wMilliseconds); | |
1 | 2779 } |
2780 | |
2781 int WINAPI expGetSystemTime(SYSTEMTIME* systime) | |
2782 { | |
2783 time_t local_time; | |
2784 struct tm *local_tm; | |
2785 struct timeval tv; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2786 |
128 | 2787 dbgprintf("GetSystemTime(0x%x)\n", systime); |
1 | 2788 gettimeofday(&tv, NULL); |
2789 local_time=tv.tv_sec; | |
2790 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
|
2791 |
1 | 2792 systime->wYear = local_tm->tm_year + 1900; |
2793 systime->wMonth = local_tm->tm_mon + 1; | |
2794 systime->wDayOfWeek = local_tm->tm_wday; | |
2795 systime->wDay = local_tm->tm_mday; | |
2796 systime->wHour = local_tm->tm_hour; | |
2797 systime->wMinute = local_tm->tm_min; | |
2798 systime->wSecond = local_tm->tm_sec; | |
2799 systime->wMilliseconds = (tv.tv_usec / 1000) % 1000; | |
128 | 2800 dbgprintf(" Year: %d\n Month: %d\n Day of week: %d\n" |
2801 " Day: %d\n Hour: %d\n Minute: %d\n Second: %d\n" | |
2802 " Milliseconds: %d\n", | |
2803 systime->wYear, systime->wMonth, systime->wDayOfWeek, systime->wDay, | |
2804 systime->wHour, systime->wMinute, systime->wSecond, systime->wMilliseconds); | |
2069 | 2805 return 0; |
1 | 2806 } |
2807 | |
2808 int WINAPI expGetEnvironmentVariableA(const char* name, char* field, int size) | |
2809 { | |
128 | 2810 char *p; |
2811 // printf("%s %x %x\n", name, field, size); | |
1 | 2812 if(field)field[0]=0; |
128 | 2813 /* |
2814 p = getenv(name); | |
2815 if (p) strncpy(field,p,size); | |
2816 */ | |
2817 if (strcmp(name,"__MSVCRT_HEAP_SELECT")==0) | |
2818 strcpy(field,"__GLOBAL_HEAP_SELECTED,1"); | |
2819 dbgprintf("GetEnvironmentVariableA(0x%x='%s', 0x%x, %d) => %d\n", name, name, field, size, strlen(field)); | |
2820 return strlen(field); | |
2821 } | |
2822 | |
2823 void* WINAPI expCoTaskMemAlloc(ULONG cb) | |
2824 { | |
2825 return my_mreq(cb, 0); | |
2826 } | |
2827 void WINAPI expCoTaskMemFree(void* cb) | |
2828 { | |
2829 my_release(cb); | |
2830 } | |
2831 | |
2832 void* CoTaskMemAlloc(ULONG cb){return expCoTaskMemAlloc(cb);} | |
2833 void CoTaskMemFree(void* cb){expCoTaskMemFree(cb);} | |
2834 | |
2835 struct COM_OBJECT_INFO | |
2836 { | |
2837 GUID clsid; | |
2838 long (*GetClassObject) (GUID* clsid, GUID* iid, void** ppv); | |
2839 }; | |
2840 | |
2841 static struct COM_OBJECT_INFO* com_object_table=0; | |
2842 static int com_object_size=0; | |
2843 int RegisterComClass(GUID* clsid, GETCLASSOBJECT gcs) | |
2844 { | |
2069 | 2845 if(!clsid || !gcs) |
2846 return -1; | |
128 | 2847 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
|
2848 com_object_table[com_object_size-1].clsid=*clsid; |
128 | 2849 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
|
2850 return 0; |
128 | 2851 } |
2852 | |
2069 | 2853 int UnregisterComClass(GUID* clsid, GETCLASSOBJECT gcs) |
2854 { | |
2855 int found = 0; | |
2856 int i = 0; | |
2857 if(!clsid || !gcs) | |
2858 return -1; | |
2859 | |
2860 if (com_object_table == 0) | |
2861 printf("Warning: UnregisterComClass() called without any registered class\n"); | |
2862 while (i < com_object_size) | |
2863 { | |
2864 if (found && i > 0) | |
2865 { | |
2866 memcpy(&com_object_table[i - 1].clsid, | |
2867 &com_object_table[i].clsid, sizeof(GUID)); | |
2868 com_object_table[i - 1].GetClassObject = | |
2869 com_object_table[i].GetClassObject; | |
2870 } | |
2871 else if (memcmp(&com_object_table[i].clsid, clsid, sizeof(GUID)) == 0 | |
2872 && com_object_table[i].GetClassObject == gcs) | |
2873 { | |
2874 found++; | |
2875 } | |
2876 i++; | |
2877 } | |
2878 if (found) | |
2879 { | |
2880 if (--com_object_size == 0) | |
2881 { | |
2882 free(com_object_table); | |
2883 com_object_table = 0; | |
2884 } | |
2885 } | |
2886 return 0; | |
2887 } | |
2888 | |
2889 | |
128 | 2890 GUID IID_IUnknown={0x00000000, 0x0000, 0x0000, |
2891 {0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}}; | |
2892 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
|
2893 {0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}}; |
128 | 2894 |
2895 long WINAPI expCoCreateInstance(GUID* rclsid, struct IUnknown* pUnkOuter, | |
2896 long dwClsContext, GUID* riid, void** ppv) | |
2897 { | |
2898 int i; | |
2899 struct COM_OBJECT_INFO* ci=0; | |
2900 for(i=0; i<com_object_size; i++) | |
2901 if(!memcmp(rclsid, &com_object_table[i].clsid, sizeof(GUID))) | |
2902 ci=&com_object_table[i]; | |
2903 if(!ci)return 0x80040154; | |
2904 // in 'real' world we should mess with IClassFactory here | |
2905 i=ci->GetClassObject(rclsid, riid, ppv); | |
2906 return i; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2907 } |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
2908 |
128 | 2909 long CoCreateInstance(GUID* rclsid, struct IUnknown* pUnkOuter, |
2910 long dwClsContext, GUID* riid, void** ppv) | |
2911 { | |
2912 return expCoCreateInstance(rclsid, pUnkOuter, dwClsContext, riid, ppv); | |
2913 } | |
2914 | |
2915 int WINAPI | |
2916 expIsRectEmpty( | |
2917 CONST RECT *lprc) | |
2918 { | |
2919 dbgprintf("IsRectEmpty(0x%x)"); | |
2920 if((!lprc) || (lprc->right==lprc->left) || (lprc->top==lprc->bottom)) | |
2921 { | |
2922 dbgprintf(" => TRUE\n"); | |
2923 return TRUE; | |
2924 } | |
2925 dbgprintf(" => FALSE\n"); | |
2926 return FALSE; | |
2927 } | |
2928 | |
2929 int _adjust_fdiv=0; //what's this? | |
2930 | |
2931 | |
2932 | |
2933 | |
2934 unsigned int WINAPI expGetTempPathA(unsigned int len, char* path) | |
2935 { | |
2936 dbgprintf("GetTempPathA(%d, 0x%x)", len, path); | |
2937 if(len<5) | |
2938 { | |
2939 dbgprintf(" => 0\n"); | |
2940 return 0; | |
2941 } | |
2942 strcpy(path, "/tmp"); | |
2943 dbgprintf(" => 5 ( '/tmp' )\n"); | |
2944 return 5; | |
2945 } | |
2946 /* | |
2947 FYI: | |
2948 typedef struct | |
2949 { | |
2950 DWORD dwFileAttributes; | |
2951 FILETIME ftCreationTime; | |
2952 FILETIME ftLastAccessTime; | |
2953 FILETIME ftLastWriteTime; | |
2954 DWORD nFileSizeHigh; | |
2955 DWORD nFileSizeLow; | |
2956 DWORD dwReserved0; | |
2957 DWORD dwReserved1; | |
2958 CHAR cFileName[260]; | |
2959 CHAR cAlternateFileName[14]; | |
2960 } WIN32_FIND_DATAA, *LPWIN32_FIND_DATAA; | |
2961 */ | |
2962 | |
2963 HANDLE WINAPI expFindFirstFileA(LPCSTR s, LPWIN32_FIND_DATAA lpfd) | |
2964 { | |
2965 dbgprintf("FindFirstFileA(0x%x='%s', 0x%x) => 0\n", s, s, lpfd); | |
2966 strcpy(lpfd->cFileName, "msms001.vwp"); | |
2967 strcpy(lpfd->cAlternateFileName, "msms001.vwp"); | |
2968 return (HANDLE)0; | |
2969 } | |
2970 WIN_BOOL WINAPI expFindNextFileA(HANDLE h,LPWIN32_FIND_DATAA p) | |
2971 { | |
2972 dbgprintf("FindNextFileA(0x%x, 0x%x) => 0\n", h, p); | |
1 | 2973 return 0; |
2974 } | |
128 | 2975 WIN_BOOL WINAPI expFindClose(HANDLE h) |
2976 { | |
2977 dbgprintf("FindClose(0x%x) => 0\n", h); | |
2978 return 0; | |
2979 } | |
2980 UINT WINAPI expSetErrorMode(UINT i) | |
2981 { | |
2982 dbgprintf("SetErrorMode(%d) => 0\n", i); | |
2983 return 0; | |
2984 } | |
2985 UINT WINAPI expGetWindowsDirectoryA(LPSTR s,UINT c) | |
2986 { | |
2987 char windir[]="c:\\windows"; | |
2988 int result; | |
2989 strncpy(s, windir, c); | |
2990 result=1+((c<strlen(windir))?c:strlen(windir)); | |
2991 dbgprintf("GetWindowsDirectoryA(0x%x, %d) => %d\n", s, c, result); | |
2992 return result; | |
2993 } | |
2994 | |
2995 WIN_BOOL WINAPI expDeleteFileA(LPCSTR s) | |
2996 { | |
2997 dbgprintf("DeleteFileA(0x%x='%s') => 0\n", s, s); | |
2998 return 0; | |
2999 } | |
3000 WIN_BOOL WINAPI expFileTimeToLocalFileTime(const FILETIME* cpf, LPFILETIME pf) | |
3001 { | |
3002 dbgprintf("FileTimeToLocalFileTime(0x%x, 0x%x) => 0\n", cpf, pf); | |
3003 return 0; | |
3004 } | |
3005 | |
3006 UINT WINAPI expGetTempFileNameA(LPCSTR cs1,LPCSTR cs2,UINT i,LPSTR ps) | |
3007 { | |
3008 char mask[16]="/tmp/AP_XXXXXX"; | |
3009 int result; | |
3010 dbgprintf("GetTempFileNameA(0x%x='%s', 0x%x='%s', %d, 0x%x)", cs1, cs1, cs2, cs2, i, ps); | |
3011 if(i && i<10) | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
3012 { |
128 | 3013 dbgprintf(" => -1\n"); |
3014 return -1; | |
3015 } | |
3016 result=mkstemp(mask); | |
3017 sprintf(ps, "AP%d", result); | |
3018 dbgprintf(" => %d\n", strlen(ps)); | |
3019 return strlen(ps); | |
3020 } | |
3021 // | |
3022 // This func might need proper implementation if we want AngelPotion codec. | |
3023 // They try to open APmpeg4v1.apl with it. | |
3024 // DLL will close opened file with CloseHandle(). | |
3025 // | |
3026 HANDLE WINAPI expCreateFileA(LPCSTR cs1,DWORD i1,DWORD i2, | |
3027 LPSECURITY_ATTRIBUTES p1, DWORD i3,DWORD i4,HANDLE i5) | |
3028 { | |
3029 dbgprintf("CreateFileA(0x%x='%s', %d, %d, 0x%x, %d, %d, 0x%x)\n", cs1, cs1, i1, | |
3030 i2, p1, i3, i4, i5); | |
3031 if((!cs1) || (strlen(cs1)<2))return -1; | |
3128 | 3032 |
3033 if(strncmp(cs1, "AP", 2) == 0) | |
128 | 3034 { |
3035 int result; | |
3036 char* tmp=(char*)malloc(strlen(def_path)+50); | |
3037 strcpy(tmp, def_path); | |
3038 strcat(tmp, "/"); | |
3039 strcat(tmp, "APmpg4v1.apl"); | |
3040 result=open(tmp, O_RDONLY); | |
3041 free(tmp); | |
3042 return result; | |
3128 | 3043 } |
3044 if (strstr(cs1, "vp3")) | |
3045 { | |
3046 int r; | |
3047 int flg = 0; | |
3048 char* tmp=(char*)malloc(20 + strlen(cs1)); | |
3049 strcpy(tmp, "/tmp/"); | |
3050 strcat(tmp, cs1); | |
3051 r = 4; | |
3052 while (tmp[r]) | |
3053 { | |
3054 if (tmp[r] == ':' || tmp[r] == '\\') | |
3055 tmp[r] = '_'; | |
3056 r++; | |
3057 } | |
3058 if (GENERIC_READ & i1) | |
3059 flg |= O_RDONLY; | |
3060 else if (GENERIC_WRITE & i1) | |
3061 { | |
3062 flg |= O_WRONLY; | |
3063 printf("Warning: openning filename %s %d (flags; 0x%x) for write\n", tmp, r, flg); | |
3064 } | |
3065 r=open(tmp, flg); | |
3066 free(tmp); | |
3067 return r; | |
3068 } | |
3069 | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
3070 return atoi(cs1+2); |
128 | 3071 } |
3072 static char sysdir[]="."; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
3073 LPCSTR WINAPI expGetSystemDirectoryA() |
128 | 3074 { |
3075 dbgprintf("GetSystemDirectoryA() => 0x%x='%s'\n", sysdir, sysdir); | |
3076 return sysdir; | |
3077 } | |
3078 WIN_BOOL WINAPI expReadFile(HANDLE h,LPVOID pv,DWORD size,LPDWORD rd,LPOVERLAPPED unused) | |
3079 { | |
3080 int result; | |
3081 dbgprintf("ReadFile(%d, 0x%x, %d -> 0x%x)\n", h, pv, size, rd); | |
3082 result=read(h, pv, size); | |
3083 if(rd)*rd=result; | |
3084 if(!result)return 0; | |
3085 return 1; | |
3086 } | |
3087 | |
3088 WIN_BOOL WINAPI expWriteFile(HANDLE h,LPCVOID pv,DWORD size,LPDWORD wr,LPOVERLAPPED unused) | |
3089 { | |
3090 int result; | |
3091 dbgprintf("WriteFile(%d, 0x%x, %d -> 0x%x)\n", h, pv, size, wr); | |
3092 if(h==1234)h=1; | |
3093 result=write(h, pv, size); | |
3094 if(wr)*wr=result; | |
3095 if(!result)return 0; | |
3096 return 1; | |
3097 } | |
3098 DWORD WINAPI expSetFilePointer(HANDLE h, LONG val, LPLONG ext, DWORD whence) | |
3099 { | |
3100 int wh; | |
3101 dbgprintf("SetFilePointer(%d, %d, 0x%x, %d)\n", h, val, ext, whence); | |
3102 //why would DLL want temporary file with >2Gb size? | |
3103 switch(whence) | |
3104 { | |
3105 case FILE_BEGIN: | |
3106 wh=SEEK_SET;break; | |
3107 case FILE_END: | |
3108 wh=SEEK_END;break; | |
3109 case FILE_CURRENT: | |
3110 wh=SEEK_CUR;break; | |
3111 default: | |
3112 return -1; | |
3113 } | |
3114 return lseek(h, val, wh); | |
3115 } | |
3116 | |
3117 HDRVR WINAPI expOpenDriverA(LPCSTR szDriverName, LPCSTR szSectionName, | |
3118 LPARAM lParam2) | |
3119 { | |
3120 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
|
3121 return -1; |
128 | 3122 } |
3123 HDRVR WINAPI expOpenDriver(LPCSTR szDriverName, LPCSTR szSectionName, | |
3124 LPARAM lParam2) | |
3125 { | |
3126 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
|
3127 return -1; |
128 | 3128 } |
1 | 3129 |
3130 | |
128 | 3131 WIN_BOOL |
3132 WINAPI | |
3133 expGetProcessAffinityMask( | |
3134 HANDLE hProcess, | |
3135 LPDWORD lpProcessAffinityMask, | |
3136 LPDWORD lpSystemAffinityMask | |
3137 ) | |
3138 { | |
3139 dbgprintf("GetProcessAffinityMask(0x%x, 0x%x, 0x%x) => 1\n", | |
3140 hProcess, lpProcessAffinityMask, lpSystemAffinityMask); | |
3141 if(lpProcessAffinityMask)*lpProcessAffinityMask=1; | |
3142 if(lpSystemAffinityMask)*lpSystemAffinityMask=1; | |
3143 return 1; | |
1 | 3144 } |
3145 | |
713 | 3146 int WINAPI expMulDiv(int nNumber, int nNumerator, int nDenominator) |
3147 { | |
3148 static const long long max_int=0x7FFFFFFFLL; | |
3149 static const long long min_int=-0x80000000LL; | |
3150 long long tmp=(long long)nNumber*(long long)nNumerator; | |
3151 if(!nDenominator)return 1; | |
3152 tmp/=nDenominator; | |
3153 if(tmp<min_int) return 1; | |
3154 if(tmp>max_int) return 1; | |
3155 return (int)tmp; | |
3156 } | |
3157 | |
3158 LONG WINAPI explstrcmpiA(const char* str1, const char* str2) | |
3159 { | |
3160 LONG result=strcasecmp(str1, str2); | |
3161 dbgprintf("strcmpi(0x%x='%s', 0x%x='%s') => %d\n", str1, str1, str2, str2, result); | |
3162 return result; | |
3163 } | |
3164 | |
3165 LONG WINAPI explstrlenA(const char* str1) | |
3166 { | |
3167 LONG result=strlen(str1); | |
3134 | 3168 dbgprintf("strlen(0x%x='%.50s') => %d\n", str1, str1, result); |
713 | 3169 return result; |
3170 } | |
3171 | |
3172 LONG WINAPI explstrcpyA(char* str1, const char* str2) | |
3173 { | |
3174 int result= (int) strcpy(str1, str2); | |
3134 | 3175 dbgprintf("strcpy(0x%.50x, 0x%.50x='%.50s') => %d\n", str1, str2, str2, result); |
713 | 3176 return result; |
3177 } | |
2069 | 3178 LONG WINAPI explstrcpynA(char* str1, const char* str2,int len) |
3179 { | |
3180 int result; | |
3181 if (strlen(str2)>len) | |
3182 result = (int) strncpy(str1, str2,len); | |
3183 else | |
3184 result = (int) strcpy(str1,str2); | |
3185 dbgprintf("strncpy(0x%x, 0x%x='%s' len %d strlen %d) => %x\n", str1, str2, str2,len, strlen(str2),result); | |
3186 return result; | |
3187 } | |
3188 LONG WINAPI explstrcatA(char* str1, const char* str2) | |
3189 { | |
3190 int result= (int) strcat(str1, str2); | |
3191 dbgprintf("strcat(0x%x, 0x%x='%s') => %d\n", str1, str2, str2, result); | |
3192 return result; | |
3193 } | |
3194 | |
128 | 3195 |
497 | 3196 LONG WINAPI expInterlockedExchange(long *dest, long l) |
3197 { | |
3198 long retval; | |
3199 retval = *dest; | |
3200 *dest = l; | |
3201 return retval; | |
3202 } | |
3203 | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
3204 void WINAPI expInitCommonControls(void) |
1543 | 3205 { |
2069 | 3206 printf("InitCommonControls called!\n"); |
3207 return; | |
1543 | 3208 } |
3209 | |
2396 | 3210 HRESULT WINAPI expCoCreateFreeThreadedMarshaler(void *pUnkOuter, void **ppUnkInner) |
3211 { | |
3212 printf("CoCreateFreeThreadedMarshaler(%p, %p) called!\n", | |
3213 pUnkOuter, ppUnkInner); | |
3214 return E_FAIL; | |
3215 // return S_OK; | |
3216 } | |
3217 | |
2779 | 3218 |
3219 int WINAPI expDuplicateHandle( | |
3220 HANDLE hSourceProcessHandle, // handle to source process | |
3221 HANDLE hSourceHandle, // handle to duplicate | |
3222 HANDLE hTargetProcessHandle, // handle to target process | |
3223 HANDLE* lpTargetHandle, // duplicate handle | |
3224 DWORD dwDesiredAccess, // requested access | |
3225 int bInheritHandle, // handle inheritance option | |
3226 DWORD dwOptions // optional actions | |
3227 ) | |
3228 { | |
3229 dbgprintf("DuplicateHandle(%p, %p, %p, %p, 0x%x, %d, %d) called\n", | |
3230 hSourceProcessHandle, hSourceHandle, hTargetProcessHandle, | |
3231 lpTargetHandle, dwDesiredAccess, bInheritHandle, dwOptions); | |
3232 *lpTargetHandle = hSourceHandle; | |
3233 return 1; | |
3234 } | |
3235 | |
3128 | 3236 // required by PIM1 codec (used by win98 PCTV Studio capture sw) |
3033 | 3237 HRESULT WINAPI expCoInitialize( |
3238 LPVOID lpReserved /* [in] pointer to win32 malloc interface | |
3239 (obsolete, should be NULL) */ | |
3240 ) | |
3241 { | |
3242 /* | |
3243 * Just delegate to the newer method. | |
3244 */ | |
3245 return 0; //CoInitializeEx(lpReserved, COINIT_APARTMENTTHREADED); | |
3246 } | |
3247 | |
3248 | |
2779 | 3249 |
1 | 3250 struct exports |
3251 { | |
3252 char name[64]; | |
3253 int id; | |
3254 void* func; | |
3255 }; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
3256 struct libs |
1 | 3257 { |
3258 char name[64]; | |
3259 int length; | |
3260 struct exports* exps; | |
3261 }; | |
3262 | |
3263 #define FF(X,Y) \ | |
3264 {#X, Y, (void*)exp##X}, | |
3265 | |
3266 struct exports exp_kernel32[]={ | |
3267 FF(IsBadWritePtr, 357) | |
3268 FF(IsBadReadPtr, 354) | |
3269 FF(IsBadStringPtrW, -1) | |
3128 | 3270 FF(IsBadStringPtrA, -1) |
1 | 3271 FF(DisableThreadLibraryCalls, -1) |
3272 FF(CreateThread, -1) | |
3273 FF(CreateEventA, -1) | |
3274 FF(SetEvent, -1) | |
3275 FF(ResetEvent, -1) | |
3276 FF(WaitForSingleObject, -1) | |
3277 FF(GetSystemInfo, -1) | |
3278 FF(GetVersion, 332) | |
3279 FF(HeapCreate, 461) | |
3280 FF(HeapAlloc, -1) | |
3281 FF(HeapDestroy, -1) | |
3282 FF(HeapFree, -1) | |
3283 FF(HeapSize, -1) | |
2069 | 3284 FF(HeapReAlloc,-1) |
1 | 3285 FF(GetProcessHeap, -1) |
3286 FF(VirtualAlloc, -1) | |
3287 FF(VirtualFree, -1) | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
3288 FF(InitializeCriticalSection, -1) |
1 | 3289 FF(EnterCriticalSection, -1) |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
3290 FF(LeaveCriticalSection, -1) |
1 | 3291 FF(DeleteCriticalSection, -1) |
3292 FF(TlsAlloc, -1) | |
3293 FF(TlsFree, -1) | |
3294 FF(TlsGetValue, -1) | |
3295 FF(TlsSetValue, -1) | |
3296 FF(GetCurrentThreadId, -1) | |
128 | 3297 FF(GetCurrentProcess, -1) |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
3298 FF(LocalAlloc, -1) |
2069 | 3299 FF(LocalReAlloc,-1) |
1 | 3300 FF(LocalLock, -1) |
3301 FF(GlobalAlloc, -1) | |
128 | 3302 FF(GlobalReAlloc, -1) |
1 | 3303 FF(GlobalLock, -1) |
3128 | 3304 FF(GlobalSize, -1) |
1 | 3305 FF(MultiByteToWideChar, 427) |
3306 FF(WideCharToMultiByte, -1) | |
3307 FF(GetVersionExA, -1) | |
3308 FF(CreateSemaphoreA, -1) | |
3309 FF(QueryPerformanceCounter, -1) | |
3310 FF(QueryPerformanceFrequency, -1) | |
3311 FF(LocalHandle, -1) | |
3312 FF(LocalUnlock, -1) | |
3313 FF(LocalFree, -1) | |
3314 FF(GlobalHandle, -1) | |
3315 FF(GlobalUnlock, -1) | |
3316 FF(GlobalFree, -1) | |
3317 FF(LoadResource, -1) | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
3318 FF(ReleaseSemaphore, -1) |
1 | 3319 FF(FindResourceA, -1) |
3320 FF(LockResource, -1) | |
3321 FF(FreeResource, -1) | |
3322 FF(SizeofResource, -1) | |
3323 FF(CloseHandle, -1) | |
3324 FF(GetCommandLineA, -1) | |
3325 FF(GetEnvironmentStringsW, -1) | |
3326 FF(FreeEnvironmentStringsW, -1) | |
128 | 3327 FF(FreeEnvironmentStringsA, -1) |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
3328 FF(GetEnvironmentStrings, -1) |
1 | 3329 FF(GetStartupInfoA, -1) |
3330 FF(GetStdHandle, -1) | |
3331 FF(GetFileType, -1) | |
3332 FF(SetHandleCount, -1) | |
3333 FF(GetACP, -1) | |
3334 FF(GetModuleFileNameA, -1) | |
3335 FF(SetUnhandledExceptionFilter, -1) | |
3336 FF(LoadLibraryA, -1) | |
3337 FF(GetProcAddress, -1) | |
3338 FF(FreeLibrary, -1) | |
3339 FF(CreateFileMappingA, -1) | |
3340 FF(OpenFileMappingA, -1) | |
3341 FF(MapViewOfFile, -1) | |
3342 FF(UnmapViewOfFile, -1) | |
3343 FF(Sleep, -1) | |
3344 FF(GetModuleHandleA, -1) | |
128 | 3345 FF(GetProfileIntA, -1) |
1 | 3346 FF(GetPrivateProfileIntA, -1) |
3347 FF(GetPrivateProfileStringA, -1) | |
3348 FF(WritePrivateProfileStringA, -1) | |
3349 FF(GetLastError, -1) | |
3350 FF(SetLastError, -1) | |
3351 FF(InterlockedIncrement, -1) | |
3352 FF(InterlockedDecrement, -1) | |
3353 FF(GetTimeZoneInformation, -1) | |
3354 FF(OutputDebugStringA, -1) | |
3355 FF(GetLocalTime, -1) | |
3356 FF(GetSystemTime, -1) | |
3357 FF(GetEnvironmentVariableA, -1) | |
121 | 3358 FF(RtlZeroMemory,-1) |
3359 FF(RtlMoveMemory,-1) | |
3360 FF(RtlFillMemory,-1) | |
128 | 3361 FF(GetTempPathA,-1) |
3362 FF(FindFirstFileA,-1) | |
3363 FF(FindNextFileA,-1) | |
3364 FF(FindClose,-1) | |
3365 FF(FileTimeToLocalFileTime,-1) | |
3366 FF(DeleteFileA,-1) | |
3367 FF(ReadFile,-1) | |
3368 FF(WriteFile,-1) | |
3369 FF(SetFilePointer,-1) | |
3370 FF(GetTempFileNameA,-1) | |
3371 FF(CreateFileA,-1) | |
3372 FF(GetSystemDirectoryA,-1) | |
3373 FF(GetWindowsDirectoryA,-1) | |
3374 FF(SetErrorMode, -1) | |
3375 FF(IsProcessorFeaturePresent, -1) | |
3376 FF(GetProcessAffinityMask, -1) | |
497 | 3377 FF(InterlockedExchange, -1) |
3378 FF(MulDiv, -1) | |
713 | 3379 FF(lstrcmpiA, -1) |
3380 FF(lstrlenA, -1) | |
3381 FF(lstrcpyA, -1) | |
2069 | 3382 FF(lstrcatA, -1) |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
3383 FF(lstrcpynA,-1) |
2069 | 3384 FF(GetProcessVersion,-1) |
3385 FF(GetCurrentThread,-1) | |
3386 FF(GetOEMCP,-1) | |
3387 FF(GetCPInfo,-1) | |
2779 | 3388 FF(DuplicateHandle,-1) |
1 | 3389 }; |
3390 | |
3391 struct exports exp_msvcrt[]={ | |
3392 FF(malloc, -1) | |
3393 FF(_initterm, -1) | |
3394 FF(free, -1) | |
3395 {"??3@YAXPAX@Z", -1, expdelete}, | |
3396 {"??2@YAPAXI@Z", -1, expnew}, | |
128 | 3397 {"_adjust_fdiv", -1, (void*)&_adjust_fdiv}, |
1 | 3398 FF(strrchr, -1) |
3399 FF(strchr, -1) | |
128 | 3400 FF(strlen, -1) |
3401 FF(strcpy, -1) | |
3402 FF(strcmp, -1) | |
2668 | 3403 FF(strncmp, -1) |
128 | 3404 FF(strcat, -1) |
3128 | 3405 FF(_stricmp,-1) |
713 | 3406 FF(isalnum, -1) |
128 | 3407 FF(memmove, -1) |
3408 FF(memcmp, -1) | |
3409 FF(time, -1) | |
2139 | 3410 FF(_ftol,-1) |
3411 FF(rand, -1) | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
3412 FF(log10, -1) |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
3413 FF(pow, -1) |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
3414 FF(cos, -1) |
2139 | 3415 FF(srand, -1) |
3416 FF(sprintf,-1) | |
3417 FF(sscanf,-1) | |
3418 FF(fopen,-1) | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
3419 FF(fprintf,-1) |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
3420 FF(printf,-1) |
1 | 3421 }; |
3422 struct exports exp_winmm[]={ | |
3423 FF(GetDriverModuleHandle, -1) | |
3424 FF(timeGetTime, -1) | |
3425 FF(DefDriverProc, -1) | |
128 | 3426 FF(OpenDriverA, -1) |
1 | 3427 FF(OpenDriver, -1) |
3428 }; | |
3429 struct exports exp_user32[]={ | |
3430 FF(LoadStringA, -1) | |
3431 FF(wsprintfA, -1) | |
3432 FF(GetDC, -1) | |
3433 FF(GetDesktopWindow, -1) | |
3434 FF(ReleaseDC, -1) | |
128 | 3435 FF(IsRectEmpty, -1) |
3436 FF(LoadCursorA,-1) | |
3437 FF(SetCursor,-1) | |
2069 | 3438 FF(GetCursorPos,-1) |
3439 FF(GetCursorPos,-1) | |
3440 FF(RegisterWindowMessageA,-1) | |
3441 FF(GetSystemMetrics,-1) | |
3442 FF(GetSysColor,-1) | |
3443 FF(GetSysColorBrush,-1) | |
3128 | 3444 FF(GetWindowDC, -1) |
1 | 3445 }; |
3446 struct exports exp_advapi32[]={ | |
3447 FF(RegOpenKeyA, -1) | |
3448 FF(RegOpenKeyExA, -1) | |
3449 FF(RegCreateKeyExA, -1) | |
3450 FF(RegQueryValueExA, -1) | |
3451 FF(RegSetValueExA, -1) | |
3452 FF(RegCloseKey, -1) | |
2069 | 3453 FF(RegEnumValueA, -1) |
1 | 3454 }; |
3455 struct exports exp_gdi32[]={ | |
3456 FF(CreateCompatibleDC, -1) | |
3457 FF(GetDeviceCaps, -1) | |
3458 FF(DeleteDC, -1) | |
3459 FF(GetSystemPaletteEntries, -1) | |
3128 | 3460 FF(CreateFontA, -1) |
1 | 3461 }; |
3462 struct exports exp_version[]={ | |
3463 FF(GetFileVersionInfoSizeA, -1) | |
3464 }; | |
128 | 3465 struct exports exp_ole32[]={ |
3466 FF(CoTaskMemAlloc, -1) | |
3467 FF(CoTaskMemFree, -1) | |
3468 FF(CoCreateInstance, -1) | |
3469 FF(StringFromGUID2, -1) | |
2396 | 3470 FF(CoCreateFreeThreadedMarshaler,-1) |
3033 | 3471 FF(CoInitialize, -1) |
128 | 3472 }; |
130 | 3473 struct exports exp_crtdll[]={ |
3474 FF(memcpy, -1) | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
3475 FF(wcscpy, -1) |
130 | 3476 }; |
2069 | 3477 struct exports exp_comctl32[]={ |
3478 FF(StringFromGUID2, -1) | |
3479 FF(InitCommonControls, 17) | |
3480 }; | |
1 | 3481 #define LL(X) \ |
3482 {#X".dll", sizeof(exp_##X)/sizeof(struct exports), exp_##X}, | |
3483 | |
3484 struct libs libraries[]={ | |
3485 LL(kernel32) | |
3486 LL(msvcrt) | |
3487 LL(winmm) | |
3488 LL(user32) | |
3489 LL(advapi32) | |
3490 LL(gdi32) | |
3491 LL(version) | |
128 | 3492 LL(ole32) |
130 | 3493 LL(crtdll) |
2069 | 3494 LL(comctl32) |
1 | 3495 }; |
3496 | |
2069 | 3497 |
1 | 3498 void* LookupExternal(const char* library, int ordinal) |
3499 { | |
3500 char* answ; | |
3501 int i,j; | |
3502 if(library==0) | |
3503 { | |
3504 printf("ERROR: library=0\n"); | |
3505 return (void*)ext_unknown; | |
3506 } | |
3507 // printf("%x %x\n", &unk_exp1, &unk_exp2); | |
3508 | |
3509 for(i=0; i<sizeof(libraries)/sizeof(struct libs); i++) | |
3510 { | |
3511 if(strcasecmp(library, libraries[i].name)) | |
3512 continue; | |
3513 for(j=0; j<libraries[i].length; j++) | |
3514 { | |
3515 if(ordinal!=libraries[i].exps[j].id) | |
3516 continue; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
3517 //printf("Hit: 0x%p\n", libraries[i].exps[j].func); |
1 | 3518 return libraries[i].exps[j].func; |
3519 } | |
3520 } | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
3521 printf("External func %s:%d\n", library, ordinal); |
1 | 3522 if(pos>150)return 0; |
3523 answ=(char*)extcode+pos*0x64; | |
3524 memcpy(answ, &unk_exp1, 0x64); | |
3525 *(int*)(answ+9)=pos; | |
3526 *(int*)(answ+47)-=((int)answ-(int)&unk_exp1); | |
3527 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
|
3528 pos++; |
1 | 3529 return (void*)answ; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
3530 } |
1 | 3531 |
3532 void* LookupExternalByName(const char* library, const char* name) | |
3533 { | |
3534 char* answ; | |
3535 int i,j; | |
3536 // return (void*)ext_unknown; | |
3537 if(library==0) | |
3538 { | |
3539 printf("ERROR: library=0\n"); | |
3540 return (void*)ext_unknown; | |
3541 } | |
3542 if(name==0) | |
3543 { | |
3544 printf("ERROR: name=0\n"); | |
3545 return (void*)ext_unknown; | |
3546 } | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
3547 //printf("External func %s:%s\n", library, name); |
1 | 3548 for(i=0; i<sizeof(libraries)/sizeof(struct libs); i++) |
3549 { | |
3550 if(strcasecmp(library, libraries[i].name)) | |
3551 continue; | |
3552 for(j=0; j<libraries[i].length; j++) | |
3553 { | |
3554 if(strcmp(name, libraries[i].exps[j].name)) | |
3555 continue; | |
3556 // printf("Hit: 0x%08X\n", libraries[i].exps[j].func); | |
3557 return libraries[i].exps[j].func; | |
3558 } | |
3559 } | |
128 | 3560 // printf("%s %s\n", library, name); |
3561 if(pos>150)return 0; | |
1 | 3562 strcpy(export_names[pos], name); |
3563 answ=(char*)extcode+pos*0x64; | |
3564 memcpy(answ, &unk_exp1, 0x64); | |
3565 *(int*)(answ+9)=pos; | |
3566 *(int*)(answ+47)-=((int)answ-(int)&unk_exp1); | |
3567 pos++; | |
3568 return (void*)answ; | |
3569 // memcpy(extcode, &unk_exp1, 0x64); | |
3570 // *(int*)(extcode+52)-=((int)extcode-(int)&unk_exp1); | |
3571 // return (void*)extcode; | |
3572 // printf("Unknown func %s:%s\n", library, name); | |
3573 // return (void*)ext_unknown; | |
3574 } | |
3575 | |
2069 | 3576 void my_garbagecollection(void) |
128 | 3577 { |
3578 #ifdef GARBAGE | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
3579 int unfree = 0, unfreecnt = 0; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
3580 |
3134 | 3581 free_registry(); |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
3582 while (last_alloc) |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
3583 { |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
3584 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
|
3585 unfree += my_size(mem); |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
3586 unfreecnt++; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
3587 my_release(mem); |
128 | 3588 } |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2579
diff
changeset
|
3589 printf("Total Unfree %d bytes cnt %d [%p,%d]\n",unfree, unfreecnt, last_alloc, alccnt); |
128 | 3590 #endif |
3134 | 3591 g_tls = NULL; |
3592 list = NULL; | |
128 | 3593 } |