Mercurial > mplayer.hg
annotate loader/ext.c @ 29269:4d9de809b174
Add a hack to detect when we are writing into a Windows pipe since the fseek
incorrectly does not fail like it should.
This ensures we will not incorrectly append the file header at the end.
Based on patch by Zhou Zongyi [zhouzongyi at pset.suntec.net]
author | reimar |
---|---|
date | Sat, 16 May 2009 13:59:53 +0000 |
parents | 0f1b5b68af32 |
children | 9fc9d1e788aa |
rev | line source |
---|---|
1 | 1 /******************************************************** |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2069
diff
changeset
|
2 * |
1 | 3 * |
4 * Stub functions for Wine module | |
5 * | |
6 * | |
7 ********************************************************/ | |
15166
f5537cc95b02
Mark modified imported files as such to comply with GPL ¡ø2a.
diego
parents:
13827
diff
changeset
|
8 |
f5537cc95b02
Mark modified imported files as such to comply with GPL ¡ø2a.
diego
parents:
13827
diff
changeset
|
9 /* |
18783 | 10 * Modified for use with MPlayer, detailed changelog at |
11 * http://svn.mplayerhq.hu/mplayer/trunk/ | |
15166
f5537cc95b02
Mark modified imported files as such to comply with GPL ¡ø2a.
diego
parents:
13827
diff
changeset
|
12 */ |
f5537cc95b02
Mark modified imported files as such to comply with GPL ¡ø2a.
diego
parents:
13827
diff
changeset
|
13 |
3465 | 14 #include "config.h" |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
128
diff
changeset
|
15 #include <stdio.h> |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
128
diff
changeset
|
16 #include <stdlib.h> |
1 | 17 #include <unistd.h> |
26105 | 18 #ifdef HAVE_SYS_MMAN_H |
1 | 19 #include <sys/mman.h> |
26111
eb82d1524b6d
#include osdep/mman.h if sys/mman.h is not available.
diego
parents:
26105
diff
changeset
|
20 #else |
eb82d1524b6d
#include osdep/mman.h if sys/mman.h is not available.
diego
parents:
26105
diff
changeset
|
21 #include "osdep/mmap.h" |
26105 | 22 #endif |
1 | 23 #include <errno.h> |
24 #include <fcntl.h> | |
25 #include <string.h> | |
26 #include <stdarg.h> | |
3465 | 27 #include <ctype.h> |
7386 | 28 |
21187
d9cedf7b8069
added mmap_anon to osdep lib. Used in loader for now
nplourde
parents:
18783
diff
changeset
|
29 #include "osdep/mmap_anon.h" |
7386 | 30 #include "wine/windef.h" |
31 #include "wine/winbase.h" | |
32 #include "wine/debugtools.h" | |
33 #include "wine/heap.h" | |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
128
diff
changeset
|
34 #include "ext.h" |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
128
diff
changeset
|
35 |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2069
diff
changeset
|
36 #if 0 |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2069
diff
changeset
|
37 //REMOVE SIMPLIFY |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2069
diff
changeset
|
38 static void* mymalloc(unsigned int size) |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2069
diff
changeset
|
39 { |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2069
diff
changeset
|
40 printf("malloc %d\n", size); |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2069
diff
changeset
|
41 return malloc(size); |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2069
diff
changeset
|
42 } |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2069
diff
changeset
|
43 |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2069
diff
changeset
|
44 #undef malloc |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2069
diff
changeset
|
45 #define malloc mymalloc |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2069
diff
changeset
|
46 #endif |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2069
diff
changeset
|
47 |
1 | 48 int dbg_header_err( const char *dbg_channel, const char *func ) |
49 { | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2069
diff
changeset
|
50 return 0; |
1 | 51 } |
52 int dbg_header_warn( const char *dbg_channel, const char *func ) | |
53 { | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2069
diff
changeset
|
54 return 0; |
1 | 55 } |
56 int dbg_header_fixme( const char *dbg_channel, const char *func ) | |
57 { | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2069
diff
changeset
|
58 return 0; |
1 | 59 } |
60 int dbg_header_trace( const char *dbg_channel, const char *func ) | |
61 { | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2069
diff
changeset
|
62 return 0; |
1 | 63 } |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
128
diff
changeset
|
64 int dbg_vprintf( const char *format, va_list args ) |
1 | 65 { |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2069
diff
changeset
|
66 return 0; |
1 | 67 } |
68 int __vprintf( const char *format, ... ) | |
69 { | |
70 #ifdef DETAILED_OUT | |
71 va_list va; | |
72 va_start(va, format); | |
73 vprintf(format, va); | |
74 va_end(va); | |
75 #endif | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2069
diff
changeset
|
76 return 0; |
1 | 77 } |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2069
diff
changeset
|
78 |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
128
diff
changeset
|
79 HANDLE WINAPI GetProcessHeap(void) |
1 | 80 { |
81 return 1; | |
82 } | |
83 | |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
128
diff
changeset
|
84 LPVOID WINAPI HeapAlloc(HANDLE heap, DWORD flags, DWORD size) |
1 | 85 { |
24383 | 86 //static int i = 5; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2069
diff
changeset
|
87 void* m = (flags & 0x8) ? calloc(size, 1) : malloc(size); |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2069
diff
changeset
|
88 //printf("HeapAlloc %p %d (%d)\n", m, size, flags); |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2069
diff
changeset
|
89 //if (--i == 0) |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2069
diff
changeset
|
90 // abort(); |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2069
diff
changeset
|
91 return m; |
1 | 92 } |
93 | |
2069 | 94 WIN_BOOL WINAPI HeapFree(HANDLE heap, DWORD flags, LPVOID mem) |
1 | 95 { |
128 | 96 if (mem) free(mem); |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2069
diff
changeset
|
97 //printf("HeapFree %p\n", mem); |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2069
diff
changeset
|
98 //if (!mem) |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2069
diff
changeset
|
99 // abort(); |
1 | 100 return 1; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2069
diff
changeset
|
101 } |
1 | 102 |
103 static int last_error; | |
104 | |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
128
diff
changeset
|
105 DWORD WINAPI GetLastError(void) |
1 | 106 { |
107 return last_error; | |
108 } | |
109 | |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
128
diff
changeset
|
110 VOID WINAPI SetLastError(DWORD error) |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2069
diff
changeset
|
111 { |
2069 | 112 last_error=error; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2069
diff
changeset
|
113 } |
1 | 114 |
2069 | 115 WIN_BOOL WINAPI ReadFile(HANDLE handle, LPVOID mem, DWORD size, LPDWORD result, LPOVERLAPPED flags) |
1 | 116 { |
117 *result=read(handle, mem, size); | |
118 return *result; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2069
diff
changeset
|
119 } |
2069 | 120 INT WINAPI lstrcmpiA(LPCSTR c1, LPCSTR c2) |
1 | 121 { |
122 return strcasecmp(c1,c2); | |
123 } | |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
128
diff
changeset
|
124 LPSTR WINAPI lstrcpynA(LPSTR dest, LPCSTR src, INT num) |
1 | 125 { |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
128
diff
changeset
|
126 return strncpy(dest,src,num); |
1 | 127 } |
2069 | 128 INT WINAPI lstrlenA(LPCSTR s) |
1 | 129 { |
130 return strlen(s); | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2069
diff
changeset
|
131 } |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
128
diff
changeset
|
132 INT WINAPI lstrlenW(LPCWSTR s) |
1 | 133 { |
134 int l; | |
135 if(!s) | |
136 return 0; | |
137 l=0; | |
138 while(s[l]) | |
139 l++; | |
140 return l; | |
141 } | |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
128
diff
changeset
|
142 LPSTR WINAPI lstrcpynWtoA(LPSTR dest, LPCWSTR src, INT count) |
1 | 143 { |
2069 | 144 LPSTR result = dest; |
1 | 145 int moved=0; |
146 if((dest==0) || (src==0)) | |
147 return 0; | |
148 while(moved<count) | |
149 { | |
150 *dest=*src; | |
151 moved++; | |
152 if(*src==0) | |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
128
diff
changeset
|
153 break; |
1 | 154 src++; |
155 dest++; | |
156 } | |
2069 | 157 return result; |
1 | 158 } |
3465 | 159 /* i stands here for ignore case! */ |
1 | 160 int wcsnicmp(const unsigned short* s1, const unsigned short* s2, int n) |
161 { | |
2069 | 162 /* |
1 | 163 if(s1==0) |
164 return; | |
165 if(s2==0) | |
166 return; | |
2069 | 167 */ |
1 | 168 while(n>0) |
169 { | |
3465 | 170 if (((*s1 | *s2) & 0xff00) || toupper((char)*s1) != toupper((char)*s2)) |
171 { | |
172 | |
173 if(*s1<*s2) | |
174 return -1; | |
1 | 175 else |
3465 | 176 if(*s1>*s2) |
177 return 1; | |
178 else | |
179 if(*s1==0) | |
180 return 0; | |
181 } | |
182 s1++; | |
183 s2++; | |
184 n--; | |
1 | 185 } |
186 return 0; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2069
diff
changeset
|
187 } |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2069
diff
changeset
|
188 |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
128
diff
changeset
|
189 WIN_BOOL WINAPI IsBadReadPtr(LPCVOID data, UINT size) |
1 | 190 { |
191 if(size==0) | |
192 return 0; | |
193 if(data==NULL) | |
194 return 1; | |
195 return 0; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2069
diff
changeset
|
196 } |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
128
diff
changeset
|
197 LPSTR HEAP_strdupA(HANDLE heap, DWORD flags, LPCSTR string) |
1 | 198 { |
199 // return strdup(string); | |
7386 | 200 char* answ = (char*) malloc(strlen(string) + 1); |
1 | 201 strcpy(answ, string); |
202 return answ; | |
203 } | |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
128
diff
changeset
|
204 LPWSTR HEAP_strdupAtoW(HANDLE heap, DWORD flags, LPCSTR string) |
1 | 205 { |
206 int size, i; | |
7386 | 207 WCHAR* answer; |
1 | 208 if(string==0) |
209 return 0; | |
210 size=strlen(string); | |
7386 | 211 answer = (WCHAR*) malloc(sizeof(WCHAR) * (size + 1)); |
1 | 212 for(i=0; i<=size; i++) |
213 answer[i]=(short)string[i]; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2069
diff
changeset
|
214 return answer; |
1 | 215 } |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
128
diff
changeset
|
216 LPSTR HEAP_strdupWtoA(HANDLE heap, DWORD flags, LPCWSTR string) |
1 | 217 { |
218 int size, i; | |
219 char* answer; | |
220 if(string==0) | |
221 return 0; | |
222 size=0; | |
223 while(string[size]) | |
224 size++; | |
7386 | 225 answer = (char*) malloc(size + 2); |
1 | 226 for(i=0; i<=size; i++) |
227 answer[i]=(char)string[i]; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2069
diff
changeset
|
228 return answer; |
1 | 229 } |
230 | |
231 /*********************************************************************** | |
232 * FILE_dommap | |
233 */ | |
234 | |
235 //#define MAP_PRIVATE | |
236 //#define MAP_SHARED | |
237 LPVOID FILE_dommap( int unix_handle, LPVOID start, | |
238 DWORD size_high, DWORD size_low, | |
239 DWORD offset_high, DWORD offset_low, | |
240 int prot, int flags ) | |
241 { | |
242 int fd = -1; | |
243 int pos; | |
244 LPVOID ret; | |
245 | |
246 if (size_high || offset_high) | |
247 printf("offsets larger than 4Gb not supported\n"); | |
248 | |
249 if (unix_handle == -1) | |
250 { | |
21248 | 251 ret = mmap_anon( start, size_low, prot, flags, offset_low ); |
21187
d9cedf7b8069
added mmap_anon to osdep lib. Used in loader for now
nplourde
parents:
18783
diff
changeset
|
252 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29087
diff
changeset
|
253 else |
21187
d9cedf7b8069
added mmap_anon to osdep lib. Used in loader for now
nplourde
parents:
18783
diff
changeset
|
254 { |
d9cedf7b8069
added mmap_anon to osdep lib. Used in loader for now
nplourde
parents:
18783
diff
changeset
|
255 fd = unix_handle; |
d9cedf7b8069
added mmap_anon to osdep lib. Used in loader for now
nplourde
parents:
18783
diff
changeset
|
256 ret = mmap( start, size_low, prot, flags, fd, offset_low ); |
d9cedf7b8069
added mmap_anon to osdep lib. Used in loader for now
nplourde
parents:
18783
diff
changeset
|
257 } |
1 | 258 |
21187
d9cedf7b8069
added mmap_anon to osdep lib. Used in loader for now
nplourde
parents:
18783
diff
changeset
|
259 if (ret != (LPVOID)-1) |
1 | 260 { |
261 // printf("address %08x\n", *(int*)ret); | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2069
diff
changeset
|
262 // printf("%x\n", ret); |
1 | 263 return ret; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2069
diff
changeset
|
264 } |
1 | 265 |
266 // printf("mmap %d\n", errno); | |
267 | |
268 /* mmap() failed; if this is because the file offset is not */ | |
269 /* page-aligned (EINVAL), or because the underlying filesystem */ | |
270 /* does not support mmap() (ENOEXEC), we do it by hand. */ | |
271 | |
272 if (unix_handle == -1) return ret; | |
273 if ((errno != ENOEXEC) && (errno != EINVAL)) return ret; | |
274 if (prot & PROT_WRITE) | |
275 { | |
276 /* We cannot fake shared write mappings */ | |
277 #ifdef MAP_SHARED | |
278 if (flags & MAP_SHARED) return ret; | |
279 #endif | |
280 #ifdef MAP_PRIVATE | |
281 if (!(flags & MAP_PRIVATE)) return ret; | |
282 #endif | |
283 } | |
284 /* printf( "FILE_mmap: mmap failed (%d), faking it\n", errno );*/ | |
285 /* Reserve the memory with an anonymous mmap */ | |
286 ret = FILE_dommap( -1, start, size_high, size_low, 0, 0, | |
287 PROT_READ | PROT_WRITE, flags ); | |
288 if (ret == (LPVOID)-1) | |
289 // { | |
290 // perror( | |
291 return ret; | |
292 /* Now read in the file */ | |
293 if ((pos = lseek( fd, offset_low, SEEK_SET )) == -1) | |
294 { | |
295 FILE_munmap( ret, size_high, size_low ); | |
296 // printf("lseek\n"); | |
297 return (LPVOID)-1; | |
298 } | |
299 read( fd, ret, size_low ); | |
300 lseek( fd, pos, SEEK_SET ); /* Restore the file pointer */ | |
301 mprotect( ret, size_low, prot ); /* Set the right protection */ | |
302 // printf("address %08x\n", *(int*)ret); | |
303 return ret; | |
304 } | |
305 | |
306 | |
307 /*********************************************************************** | |
308 * FILE_munmap | |
309 */ | |
310 int FILE_munmap( LPVOID start, DWORD size_high, DWORD size_low ) | |
311 { | |
312 if (size_high) | |
313 printf("offsets larger than 4Gb not supported\n"); | |
314 return munmap( start, size_low ); | |
315 } | |
316 | |
317 struct file_mapping_s; | |
318 typedef struct file_mapping_s | |
319 { | |
320 int mapping_size; | |
321 char* name; | |
2069 | 322 LPVOID handle; |
1 | 323 struct file_mapping_s* next; |
324 struct file_mapping_s* prev; | |
325 }file_mapping; | |
326 static file_mapping* fm=0; | |
327 | |
328 | |
329 | |
330 #define PAGE_NOACCESS 0x01 | |
331 #define PAGE_READONLY 0x02 | |
332 #define PAGE_READWRITE 0x04 | |
333 #define PAGE_WRITECOPY 0x08 | |
334 #define PAGE_EXECUTE 0x10 | |
335 #define PAGE_EXECUTE_READ 0x20 | |
336 #define PAGE_EXECUTE_READWRITE 0x40 | |
337 #define PAGE_EXECUTE_WRITECOPY 0x80 | |
338 #define PAGE_GUARD 0x100 | |
339 #define PAGE_NOCACHE 0x200 | |
340 | |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
128
diff
changeset
|
341 HANDLE WINAPI CreateFileMappingA(HANDLE handle, LPSECURITY_ATTRIBUTES lpAttr, |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
128
diff
changeset
|
342 DWORD flProtect, |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
128
diff
changeset
|
343 DWORD dwMaxHigh, DWORD dwMaxLow, |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
128
diff
changeset
|
344 LPCSTR name) |
1 | 345 { |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
128
diff
changeset
|
346 int hFile = (int)handle; |
1 | 347 unsigned int len; |
2069 | 348 LPVOID answer; |
1 | 349 int anon=0; |
350 int mmap_access=0; | |
351 if(hFile<0) | |
21187
d9cedf7b8069
added mmap_anon to osdep lib. Used in loader for now
nplourde
parents:
18783
diff
changeset
|
352 anon=1; |
d9cedf7b8069
added mmap_anon to osdep lib. Used in loader for now
nplourde
parents:
18783
diff
changeset
|
353 |
1 | 354 if(!anon) |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2069
diff
changeset
|
355 { |
1 | 356 len=lseek(hFile, 0, SEEK_END); |
357 lseek(hFile, 0, SEEK_SET); | |
358 } | |
359 else len=dwMaxLow; | |
360 | |
361 if(flProtect & PAGE_READONLY) | |
362 mmap_access |=PROT_READ; | |
363 else | |
364 mmap_access |=PROT_READ|PROT_WRITE; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2069
diff
changeset
|
365 |
1 | 366 if(anon) |
21248 | 367 answer=mmap_anon(NULL, len, mmap_access, MAP_PRIVATE, 0); |
21187
d9cedf7b8069
added mmap_anon to osdep lib. Used in loader for now
nplourde
parents:
18783
diff
changeset
|
368 else |
d9cedf7b8069
added mmap_anon to osdep lib. Used in loader for now
nplourde
parents:
18783
diff
changeset
|
369 answer=mmap(NULL, len, mmap_access, MAP_PRIVATE, hFile, 0); |
d9cedf7b8069
added mmap_anon to osdep lib. Used in loader for now
nplourde
parents:
18783
diff
changeset
|
370 |
2069 | 371 if(answer!=(LPVOID)-1) |
1 | 372 { |
373 if(fm==0) | |
374 { | |
7386 | 375 fm = (file_mapping*) malloc(sizeof(file_mapping)); |
1 | 376 fm->prev=NULL; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2069
diff
changeset
|
377 } |
1 | 378 else |
379 { | |
7386 | 380 fm->next = (file_mapping*) malloc(sizeof(file_mapping)); |
1 | 381 fm->next->prev=fm; |
382 fm=fm->next; | |
383 } | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2069
diff
changeset
|
384 fm->next=NULL; |
1 | 385 fm->handle=answer; |
386 if(name) | |
387 { | |
7386 | 388 fm->name = (char*) malloc(strlen(name)+1); |
1 | 389 strcpy(fm->name, name); |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2069
diff
changeset
|
390 } |
1 | 391 else |
392 fm->name=NULL; | |
393 fm->mapping_size=len; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2069
diff
changeset
|
394 |
2069 | 395 return (HANDLE)answer; |
1 | 396 } |
397 return (HANDLE)0; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2069
diff
changeset
|
398 } |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
128
diff
changeset
|
399 WIN_BOOL WINAPI UnmapViewOfFile(LPVOID handle) |
1 | 400 { |
401 file_mapping* p; | |
402 int result; | |
403 if(fm==0) | |
2069 | 404 return 0; |
1 | 405 for(p=fm; p; p=p->next) |
406 { | |
2069 | 407 if(p->handle==handle) |
1 | 408 { |
409 result=munmap((void*)handle, p->mapping_size); | |
410 if(p->next)p->next->prev=p->prev; | |
411 if(p->prev)p->prev->next=p->next; | |
412 if(p->name) | |
413 free(p->name); | |
414 if(p==fm) | |
415 fm=p->prev; | |
416 free(p); | |
417 return result; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2069
diff
changeset
|
418 } |
1 | 419 } |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2069
diff
changeset
|
420 return 0; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2069
diff
changeset
|
421 } |
1 | 422 //static int va_size=0; |
423 struct virt_alloc_s; | |
424 typedef struct virt_alloc_s | |
425 { | |
426 int mapping_size; | |
427 char* address; | |
428 struct virt_alloc_s* next; | |
429 struct virt_alloc_s* prev; | |
430 int state; | |
431 }virt_alloc; | |
432 static virt_alloc* vm=0; | |
433 #define MEM_COMMIT 0x00001000 | |
434 #define MEM_RESERVE 0x00002000 | |
435 | |
2069 | 436 LPVOID WINAPI VirtualAlloc(LPVOID address, DWORD size, DWORD type, DWORD protection) |
1 | 437 { |
438 void* answer; | |
13303 | 439 long pgsz; |
440 | |
441 //printf("VirtualAlloc(0x%08X, %u, 0x%08X, 0x%08X)\n", (unsigned)address, size, type, protection); | |
442 | |
443 if ((type&(MEM_RESERVE|MEM_COMMIT)) == 0) return NULL; | |
444 | |
445 if (type&MEM_RESERVE && (unsigned)address&0xffff) { | |
446 size += (unsigned)address&0xffff; | |
13827 | 447 address = (unsigned)address&~0xffff; |
13303 | 448 } |
449 pgsz = sysconf(_SC_PAGESIZE); | |
450 if (type&MEM_COMMIT && (unsigned)address%pgsz) { | |
451 size += (unsigned)address%pgsz; | |
452 address -= (unsigned)address%pgsz; | |
453 } | |
454 | |
455 if (type&MEM_RESERVE && size<0x10000) size = 0x10000; | |
456 if (size%pgsz) size += pgsz - size%pgsz; | |
457 | |
1 | 458 if(address!=0) |
459 { | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2069
diff
changeset
|
460 //check whether we can allow to allocate this |
1 | 461 virt_alloc* str=vm; |
462 while(str) | |
463 { | |
464 if((unsigned)address>=(unsigned)str->address+str->mapping_size) | |
465 { | |
466 str=str->prev; | |
467 continue; | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2069
diff
changeset
|
468 } |
13303 | 469 if((unsigned)address+size<=(unsigned)str->address) |
1 | 470 { |
471 str=str->prev; | |
472 continue; | |
473 } | |
474 if(str->state==0) | |
475 { | |
476 #warning FIXME | |
13303 | 477 if( ((unsigned)address >= (unsigned)str->address) |
478 && ((unsigned)address+size<=(unsigned)str->address+str->mapping_size) | |
479 && (type & MEM_COMMIT)) | |
1 | 480 { |
481 return address; //returning previously reserved memory | |
482 } | |
13303 | 483 //printf(" VirtualAlloc(...) does not commit or not entirely within reserved, and\n"); |
1 | 484 } |
13303 | 485 /*printf(" VirtualAlloc(...) (0x%08X, %u) overlaps with (0x%08X, %u, state=%d)\n", |
486 (unsigned)address, size, (unsigned)str->address, str->mapping_size, str->state);*/ | |
1 | 487 return NULL; |
488 } | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2069
diff
changeset
|
489 } |
13303 | 490 |
21187
d9cedf7b8069
added mmap_anon to osdep lib. Used in loader for now
nplourde
parents:
18783
diff
changeset
|
491 answer=mmap_anon(address, size, PROT_READ | PROT_WRITE | PROT_EXEC, |
21248 | 492 MAP_PRIVATE, 0); |
1 | 493 // answer=FILE_dommap(-1, address, 0, size, 0, 0, |
494 // PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE); | |
21187
d9cedf7b8069
added mmap_anon to osdep lib. Used in loader for now
nplourde
parents:
18783
diff
changeset
|
495 |
13303 | 496 if (answer != (void *)-1 && address && answer != address) { |
497 /* It is dangerous to try mmap() with MAP_FIXED since it does not | |
498 always detect conflicts or non-allocation and chaos ensues after | |
499 a successful call but an overlapping or non-allocated region. */ | |
500 munmap(answer, size); | |
501 answer = (void *) -1; | |
502 errno = EINVAL; | |
503 //printf(" VirtualAlloc(...) cannot satisfy requested address but address=NULL would work.\n"); | |
504 } | |
1 | 505 if(answer==(void*)-1) |
506 { | |
13306 | 507 /*printf(" VirtualAlloc(...) mmap(0x%08X, %u, ...) failed with errno=%d (\"%s\")\n", |
508 (unsigned)address, size, errno, strerror(errno));*/ | |
1 | 509 return NULL; |
510 } | |
511 else | |
512 { | |
7386 | 513 virt_alloc *new_vm = (virt_alloc*) malloc(sizeof(virt_alloc)); |
1 | 514 new_vm->mapping_size=size; |
7386 | 515 new_vm->address=(char*)answer; |
1 | 516 new_vm->prev=vm; |
517 if(type == MEM_RESERVE) | |
518 new_vm->state=0; | |
519 else | |
520 new_vm->state=1; | |
521 if(vm) | |
522 vm->next=new_vm; | |
523 vm=new_vm; | |
524 vm->next=0; | |
3134 | 525 //if(va_size!=0) |
526 // printf("Multiple VirtualAlloc!\n"); | |
13303 | 527 //printf(" VirtualAlloc(...) provides (0x%08X, %u)\n", (unsigned)answer, size); |
1 | 528 return answer; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2069
diff
changeset
|
529 } |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2069
diff
changeset
|
530 } |
13303 | 531 |
3134 | 532 WIN_BOOL WINAPI VirtualFree(LPVOID address, SIZE_T dwSize, DWORD dwFreeType)//not sure |
1 | 533 { |
534 virt_alloc* str=vm; | |
535 int answer; | |
13303 | 536 |
537 //printf("VirtualFree(0x%08X, %d, 0x%08X)\n", (unsigned)address, dwSize, dwFreeType); | |
1 | 538 while(str) |
539 { | |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2069
diff
changeset
|
540 if(address!=str->address) |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2069
diff
changeset
|
541 { |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2069
diff
changeset
|
542 str=str->prev; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2069
diff
changeset
|
543 continue; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2069
diff
changeset
|
544 } |
13303 | 545 //printf(" VirtualFree(...) munmap(0x%08X, %d)\n", (unsigned)str->address, str->mapping_size); |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2069
diff
changeset
|
546 answer=munmap(str->address, str->mapping_size); |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2069
diff
changeset
|
547 if(str->next)str->next->prev=str->prev; |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2069
diff
changeset
|
548 if(str->prev)str->prev->next=str->next; |
3134 | 549 if(vm==str)vm=str->prev; |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2069
diff
changeset
|
550 free(str); |
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2069
diff
changeset
|
551 return 0; |
1 | 552 } |
553 return -1; | |
554 } | |
555 | |
2069 | 556 INT WINAPI WideCharToMultiByte(UINT codepage, DWORD flags, LPCWSTR src, |
557 INT srclen,LPSTR dest, INT destlen, LPCSTR defch, WIN_BOOL* used_defch) | |
1 | 558 { |
559 int i; | |
128 | 560 if(srclen==-1){srclen=0; while(src[srclen++]);} |
22413
219d577285e1
Fix and simplify the WideCharToMultiByte and MultiByteToWideChar pseudo-implementations.
reimar
parents:
21248
diff
changeset
|
561 if(destlen==0) |
219d577285e1
Fix and simplify the WideCharToMultiByte and MultiByteToWideChar pseudo-implementations.
reimar
parents:
21248
diff
changeset
|
562 return srclen; |
1 | 563 if(used_defch) |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2069
diff
changeset
|
564 *used_defch=0; |
1 | 565 for(i=0; i<min(srclen, destlen); i++) |
22413
219d577285e1
Fix and simplify the WideCharToMultiByte and MultiByteToWideChar pseudo-implementations.
reimar
parents:
21248
diff
changeset
|
566 *dest++=(char)*src++; |
1 | 567 return min(srclen, destlen); |
568 } | |
2069 | 569 INT WINAPI MultiByteToWideChar(UINT codepage,DWORD flags, LPCSTR src, INT srclen, |
570 LPWSTR dest, INT destlen) | |
1 | 571 { |
22413
219d577285e1
Fix and simplify the WideCharToMultiByte and MultiByteToWideChar pseudo-implementations.
reimar
parents:
21248
diff
changeset
|
572 int i; |
219d577285e1
Fix and simplify the WideCharToMultiByte and MultiByteToWideChar pseudo-implementations.
reimar
parents:
21248
diff
changeset
|
573 if(srclen==-1){srclen=0; while(src[srclen++]);} |
219d577285e1
Fix and simplify the WideCharToMultiByte and MultiByteToWideChar pseudo-implementations.
reimar
parents:
21248
diff
changeset
|
574 if(destlen==0) |
219d577285e1
Fix and simplify the WideCharToMultiByte and MultiByteToWideChar pseudo-implementations.
reimar
parents:
21248
diff
changeset
|
575 return srclen; |
219d577285e1
Fix and simplify the WideCharToMultiByte and MultiByteToWideChar pseudo-implementations.
reimar
parents:
21248
diff
changeset
|
576 for(i=0; i<min(srclen, destlen); i++) |
219d577285e1
Fix and simplify the WideCharToMultiByte and MultiByteToWideChar pseudo-implementations.
reimar
parents:
21248
diff
changeset
|
577 *dest++=(WCHAR)*src++; |
219d577285e1
Fix and simplify the WideCharToMultiByte and MultiByteToWideChar pseudo-implementations.
reimar
parents:
21248
diff
changeset
|
578 return min(srclen, destlen); |
1 | 579 } |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
128
diff
changeset
|
580 HANDLE WINAPI OpenFileMappingA(DWORD access, WIN_BOOL prot, LPCSTR name) |
1 | 581 { |
582 file_mapping* p; | |
583 if(fm==0) | |
584 return (HANDLE)0; | |
585 if(name==0) | |
586 return (HANDLE)0; | |
587 for(p=fm; p; p=p->prev) | |
588 { | |
589 if(p->name==0) | |
590 continue; | |
591 if(strcmp(p->name, name)==0) | |
2069 | 592 return (HANDLE)p->handle; |
1 | 593 } |
2651
958d10763c34
partially synced with avifile... (TODO: migrate to new registry.c and driver.c)
arpi
parents:
2069
diff
changeset
|
594 return 0; |
1 | 595 } |