ext.c
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:14k
源码类别:

midi

开发平台:

Unix_Linux

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