X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libs%2Floader%2Fpe_resource.c;h=ff091b02959c47400a253ad6d9278dd0db524181;hb=6ee1e193fd896ab9a4729fde14f009d9ce629815;hp=5e54e5e711d7f287e860ad24e494238679ca244e;hpb=3305b049e7f587b23359a1c9047fb5763d19c1dc;p=vlc diff --git a/libs/loader/pe_resource.c b/libs/loader/pe_resource.c index 5e54e5e711..ff091b0295 100644 --- a/libs/loader/pe_resource.c +++ b/libs/loader/pe_resource.c @@ -45,86 +45,86 @@ #include "ext.h" /********************************************************************** - * HMODULE32toPE_MODREF + * HMODULE32toPE_MODREF * * small helper function to get a PE_MODREF from a passed HMODULE32 */ static PE_MODREF* HMODULE32toPE_MODREF(HMODULE hmod) { - WINE_MODREF *wm; + WINE_MODREF *wm; - wm = MODULE32_LookupHMODULE( hmod ); - if (!wm || wm->type!=MODULE32_PE) - return NULL; - return &(wm->binfmt.pe); + wm = MODULE32_LookupHMODULE( hmod ); + if (!wm || wm->type!=MODULE32_PE) + return NULL; + return &(wm->binfmt.pe); } /********************************************************************** - * GetResDirEntryW + * GetResDirEntryW * - * Helper function - goes down one level of PE resource tree + * Helper function - goes down one level of PE resource tree * */ PIMAGE_RESOURCE_DIRECTORY GetResDirEntryW(PIMAGE_RESOURCE_DIRECTORY resdirptr, - LPCWSTR name,DWORD root, - WIN_BOOL allowdefault) + LPCWSTR name,DWORD root, + WIN_BOOL allowdefault) { int entrynum; PIMAGE_RESOURCE_DIRECTORY_ENTRY entryTable; int namelen; if (HIWORD(name)) { - if (name[0]=='#') { - char buf[10]; - - lstrcpynWtoA(buf,name+1,10); - return GetResDirEntryW(resdirptr,(LPCWSTR)atoi(buf),root,allowdefault); - } - entryTable = (PIMAGE_RESOURCE_DIRECTORY_ENTRY) ( - (BYTE *) resdirptr + + if (name[0]=='#') { + char buf[10]; + + lstrcpynWtoA(buf,name+1,10); + return GetResDirEntryW(resdirptr,(LPCWSTR)atoi(buf),root,allowdefault); + } + entryTable = (PIMAGE_RESOURCE_DIRECTORY_ENTRY) ( + (BYTE *) resdirptr + sizeof(IMAGE_RESOURCE_DIRECTORY)); - namelen = lstrlenW(name); - for (entrynum = 0; entrynum < resdirptr->NumberOfNamedEntries; entrynum++) - { - PIMAGE_RESOURCE_DIR_STRING_U str = - (PIMAGE_RESOURCE_DIR_STRING_U) (root + - entryTable[entrynum].u1.s.NameOffset); - if(namelen != str->Length) - continue; - if(wcsnicmp(name,str->NameString,str->Length)==0) - return (PIMAGE_RESOURCE_DIRECTORY) ( - root + - entryTable[entrynum].u2.s.OffsetToDirectory); - } - return NULL; + namelen = lstrlenW(name); + for (entrynum = 0; entrynum < resdirptr->NumberOfNamedEntries; entrynum++) + { + PIMAGE_RESOURCE_DIR_STRING_U str = + (PIMAGE_RESOURCE_DIR_STRING_U) (root + + entryTable[entrynum].u1.s.NameOffset); + if(namelen != str->Length) + continue; + if(wcsnicmp(name,str->NameString,str->Length)==0) + return (PIMAGE_RESOURCE_DIRECTORY) ( + root + + entryTable[entrynum].u2.s.OffsetToDirectory); + } + return NULL; } else { - entryTable = (PIMAGE_RESOURCE_DIRECTORY_ENTRY) ( - (BYTE *) resdirptr + + entryTable = (PIMAGE_RESOURCE_DIRECTORY_ENTRY) ( + (BYTE *) resdirptr + sizeof(IMAGE_RESOURCE_DIRECTORY) + - resdirptr->NumberOfNamedEntries * sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY)); - for (entrynum = 0; entrynum < resdirptr->NumberOfIdEntries; entrynum++) - if ((DWORD)entryTable[entrynum].u1.Name == (DWORD)name) - return (PIMAGE_RESOURCE_DIRECTORY) ( - root + - entryTable[entrynum].u2.s.OffsetToDirectory); - /* just use first entry if no default can be found */ - if (allowdefault && !name && resdirptr->NumberOfIdEntries) - return (PIMAGE_RESOURCE_DIRECTORY) ( - root + - entryTable[0].u2.s.OffsetToDirectory); - return NULL; + resdirptr->NumberOfNamedEntries * sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY)); + for (entrynum = 0; entrynum < resdirptr->NumberOfIdEntries; entrynum++) + if ((DWORD)entryTable[entrynum].u1.Name == (DWORD)name) + return (PIMAGE_RESOURCE_DIRECTORY) ( + root + + entryTable[entrynum].u2.s.OffsetToDirectory); + /* just use first entry if no default can be found */ + if (allowdefault && !name && resdirptr->NumberOfIdEntries) + return (PIMAGE_RESOURCE_DIRECTORY) ( + root + + entryTable[0].u2.s.OffsetToDirectory); + return NULL; } } /********************************************************************** - * GetResDirEntryA + * GetResDirEntryA */ PIMAGE_RESOURCE_DIRECTORY GetResDirEntryA( PIMAGE_RESOURCE_DIRECTORY resdirptr, - LPCSTR name, DWORD root, - WIN_BOOL allowdefault ) + LPCSTR name, DWORD root, + WIN_BOOL allowdefault ) { PIMAGE_RESOURCE_DIRECTORY retv; - LPWSTR nameW = HIWORD(name)? HEAP_strdupAtoW( GetProcessHeap(), 0, name ) + LPWSTR nameW = HIWORD(name)? HEAP_strdupAtoW( GetProcessHeap(), 0, name ) : (LPWSTR)name; retv = GetResDirEntryW( resdirptr, nameW, root, allowdefault ); @@ -135,27 +135,27 @@ PIMAGE_RESOURCE_DIRECTORY GetResDirEntryA( PIMAGE_RESOURCE_DIRECTORY resdirptr, } /********************************************************************** - * PE_FindResourceEx32W + * PE_FindResourceEx32W */ HANDLE PE_FindResourceExW( - WINE_MODREF *wm,LPCWSTR name,LPCWSTR type,WORD lang + WINE_MODREF *wm,LPCWSTR name,LPCWSTR type,WORD lang ) { PIMAGE_RESOURCE_DIRECTORY resdirptr; DWORD root; HANDLE result; - PE_MODREF *pem = &(wm->binfmt.pe); + PE_MODREF *pem = &(wm->binfmt.pe); if (!pem || !pem->pe_resource) - return 0; + return 0; resdirptr = pem->pe_resource; root = (DWORD) resdirptr; if ((resdirptr = GetResDirEntryW(resdirptr, type, root, FALSE)) == NULL) - return 0; + return 0; if ((resdirptr = GetResDirEntryW(resdirptr, name, root, FALSE)) == NULL) - return 0; + return 0; result = (HANDLE)GetResDirEntryW(resdirptr, (LPCWSTR)(UINT)lang, root, FALSE); - /* Try LANG_NEUTRAL, too */ + /* Try LANG_NEUTRAL, too */ if(!result) return (HANDLE)GetResDirEntryW(resdirptr, (LPCWSTR)0, root, TRUE); return result; @@ -163,250 +163,250 @@ HANDLE PE_FindResourceExW( /********************************************************************** - * PE_LoadResource32 + * PE_LoadResource32 */ HANDLE PE_LoadResource( WINE_MODREF *wm, HANDLE hRsrc ) { if (!hRsrc || !wm || wm->type!=MODULE32_PE) - return 0; + return 0; return (HANDLE) (wm->module + ((PIMAGE_RESOURCE_DATA_ENTRY)hRsrc)->OffsetToData); } /********************************************************************** - * PE_SizeofResource32 + * PE_SizeofResource32 */ DWORD PE_SizeofResource( HINSTANCE hModule, HANDLE hRsrc ) { /* we don't need hModule */ if (!hRsrc) - return 0; + return 0; return ((PIMAGE_RESOURCE_DATA_ENTRY)hRsrc)->Size; } /********************************************************************** - * PE_EnumResourceTypes32A + * PE_EnumResourceTypes32A */ WIN_BOOL PE_EnumResourceTypesA(HMODULE hmod,ENUMRESTYPEPROCA lpfun,LONG lparam) { - PE_MODREF *pem = HMODULE32toPE_MODREF(hmod); - int i; - PIMAGE_RESOURCE_DIRECTORY resdir; - PIMAGE_RESOURCE_DIRECTORY_ENTRY et; - WIN_BOOL ret; - HANDLE heap = GetProcessHeap(); + PE_MODREF *pem = HMODULE32toPE_MODREF(hmod); + int i; + PIMAGE_RESOURCE_DIRECTORY resdir; + PIMAGE_RESOURCE_DIRECTORY_ENTRY et; + WIN_BOOL ret; + HANDLE heap = GetProcessHeap(); if (!pem || !pem->pe_resource) - return FALSE; + return FALSE; resdir = (PIMAGE_RESOURCE_DIRECTORY)pem->pe_resource; et =(PIMAGE_RESOURCE_DIRECTORY_ENTRY)((LPBYTE)resdir+sizeof(IMAGE_RESOURCE_DIRECTORY)); ret = FALSE; for (i=0;iNumberOfNamedEntries+resdir->NumberOfIdEntries;i++) { - LPSTR name; - - if (et[i].u1.s.NameIsString) - name = HEAP_strdupWtoA(heap,0,(LPWSTR)((LPBYTE)pem->pe_resource+et[i].u1.s.NameOffset)); - else - name = (LPSTR)(int)et[i].u1.Id; - ret = lpfun(hmod,name,lparam); - if (HIWORD(name)) - HeapFree(heap,0,name); - if (!ret) - break; + LPSTR name; + + if (et[i].u1.s.NameIsString) + name = HEAP_strdupWtoA(heap,0,(LPWSTR)((LPBYTE)pem->pe_resource+et[i].u1.s.NameOffset)); + else + name = (LPSTR)(int)et[i].u1.Id; + ret = lpfun(hmod,name,lparam); + if (HIWORD(name)) + HeapFree(heap,0,name); + if (!ret) + break; } return ret; } /********************************************************************** - * PE_EnumResourceTypes32W + * PE_EnumResourceTypes32W */ WIN_BOOL PE_EnumResourceTypesW(HMODULE hmod,ENUMRESTYPEPROCW lpfun,LONG lparam) { - PE_MODREF *pem = HMODULE32toPE_MODREF(hmod); - int i; - PIMAGE_RESOURCE_DIRECTORY resdir; - PIMAGE_RESOURCE_DIRECTORY_ENTRY et; - WIN_BOOL ret; + PE_MODREF *pem = HMODULE32toPE_MODREF(hmod); + int i; + PIMAGE_RESOURCE_DIRECTORY resdir; + PIMAGE_RESOURCE_DIRECTORY_ENTRY et; + WIN_BOOL ret; if (!pem || !pem->pe_resource) - return FALSE; + return FALSE; resdir = (PIMAGE_RESOURCE_DIRECTORY)pem->pe_resource; et =(PIMAGE_RESOURCE_DIRECTORY_ENTRY)((LPBYTE)resdir+sizeof(IMAGE_RESOURCE_DIRECTORY)); ret = FALSE; for (i=0;iNumberOfNamedEntries+resdir->NumberOfIdEntries;i++) { - LPWSTR type; - if (et[i].u1.s.NameIsString) - type = (LPWSTR)((LPBYTE)pem->pe_resource+et[i].u1.s.NameOffset); - else - type = (LPWSTR)(int)et[i].u1.Id; - - ret = lpfun(hmod,type,lparam); - if (!ret) - break; + LPWSTR type; + if (et[i].u1.s.NameIsString) + type = (LPWSTR)((LPBYTE)pem->pe_resource+et[i].u1.s.NameOffset); + else + type = (LPWSTR)(int)et[i].u1.Id; + + ret = lpfun(hmod,type,lparam); + if (!ret) + break; } return ret; } /********************************************************************** - * PE_EnumResourceNames32A + * PE_EnumResourceNames32A */ WIN_BOOL PE_EnumResourceNamesA( - HMODULE hmod,LPCSTR type,ENUMRESNAMEPROCA lpfun,LONG lparam + HMODULE hmod,LPCSTR type,ENUMRESNAMEPROCA lpfun,LONG lparam ) { - PE_MODREF *pem = HMODULE32toPE_MODREF(hmod); - int i; - PIMAGE_RESOURCE_DIRECTORY resdir; - PIMAGE_RESOURCE_DIRECTORY_ENTRY et; - WIN_BOOL ret; - HANDLE heap = GetProcessHeap(); - LPWSTR typeW; + PE_MODREF *pem = HMODULE32toPE_MODREF(hmod); + int i; + PIMAGE_RESOURCE_DIRECTORY resdir; + PIMAGE_RESOURCE_DIRECTORY_ENTRY et; + WIN_BOOL ret; + HANDLE heap = GetProcessHeap(); + LPWSTR typeW; if (!pem || !pem->pe_resource) - return FALSE; + return FALSE; resdir = (PIMAGE_RESOURCE_DIRECTORY)pem->pe_resource; if (HIWORD(type)) - typeW = HEAP_strdupAtoW(heap,0,type); + typeW = HEAP_strdupAtoW(heap,0,type); else - typeW = (LPWSTR)type; + typeW = (LPWSTR)type; resdir = GetResDirEntryW(resdir,typeW,(DWORD)pem->pe_resource,FALSE); if (HIWORD(typeW)) - HeapFree(heap,0,typeW); + HeapFree(heap,0,typeW); if (!resdir) - return FALSE; + return FALSE; et =(PIMAGE_RESOURCE_DIRECTORY_ENTRY)((LPBYTE)resdir+sizeof(IMAGE_RESOURCE_DIRECTORY)); ret = FALSE; for (i=0;iNumberOfNamedEntries+resdir->NumberOfIdEntries;i++) { - LPSTR name; - - if (et[i].u1.s.NameIsString) - name = HEAP_strdupWtoA(heap,0,(LPWSTR)((LPBYTE)pem->pe_resource+et[i].u1.s.NameOffset)); - else - name = (LPSTR)(int)et[i].u1.Id; - ret = lpfun(hmod,type,name,lparam); - if (HIWORD(name)) HeapFree(heap,0,name); - if (!ret) - break; + LPSTR name; + + if (et[i].u1.s.NameIsString) + name = HEAP_strdupWtoA(heap,0,(LPWSTR)((LPBYTE)pem->pe_resource+et[i].u1.s.NameOffset)); + else + name = (LPSTR)(int)et[i].u1.Id; + ret = lpfun(hmod,type,name,lparam); + if (HIWORD(name)) HeapFree(heap,0,name); + if (!ret) + break; } return ret; } /********************************************************************** - * PE_EnumResourceNames32W + * PE_EnumResourceNames32W */ WIN_BOOL PE_EnumResourceNamesW( - HMODULE hmod,LPCWSTR type,ENUMRESNAMEPROCW lpfun,LONG lparam + HMODULE hmod,LPCWSTR type,ENUMRESNAMEPROCW lpfun,LONG lparam ) { - PE_MODREF *pem = HMODULE32toPE_MODREF(hmod); - int i; - PIMAGE_RESOURCE_DIRECTORY resdir; - PIMAGE_RESOURCE_DIRECTORY_ENTRY et; - WIN_BOOL ret; + PE_MODREF *pem = HMODULE32toPE_MODREF(hmod); + int i; + PIMAGE_RESOURCE_DIRECTORY resdir; + PIMAGE_RESOURCE_DIRECTORY_ENTRY et; + WIN_BOOL ret; if (!pem || !pem->pe_resource) - return FALSE; + return FALSE; resdir = (PIMAGE_RESOURCE_DIRECTORY)pem->pe_resource; resdir = GetResDirEntryW(resdir,type,(DWORD)pem->pe_resource,FALSE); if (!resdir) - return FALSE; + return FALSE; et =(PIMAGE_RESOURCE_DIRECTORY_ENTRY)((LPBYTE)resdir+sizeof(IMAGE_RESOURCE_DIRECTORY)); ret = FALSE; for (i=0;iNumberOfNamedEntries+resdir->NumberOfIdEntries;i++) { - LPWSTR name; - if (et[i].u1.s.NameIsString) - name = (LPWSTR)((LPBYTE)pem->pe_resource+et[i].u1.s.NameOffset); - else - name = (LPWSTR)(int)et[i].u1.Id; - ret = lpfun(hmod,type,name,lparam); - if (!ret) - break; + LPWSTR name; + if (et[i].u1.s.NameIsString) + name = (LPWSTR)((LPBYTE)pem->pe_resource+et[i].u1.s.NameOffset); + else + name = (LPWSTR)(int)et[i].u1.Id; + ret = lpfun(hmod,type,name,lparam); + if (!ret) + break; } return ret; } /********************************************************************** - * PE_EnumResourceNames32A + * PE_EnumResourceNames32A */ WIN_BOOL PE_EnumResourceLanguagesA( - HMODULE hmod,LPCSTR name,LPCSTR type,ENUMRESLANGPROCA lpfun, - LONG lparam + HMODULE hmod,LPCSTR name,LPCSTR type,ENUMRESLANGPROCA lpfun, + LONG lparam ) { - PE_MODREF *pem = HMODULE32toPE_MODREF(hmod); - int i; - PIMAGE_RESOURCE_DIRECTORY resdir; - PIMAGE_RESOURCE_DIRECTORY_ENTRY et; - WIN_BOOL ret; - HANDLE heap = GetProcessHeap(); - LPWSTR nameW,typeW; + PE_MODREF *pem = HMODULE32toPE_MODREF(hmod); + int i; + PIMAGE_RESOURCE_DIRECTORY resdir; + PIMAGE_RESOURCE_DIRECTORY_ENTRY et; + WIN_BOOL ret; + HANDLE heap = GetProcessHeap(); + LPWSTR nameW,typeW; if (!pem || !pem->pe_resource) - return FALSE; + return FALSE; resdir = (PIMAGE_RESOURCE_DIRECTORY)pem->pe_resource; if (HIWORD(name)) - nameW = HEAP_strdupAtoW(heap,0,name); + nameW = HEAP_strdupAtoW(heap,0,name); else - nameW = (LPWSTR)name; + nameW = (LPWSTR)name; resdir = GetResDirEntryW(resdir,nameW,(DWORD)pem->pe_resource,FALSE); if (HIWORD(nameW)) - HeapFree(heap,0,nameW); + HeapFree(heap,0,nameW); if (!resdir) - return FALSE; + return FALSE; if (HIWORD(type)) - typeW = HEAP_strdupAtoW(heap,0,type); + typeW = HEAP_strdupAtoW(heap,0,type); else - typeW = (LPWSTR)type; + typeW = (LPWSTR)type; resdir = GetResDirEntryW(resdir,typeW,(DWORD)pem->pe_resource,FALSE); if (HIWORD(typeW)) - HeapFree(heap,0,typeW); + HeapFree(heap,0,typeW); if (!resdir) - return FALSE; + return FALSE; et =(PIMAGE_RESOURCE_DIRECTORY_ENTRY)((LPBYTE)resdir+sizeof(IMAGE_RESOURCE_DIRECTORY)); ret = FALSE; for (i=0;iNumberOfNamedEntries+resdir->NumberOfIdEntries;i++) { - /* languages are just ids... I hopem */ - ret = lpfun(hmod,name,type,et[i].u1.Id,lparam); - if (!ret) - break; + /* languages are just ids... I hopem */ + ret = lpfun(hmod,name,type,et[i].u1.Id,lparam); + if (!ret) + break; } return ret; } /********************************************************************** - * PE_EnumResourceLanguages32W + * PE_EnumResourceLanguages32W */ WIN_BOOL PE_EnumResourceLanguagesW( - HMODULE hmod,LPCWSTR name,LPCWSTR type,ENUMRESLANGPROCW lpfun, - LONG lparam + HMODULE hmod,LPCWSTR name,LPCWSTR type,ENUMRESLANGPROCW lpfun, + LONG lparam ) { - PE_MODREF *pem = HMODULE32toPE_MODREF(hmod); - int i; - PIMAGE_RESOURCE_DIRECTORY resdir; - PIMAGE_RESOURCE_DIRECTORY_ENTRY et; - WIN_BOOL ret; + PE_MODREF *pem = HMODULE32toPE_MODREF(hmod); + int i; + PIMAGE_RESOURCE_DIRECTORY resdir; + PIMAGE_RESOURCE_DIRECTORY_ENTRY et; + WIN_BOOL ret; if (!pem || !pem->pe_resource) - return FALSE; + return FALSE; resdir = (PIMAGE_RESOURCE_DIRECTORY)pem->pe_resource; resdir = GetResDirEntryW(resdir,name,(DWORD)pem->pe_resource,FALSE); if (!resdir) - return FALSE; + return FALSE; resdir = GetResDirEntryW(resdir,type,(DWORD)pem->pe_resource,FALSE); if (!resdir) - return FALSE; + return FALSE; et =(PIMAGE_RESOURCE_DIRECTORY_ENTRY)((LPBYTE)resdir+sizeof(IMAGE_RESOURCE_DIRECTORY)); ret = FALSE; for (i=0;iNumberOfNamedEntries+resdir->NumberOfIdEntries;i++) { - ret = lpfun(hmod,name,type,et[i].u1.Id,lparam); - if (!ret) - break; + ret = lpfun(hmod,name,type,et[i].u1.Id,lparam); + if (!ret) + break; } return ret; }