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

midi

开发平台:

Unix_Linux

  1. /*
  2.  * Resources
  3.  * $Id: 3560dd07309919256f4b6e24a74ef27822cb0b61 $
  4.  *
  5.  * Copyright 1993 Robert J. Amstadt
  6.  * Copyright 1995 Alexandre Julliard
  7.  *
  8.  * Originally distributed under LPGL 2.1 (or later) by the Wine project.
  9.  *
  10.  * Modified for use with MPlayer, detailed CVS changelog at
  11.  * http://www.mplayerhq.hu/cgi-bin/cvsweb.cgi/main/
  12.  *
  13.  * File now distributed as part of VLC media player with no modifications.
  14.  *
  15.  * This program is free software; you can redistribute it and/or modify
  16.  * it under the terms of the GNU General Public License as published by
  17.  * the Free Software Foundation; either version 2 of the License, or
  18.  * (at your option) any later version.
  19.  *
  20.  * This program is distributed in the hope that it will be useful,
  21.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  22.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  23.  * GNU General Public License for more details.
  24.  *
  25.  * You should have received a copy of the GNU General Public License
  26.  * along with this program; if not, write to the Free Software
  27.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  28.  */
  29. #include "config.h"
  30. #include <assert.h>
  31. #include <stdio.h>
  32. #include <stdlib.h>
  33. #include <string.h>
  34. #include <sys/types.h>
  35. #include <sys/stat.h>
  36. #include <fcntl.h>
  37. #include <unistd.h>
  38. #include "wine/winbase.h"
  39. #include "wine/windef.h"
  40. #include "wine/winuser.h"
  41. #include "wine/heap.h"
  42. #include "wine/module.h"
  43. #include "wine/debugtools.h"
  44. #include "wine/winerror.h"
  45. #include "loader.h"
  46. #define CP_ACP 0
  47. WORD WINE_LanguageId=0x409;//english
  48. #define HRSRC_MAP_BLOCKSIZE 16
  49. typedef struct _HRSRC_ELEM
  50. {
  51.     HANDLE hRsrc;
  52.     WORD     type;
  53. } HRSRC_ELEM;
  54. typedef struct _HRSRC_MAP
  55. {
  56.     int nAlloc;
  57.     int nUsed;
  58.     HRSRC_ELEM *elem;
  59. } HRSRC_MAP;
  60. static HRSRC RES_FindResource2( HMODULE hModule, LPCSTR type,
  61. LPCSTR name, WORD lang, int unicode)
  62. {
  63.     HRSRC hRsrc = 0;
  64.     LPWSTR typeStr, nameStr;    
  65.     WINE_MODREF *wm = MODULE32_LookupHMODULE( hModule );
  66.     if(!wm)
  67. return 0;    
  68.     /* 32-bit PE module */
  69.     
  70.     if ( HIWORD( type ) && (!unicode))
  71. typeStr = HEAP_strdupAtoW( GetProcessHeap(), 0, type );
  72.     else
  73. typeStr = (LPWSTR)type;
  74.     if ( HIWORD( name ) && (!unicode))
  75. nameStr = HEAP_strdupAtoW( GetProcessHeap(), 0, name );
  76.     else
  77. nameStr = (LPWSTR)name;
  78.     
  79.     hRsrc = PE_FindResourceExW( wm, nameStr, typeStr, lang );
  80.     
  81.     if ( HIWORD( type ) && (!unicode)) 
  82. HeapFree( GetProcessHeap(), 0, typeStr );
  83.     if ( HIWORD( name ) && (!unicode)) 
  84. HeapFree( GetProcessHeap(), 0, nameStr );
  85.     return hRsrc;
  86. }
  87. /**********************************************************************
  88.  *          RES_FindResource
  89.  */
  90. static HRSRC RES_FindResource( HMODULE hModule, LPCSTR type,
  91.                                LPCSTR name, WORD lang, int unicode )
  92. {
  93.     HRSRC hRsrc;
  94. //    __TRY
  95. //    {
  96. hRsrc = RES_FindResource2(hModule, type, name, lang, unicode);
  97. //    }
  98. //    __EXCEPT(page_fault)
  99. //    {
  100. // WARN("page faultn");
  101. // SetLastError(ERROR_INVALID_PARAMETER);
  102. // return 0;
  103. //    }
  104. //    __ENDTRY
  105.     return hRsrc;
  106. }
  107. /**********************************************************************
  108.  *          RES_SizeofResource
  109.  */
  110. static DWORD RES_SizeofResource( HMODULE hModule, HRSRC hRsrc)
  111. {
  112.     DWORD size = 0;
  113.     HRSRC hRsrc32;
  114. //    HMODULE16 hMod16   = MapHModuleLS( hModule );
  115. //    NE_MODULE *pModule = NE_GetPtr( hMod16 );
  116. //    WINE_MODREF *wm    = pModule && pModule->module32? 
  117. //                         MODULE32_LookupHMODULE( pModule->module32 ) : NULL;
  118.     WINE_MODREF *wm = MODULE32_LookupHMODULE( hModule );
  119.     if ( !hModule || !hRsrc ) return 0;
  120.     /* 32-bit PE module */
  121.     /* If we got a 16-bit hRsrc, convert it */
  122. //    hRsrc32  = HIWORD(hRsrc)? hRsrc : MapHRsrc16To32( pModule, hRsrc );
  123.     if(!HIWORD(hRsrc))
  124.     {
  125. printf("16-bit hRsrcs not supportedn");
  126. return 0;
  127.     }
  128.     size = PE_SizeofResource( hModule, hRsrc );
  129.     return size;
  130. }
  131. /**********************************************************************
  132.  *          RES_AccessResource
  133.  */
  134. static HFILE RES_AccessResource( HMODULE hModule, HRSRC hRsrc )
  135. {
  136.     HFILE hFile = HFILE_ERROR;
  137.     WINE_MODREF *wm = MODULE32_LookupHMODULE( hModule );
  138.     if ( !hModule || !hRsrc ) return HFILE_ERROR;
  139.     /* 32-bit PE module */
  140.     FIXME("32-bit modules not yet supported.n" );
  141.     hFile = HFILE_ERROR;
  142.     return hFile;
  143. }
  144. /**********************************************************************
  145.  *          RES_LoadResource
  146.  */
  147. static HGLOBAL RES_LoadResource( HMODULE hModule, HRSRC hRsrc)
  148. {
  149.     HGLOBAL hMem = 0;
  150.     HRSRC hRsrc32;
  151.     WINE_MODREF *wm = MODULE32_LookupHMODULE( hModule );
  152.     if ( !hModule || !hRsrc ) return 0;
  153.     /* 32-bit PE module */
  154.     /* If we got a 16-bit hRsrc, convert it */
  155. //    hRsrc32 = HIWORD(hRsrc)? hRsrc : MapHRsrc16To32( pModule, hRsrc );
  156.     if(!HIWORD(hRsrc))
  157.     {
  158. printf("16-bit hRsrcs not supportedn");
  159. return 0;
  160.     }
  161.     hMem = PE_LoadResource( wm, hRsrc );
  162.     return hMem;
  163. }
  164. /**********************************************************************
  165.  *          RES_LockResource
  166.  */
  167. static LPVOID RES_LockResource( HGLOBAL handle )
  168. {
  169.     LPVOID bits = NULL;
  170.     TRACE("(%08x, %s)n", handle, "PE" );
  171.     bits = (LPVOID)handle;
  172.     return bits;
  173. }
  174. /**********************************************************************
  175.  *          RES_FreeResource
  176.  */
  177. static WIN_BOOL RES_FreeResource( HGLOBAL handle )
  178. {
  179.     HGLOBAL retv = handle;
  180.     return (WIN_BOOL)retv;
  181. }
  182. /**********************************************************************
  183.  *     FindResourceA    (KERNEL32.128)
  184.  */
  185. HANDLE WINAPI FindResourceA( HMODULE hModule, LPCSTR name, LPCSTR type )
  186. {
  187.     return RES_FindResource( hModule, type, name, 
  188.                              WINE_LanguageId, 0);
  189. }
  190. HANDLE WINAPI FindResourceW( HMODULE hModule, LPCWSTR name, LPCWSTR type )
  191. {
  192.     return RES_FindResource( hModule, (LPCSTR)type, (LPCSTR)name, 
  193.                              WINE_LanguageId, 1);
  194. }
  195. /**********************************************************************
  196.  *     FindResourceExA  (KERNEL32.129)
  197.  */
  198. HANDLE WINAPI FindResourceExA( HMODULE hModule, 
  199.                                LPCSTR type, LPCSTR name, WORD lang )
  200. {
  201.     return RES_FindResource( hModule, type, name, 
  202.                              lang, 0 );
  203. }
  204. HANDLE WINAPI FindResourceExW( HMODULE hModule, 
  205.                                LPCWSTR type, LPCWSTR name, WORD lang )
  206. {
  207.     return RES_FindResource( hModule, (LPCSTR)type, (LPCSTR)name, 
  208.                              lang, 1 );
  209. }
  210. /**********************************************************************
  211.  *     LockResource     (KERNEL32.384)
  212.  */
  213. LPVOID WINAPI LockResource( HGLOBAL handle )
  214. {
  215.     return RES_LockResource( handle );
  216. }
  217. /**********************************************************************
  218.  *     FreeResource     (KERNEL32.145)
  219.  */
  220. WIN_BOOL WINAPI FreeResource( HGLOBAL handle )
  221. {
  222.     return RES_FreeResource( handle );
  223. }
  224. /**********************************************************************
  225.  *     AccessResource   (KERNEL32.64)
  226.  */
  227. INT WINAPI AccessResource( HMODULE hModule, HRSRC hRsrc )
  228. {
  229.     return RES_AccessResource( hModule, hRsrc );
  230. }
  231. /**********************************************************************
  232.  *     SizeofResource   (KERNEL32.522)
  233.  */
  234. DWORD WINAPI SizeofResource( HINSTANCE hModule, HRSRC hRsrc )
  235. {
  236.     return RES_SizeofResource( hModule, hRsrc );
  237. }
  238. INT WINAPI LoadStringW( HINSTANCE instance, UINT resource_id,
  239.                             LPWSTR buffer, INT buflen );
  240. /**********************************************************************
  241.  * LoadStringA (USER32.375)
  242.  */
  243. INT WINAPI LoadStringA( HINSTANCE instance, UINT resource_id,
  244.                             LPSTR buffer, INT buflen )
  245. {
  246.     INT    retval;
  247.     INT    wbuflen;
  248.     INT    abuflen;
  249.     LPWSTR wbuf = NULL;
  250.     LPSTR  abuf = NULL;
  251.     if ( buffer != NULL && buflen > 0 )
  252. *buffer = 0;
  253.     wbuflen = LoadStringW(instance,resource_id,NULL,0);
  254.     if ( !wbuflen )
  255. return 0;
  256.     wbuflen ++;
  257.     retval = 0;
  258.     wbuf = (LPWSTR) HeapAlloc( GetProcessHeap(), 0, wbuflen * sizeof(WCHAR) );
  259.     wbuflen = LoadStringW(instance,resource_id,wbuf,wbuflen);
  260.     if ( wbuflen > 0 )
  261.     {
  262. abuflen = WideCharToMultiByte(CP_ACP,0,wbuf,wbuflen,NULL,0,NULL,NULL);
  263. if ( abuflen > 0 )
  264. {
  265.     if ( buffer == NULL || buflen == 0 )
  266. retval = abuflen;
  267.     else
  268.     {
  269. abuf = (LPSTR) HeapAlloc( GetProcessHeap(), 0, abuflen * sizeof(CHAR) );
  270. abuflen = WideCharToMultiByte(CP_ACP,0,wbuf,wbuflen,abuf,abuflen,NULL,NULL);
  271. if ( abuflen > 0 )
  272. {
  273.     abuflen = min(abuflen,buflen - 1);
  274.     memcpy( buffer, abuf, abuflen );
  275.     buffer[abuflen] = 0;
  276.     retval = abuflen;
  277. }
  278. HeapFree( GetProcessHeap(), 0, abuf );
  279.     }
  280. }
  281.     }
  282.     HeapFree( GetProcessHeap(), 0, wbuf );
  283.     return retval;
  284. }
  285. /**********************************************************************
  286.  * LoadStringW (USER32.376)
  287.  */
  288. INT WINAPI LoadStringW( HINSTANCE instance, UINT resource_id,
  289.                             LPWSTR buffer, INT buflen )
  290. {
  291.     HGLOBAL hmem;
  292.     HRSRC hrsrc;
  293.     WCHAR *p;
  294.     int string_num;
  295.     int i;
  296.     if (HIWORD(resource_id)==0xFFFF) /* netscape 3 passes this */
  297. resource_id = (UINT)(-((INT)resource_id));
  298.     TRACE("instance = %04x, id = %04x, buffer = %08x, "
  299.           "length = %dn", instance, (int)resource_id, (int) buffer, buflen);
  300.     /* Use bits 4 - 19 (incremented by 1) as resourceid, mask out 
  301.      * 20 - 31. */
  302.     hrsrc = FindResourceW( instance, (LPCWSTR)(((resource_id>>4)&0xffff)+1),
  303.                              RT_STRINGW );
  304.     if (!hrsrc) return 0;
  305.     hmem = LoadResource( instance, hrsrc );
  306.     if (!hmem) return 0;
  307.     
  308.     p = (WCHAR*) LockResource(hmem);
  309.     string_num = resource_id & 0x000f;
  310.     for (i = 0; i < string_num; i++)
  311. p += *p + 1;
  312.     
  313.     TRACE("strlen = %dn", (int)*p );
  314.     
  315.     if (buffer == NULL) return *p;
  316.     i = min(buflen - 1, *p);
  317.     if (i > 0) {
  318. memcpy(buffer, p + 1, i * sizeof (WCHAR));
  319. buffer[i] = (WCHAR) 0;
  320.     } else {
  321. if (buflen > 1) {
  322.     buffer[0] = (WCHAR) 0;
  323.     return 0;
  324. }
  325. #if 0
  326. WARN("Don't know why caller give buflen=%d *p=%d trying to obtain string '%s'n", buflen, *p, p + 1);
  327. #endif
  328.     }
  329.     TRACE("String loaded !n");
  330.     return i;
  331. }
  332. /* Messages...used by FormatMessage32* (KERNEL32.something)
  333.  * 
  334.  * They can be specified either directly or using a message ID and
  335.  * loading them from the resource.
  336.  * 
  337.  * The resourcedata has following format:
  338.  * start:
  339.  * 0: DWORD nrofentries
  340.  * nrofentries * subentry:
  341.  * 0: DWORD firstentry
  342.  * 4: DWORD lastentry
  343.  *      8: DWORD offset from start to the stringentries
  344.  *
  345.  * (lastentry-firstentry) * stringentry:
  346.  * 0: WORD len (0 marks end)
  347.  * 2: WORD flags
  348.  * 4: CHAR[len-4]
  349.  *  (stringentry i of a subentry refers to the ID 'firstentry+i')
  350.  *
  351.  * Yes, ANSI strings in win32 resources. Go figure.
  352.  */
  353. /**********************************************************************
  354.  * LoadMessageA (internal)
  355.  */
  356. INT WINAPI LoadMessageA( HMODULE instance, UINT id, WORD lang,
  357.                       LPSTR buffer, INT buflen )
  358. {
  359.     HGLOBAL hmem;
  360.     HRSRC hrsrc;
  361.     PMESSAGE_RESOURCE_DATA mrd;
  362.     PMESSAGE_RESOURCE_BLOCK mrb;
  363.     PMESSAGE_RESOURCE_ENTRY mre;
  364.     int i,slen;
  365.     TRACE("instance = %08lx, id = %08lx, buffer = %p, length = %ldn", (DWORD)instance, (DWORD)id, buffer, (DWORD)buflen);
  366.     /*FIXME: I am not sure about the '1' ... But I've only seen those entries*/
  367.     hrsrc = FindResourceExW(instance,RT_MESSAGELISTW,(LPWSTR)1,lang);
  368.     if (!hrsrc) return 0;
  369.     hmem = LoadResource( instance, hrsrc );
  370.     if (!hmem) return 0;
  371.     
  372.     mrd = (PMESSAGE_RESOURCE_DATA)LockResource(hmem);
  373.     mre = NULL;
  374.     mrb = &(mrd->Blocks[0]);
  375.     for (i=mrd->NumberOfBlocks;i--;) {
  376.      if ((id>=mrb->LowId) && (id<=mrb->HighId)) {
  377.     mre = (PMESSAGE_RESOURCE_ENTRY)(((char*)mrd)+mrb->OffsetToEntries);
  378.     id -= mrb->LowId;
  379.     break;
  380. }
  381. mrb++;
  382.     }
  383.     if (!mre)
  384.      return 0;
  385.     for (i=id;i--;) {
  386.      if (!mre->Length)
  387. return 0;
  388.      mre = (PMESSAGE_RESOURCE_ENTRY)(((char*)mre)+(mre->Length));
  389.     }
  390.     slen=mre->Length;
  391.     TRACE(" - strlen=%dn",slen);
  392.     i = min(buflen - 1, slen);
  393.     if (buffer == NULL)
  394. return slen;
  395.     if (i>0) {
  396. lstrcpynA(buffer,(char*)mre->Text,i);
  397. buffer[i]=0;
  398.     } else {
  399. if (buflen>1) {
  400.     buffer[0]=0;
  401.     return 0;
  402. }
  403.     }
  404.     if (buffer)
  405.     TRACE("'%s' copied !n", buffer);
  406.     return i;
  407. }
  408. /**********************************************************************
  409.  * EnumResourceTypesA (KERNEL32.90)
  410.  */
  411. WIN_BOOL WINAPI EnumResourceTypesA( HMODULE hmodule,ENUMRESTYPEPROCA lpfun,
  412.                                     LONG lParam)
  413. {
  414. /* FIXME: move WINE_MODREF stuff here */
  415.     return PE_EnumResourceTypesA(hmodule,lpfun,lParam);
  416. }
  417. /**********************************************************************
  418.  * EnumResourceNamesA (KERNEL32.88)
  419.  */
  420. WIN_BOOL WINAPI EnumResourceNamesA( HMODULE hmodule, LPCSTR type,
  421.                                     ENUMRESNAMEPROCA lpfun, LONG lParam )
  422. {
  423. /* FIXME: move WINE_MODREF stuff here */
  424.     return PE_EnumResourceNamesA(hmodule,type,lpfun,lParam);
  425. }
  426. /**********************************************************************
  427.  * EnumResourceLanguagesA (KERNEL32.86)
  428.  */
  429. WIN_BOOL WINAPI EnumResourceLanguagesA( HMODULE hmodule, LPCSTR type,
  430.                                         LPCSTR name, ENUMRESLANGPROCA lpfun,
  431.                                         LONG lParam)
  432. {
  433. /* FIXME: move WINE_MODREF stuff here */
  434.     return PE_EnumResourceLanguagesA(hmodule,type,name,lpfun,lParam);
  435. }
  436. /**********************************************************************
  437.  *     LoadResource     (KERNEL32.370)
  438.  */
  439. HGLOBAL WINAPI LoadResource( HINSTANCE hModule, HRSRC hRsrc )
  440. {
  441.     return RES_LoadResource( hModule, hRsrc);
  442. }