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