From 81800b1f6dab6566ece64ccdde38d729156758a6 Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Thu, 19 Oct 2000 20:29:53 +0000 Subject: [PATCH] Use a binary search to find entries in resource directories. Fixed GetResDirEntryA/W prototypes. --- dlls/shell32/shell.c | 24 ++-- dlls/user/exticon.c | 53 ++++--- dlls/version/resource.c | 9 +- include/module.h | 6 +- loader/pe_resource.c | 308 +++++++++++++++++++++++----------------- 5 files changed, 226 insertions(+), 174 deletions(-) diff --git a/dlls/shell32/shell.c b/dlls/shell32/shell.c index 526ba8aa98a..71dd5527313 100644 --- a/dlls/shell32/shell.c +++ b/dlls/shell32/shell.c @@ -791,10 +791,10 @@ HGLOBAL16 WINAPI InternalExtractIcon16(HINSTANCE16 hInstance, PIMAGE_DOS_HEADER dheader; PIMAGE_NT_HEADERS pe_header; PIMAGE_SECTION_HEADER pe_sections; - PIMAGE_RESOURCE_DIRECTORY rootresdir,iconresdir,icongroupresdir; - PIMAGE_RESOURCE_DATA_ENTRY idataent,igdataent; + const IMAGE_RESOURCE_DIRECTORY *rootresdir,*iconresdir,*icongroupresdir; + const IMAGE_RESOURCE_DATA_ENTRY *idataent,*igdataent; int i,j; - PIMAGE_RESOURCE_DIRECTORY_ENTRY xresent; + const IMAGE_RESOURCE_DIRECTORY_ENTRY *xresent; CURSORICONDIR **cids; fmapping = CreateFileMappingA(hFile,NULL,PAGE_READONLY|SEC_COMMIT,0,0,NULL); @@ -836,7 +836,7 @@ HGLOBAL16 WINAPI InternalExtractIcon16(HINSTANCE16 hInstance, goto end_4; /* failure */ } - icongroupresdir = GetResDirEntryW(rootresdir,RT_GROUP_ICONW, (DWORD)rootresdir,FALSE); + icongroupresdir = GetResDirEntryW(rootresdir,RT_GROUP_ICONW, rootresdir,FALSE); if (!icongroupresdir) { WARN("No Icongroupresourcedirectory!\n"); @@ -870,14 +870,15 @@ HGLOBAL16 WINAPI InternalExtractIcon16(HINSTANCE16 hInstance, xresent = xresent+nIconIndex; for (i=0;iu2.s.OffsetToDirectory)); /* default language (0) */ - resdir = GetResDirEntryW(resdir,(LPWSTR)0,(DWORD)rootresdir,TRUE); + resdir = GetResDirEntryW(resdir,(LPWSTR)0,rootresdir,TRUE); igdataent = (PIMAGE_RESOURCE_DATA_ENTRY)resdir; /* lookup address in mapped image for virtual address */ @@ -901,7 +902,7 @@ HGLOBAL16 WINAPI InternalExtractIcon16(HINSTANCE16 hInstance, RetPtr[i] = LookupIconIdFromDirectoryEx(igdata,TRUE,GetSystemMetrics(SM_CXICON),GetSystemMetrics(SM_CYICON),0); } - iconresdir=GetResDirEntryW(rootresdir,RT_ICONW,(DWORD)rootresdir,FALSE); + iconresdir=GetResDirEntryW(rootresdir,RT_ICONW,rootresdir,FALSE); if (!iconresdir) { WARN("No Iconresourcedirectory!\n"); @@ -909,9 +910,10 @@ HGLOBAL16 WINAPI InternalExtractIcon16(HINSTANCE16 hInstance, } for (i=0;iNumberOfNamedEntries + icongroupresdir->NumberOfIdEntries; @@ -344,7 +346,7 @@ static HRESULT WINAPI ICO_ExtractIconExW( if( nIcons == 0 ) { hRet = iconDirCount; - goto end_3; /* success */ + goto end; /* success */ } if( nIconIndex < 0 ) @@ -367,7 +369,7 @@ static HRESULT WINAPI ICO_ExtractIconExW( if (nIconIndex < 0) { WARN("resource id %d not found\n", iId); - goto end_3; /* failure */ + goto end; /* failure */ } } else @@ -376,7 +378,7 @@ static HRESULT WINAPI ICO_ExtractIconExW( if (nIconIndex >= iconDirCount) { WARN("nIconIndex %d is larger than iconDirCount %d\n",nIconIndex,iconDirCount); - goto end_3; /* failure */ + goto end; /* failure */ } } @@ -389,13 +391,13 @@ static HRESULT WINAPI ICO_ExtractIconExW( for (i=0; i < nIcons; i++,xresent++) { - PIMAGE_RESOURCE_DIRECTORY resdir; + const IMAGE_RESOURCE_DIRECTORY *resdir; /* go down this resource entry, name */ resdir = (PIMAGE_RESOURCE_DIRECTORY)((DWORD)rootresdir+(xresent->u2.s.OffsetToDirectory)); /* default language (0) */ - resdir = GetResDirEntryW(resdir,(LPWSTR)0,(DWORD)rootresdir,TRUE); + resdir = GetResDirEntryW(resdir,(LPWSTR)0,rootresdir,TRUE); igdataent = (PIMAGE_RESOURCE_DATA_ENTRY)resdir; /* lookup address in mapped image for virtual address */ @@ -413,22 +415,22 @@ static HRESULT WINAPI ICO_ExtractIconExW( if (!igdata) { WARN("no matching real address for icongroup!\n"); - goto end_3; /* failure */ + goto end; /* failure */ } RetPtr[i] = (HICON)LookupIconIdFromDirectoryEx(igdata, TRUE, cxDesired, cyDesired, LR_DEFAULTCOLOR); } - if (!(iconresdir=GetResDirEntryW(rootresdir,RT_ICONW,(DWORD)rootresdir,FALSE))) + if (!(iconresdir=GetResDirEntryW(rootresdir,RT_ICONW,rootresdir,FALSE))) { WARN("No Iconresourcedirectory!\n"); - goto end_3; /* failure */ + goto end; /* failure */ } for (i=0; iSize,TRUE,0x00030000, cxDesired, cyDesired, LR_DEFAULTCOLOR); } hRet = S_OK; /* return first icon */ - goto end_3; /* sucess */ } /* if(sig == IMAGE_NT_SIGNATURE) */ -end_3: UnmapViewOfFile(peimage); /* success */ -end_2: CloseHandle(fmapping); -end_1: _lclose( hFile); +end: UnmapViewOfFile(peimage); /* success */ return hRet; } @@ -509,7 +508,7 @@ HRESULT WINAPI PrivateExtractIconsW ( HRESULT WINAPI PrivateExtractIconsA ( LPCSTR lpstrFile, - DWORD nIndex, + INT nIndex, DWORD sizeX, DWORD sizeY, HICON * phicon, @@ -520,7 +519,7 @@ HRESULT WINAPI PrivateExtractIconsA ( DWORD ret; LPWSTR lpwstrFile = HEAP_strdupAtoW(GetProcessHeap(), 0, lpstrFile); - FIXME_(icon)("%s 0x%08lx 0x%08lx 0x%08lx %p 0x%08lx 0x%08x 0x%08lx stub\n", + FIXME_(icon)("%s 0x%08x 0x%08lx 0x%08lx %p 0x%08lx 0x%08x 0x%08lx stub\n", lpstrFile, nIndex, sizeX, sizeY, phicon, w, nIcons, y ); ret = PrivateExtractIconsW(lpwstrFile, nIndex, sizeX, sizeY, phicon, w, nIcons, y); diff --git a/dlls/version/resource.c b/dlls/version/resource.c index 672222ca561..385d7ec2841 100644 --- a/dlls/version/resource.c +++ b/dlls/version/resource.c @@ -122,9 +122,9 @@ static BOOL find_pe_resource( HFILE lzfd, LPCSTR typeid, LPCSTR resid, PIMAGE_SECTION_HEADER sections; LPBYTE resSection; DWORD resSectionSize; - DWORD resDir; - PIMAGE_RESOURCE_DIRECTORY resPtr; - PIMAGE_RESOURCE_DATA_ENTRY resData; + const void *resDir; + const IMAGE_RESOURCE_DIRECTORY *resPtr; + const IMAGE_RESOURCE_DATA_ENTRY *resData; int i, nSections; @@ -189,8 +189,7 @@ static BOOL find_pe_resource( HFILE lzfd, LPCSTR typeid, LPCSTR resid, } /* Find resource */ - resDir = (DWORD)resSection + - (resDataDir->VirtualAddress - sections[i].VirtualAddress); + resDir = resSection + (resDataDir->VirtualAddress - sections[i].VirtualAddress); resPtr = (PIMAGE_RESOURCE_DIRECTORY)resDir; resPtr = GetResDirEntryA( resPtr, typeid, resDir, FALSE ); diff --git a/include/module.h b/include/module.h index c83846ac13b..398e1c38b9d 100644 --- a/include/module.h +++ b/include/module.h @@ -223,8 +223,10 @@ extern HRSRC PE_FindResourceW(HMODULE,LPCWSTR,LPCWSTR); extern HRSRC PE_FindResourceExW(HMODULE,LPCWSTR,LPCWSTR,WORD); extern DWORD PE_SizeofResource(HRSRC); extern HGLOBAL PE_LoadResource(HMODULE,HRSRC); -extern PIMAGE_RESOURCE_DIRECTORY GetResDirEntryA(PIMAGE_RESOURCE_DIRECTORY,LPCSTR,DWORD,BOOL); -extern PIMAGE_RESOURCE_DIRECTORY GetResDirEntryW(PIMAGE_RESOURCE_DIRECTORY,LPCWSTR,DWORD,BOOL); +extern const IMAGE_RESOURCE_DIRECTORY *GetResDirEntryA(const IMAGE_RESOURCE_DIRECTORY*, + LPCSTR,LPCVOID,BOOL); +extern const IMAGE_RESOURCE_DIRECTORY *GetResDirEntryW(const IMAGE_RESOURCE_DIRECTORY*, + LPCWSTR,LPCVOID,BOOL); /* loader/pe_image.c */ extern WINE_MODREF *PE_LoadLibraryExA(LPCSTR, DWORD); diff --git a/loader/pe_resource.c b/loader/pe_resource.c index 95af38d9b9b..f2aeac24d96 100644 --- a/loader/pe_resource.c +++ b/loader/pe_resource.c @@ -33,10 +33,10 @@ DEFAULT_DEBUG_CHANNEL(resource); * * Get the resource directory of a PE module */ -static IMAGE_RESOURCE_DIRECTORY* get_resdir( HMODULE hmod ) +static const IMAGE_RESOURCE_DIRECTORY* get_resdir( HMODULE hmod ) { - IMAGE_DATA_DIRECTORY *dir; - IMAGE_RESOURCE_DIRECTORY *ret = NULL; + const IMAGE_DATA_DIRECTORY *dir; + const IMAGE_RESOURCE_DIRECTORY *ret = NULL; if (!hmod) hmod = GetModuleHandleA( NULL ); else if (!HIWORD(hmod)) @@ -52,69 +52,141 @@ static IMAGE_RESOURCE_DIRECTORY* get_resdir( HMODULE hmod ) } +/********************************************************************** + * find_entry_by_name + * + * Find an entry by name in a resource directory + */ +static IMAGE_RESOURCE_DIRECTORY *find_entry_by_name( const IMAGE_RESOURCE_DIRECTORY *dir, + LPCWSTR name, const char *root ) +{ + + const IMAGE_RESOURCE_DIRECTORY_ENTRY *entry; + const IMAGE_RESOURCE_DIR_STRING_U *str; + int min, max, res, pos, namelen = strlenW(name); + + entry = (const IMAGE_RESOURCE_DIRECTORY_ENTRY *)(dir + 1); + min = 0; + max = dir->NumberOfNamedEntries - 1; + while (min <= max) + { + pos = (min + max) / 2; + str = (IMAGE_RESOURCE_DIR_STRING_U *)(root + entry[pos].u1.s.NameOffset); + res = strncmpiW( name, str->NameString, str->Length ); + if (!res && namelen == str->Length) + return (IMAGE_RESOURCE_DIRECTORY *)(root + entry[pos].u2.s.OffsetToDirectory); + if (res < 0) max = pos - 1; + else min = pos + 1; + } + + /* now do a linear search just in case */ + for (pos = 0; pos < dir->NumberOfNamedEntries; pos++) + { + str = (IMAGE_RESOURCE_DIR_STRING_U *)(root + entry[pos].u1.s.NameOffset); + if (namelen != str->Length) continue; + if (!strncmpiW( name, str->NameString, str->Length )) + { + ERR( "entry '%s' required linear search, please report\n", debugstr_w(name) ); + return (IMAGE_RESOURCE_DIRECTORY *)(root + entry[pos].u2.s.OffsetToDirectory); + } + } + return NULL; +} + + +/********************************************************************** + * find_entry_by_id + * + * Find an entry by id in a resource directory + */ +static IMAGE_RESOURCE_DIRECTORY *find_entry_by_id( const IMAGE_RESOURCE_DIRECTORY *dir, + WORD id, const char *root ) +{ + const IMAGE_RESOURCE_DIRECTORY_ENTRY *entry; + int min, max, pos; + + entry = (const IMAGE_RESOURCE_DIRECTORY_ENTRY *)(dir + 1); + min = dir->NumberOfNamedEntries; + max = min + dir->NumberOfIdEntries - 1; + while (min <= max) + { + pos = (min + max) / 2; + if (entry[pos].u1.Id == id) + return (IMAGE_RESOURCE_DIRECTORY *)(root + entry[pos].u2.s.OffsetToDirectory); + if (entry[pos].u1.Id > id) max = pos - 1; + else min = pos + 1; + } + + /* now do a linear search just in case */ + min = dir->NumberOfNamedEntries; + max = min + dir->NumberOfIdEntries - 1; + for (pos = min; pos <= max; pos++) + { + if (entry[pos].u1.Id == id) + { + ERR( "entry %04x required linear search, please report\n", id ); + return (IMAGE_RESOURCE_DIRECTORY *)(root + entry[pos].u2.s.OffsetToDirectory); + } + } + return NULL; +} + + +/********************************************************************** + * find_entry_default + * + * Find a default entry in a resource directory + */ +static IMAGE_RESOURCE_DIRECTORY *find_entry_default( const IMAGE_RESOURCE_DIRECTORY *dir, + const char *root ) +{ + const IMAGE_RESOURCE_DIRECTORY_ENTRY *entry; + + entry = (const IMAGE_RESOURCE_DIRECTORY_ENTRY *)(dir + 1); + if (dir->NumberOfNamedEntries || dir->NumberOfIdEntries) + return (IMAGE_RESOURCE_DIRECTORY *)(root + entry->u2.s.OffsetToDirectory); + return NULL; +} + + /********************************************************************** * GetResDirEntryW * * Helper function - goes down one level of PE resource tree * */ -PIMAGE_RESOURCE_DIRECTORY GetResDirEntryW(PIMAGE_RESOURCE_DIRECTORY resdirptr, - LPCWSTR name,DWORD root, - BOOL allowdefault) +const IMAGE_RESOURCE_DIRECTORY *GetResDirEntryW(const IMAGE_RESOURCE_DIRECTORY *resdirptr, + LPCWSTR name, LPCVOID root, + BOOL allowdefault) { - int entrynum; - PIMAGE_RESOURCE_DIRECTORY_ENTRY entryTable; - int namelen; - - if (HIWORD(name)) { - if (name[0]=='#') { - char buf[10]; - if (!WideCharToMultiByte( CP_ACP, 0, name+1, -1, buf, sizeof(buf), NULL, NULL )) - return NULL; - return GetResDirEntryW(resdirptr,(LPCWSTR)atoi(buf),root,allowdefault); - } - entryTable = (PIMAGE_RESOURCE_DIRECTORY_ENTRY)(resdirptr + 1); - namelen = strlenW(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(strncmpiW(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 + - 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; + if (HIWORD(name)) + { + if (name[0]=='#') + { + char buf[10]; + if (!WideCharToMultiByte( CP_ACP, 0, name+1, -1, buf, sizeof(buf), NULL, NULL )) + return NULL; + return find_entry_by_id( resdirptr, atoi(buf), root ); + } + return find_entry_by_name( resdirptr, name, root ); + } + else + { + const IMAGE_RESOURCE_DIRECTORY *ret; + ret = find_entry_by_id( resdirptr, LOWORD(name), root ); + if (!ret && !name && allowdefault) ret = find_entry_default( resdirptr, root ); + return ret; } } /********************************************************************** * GetResDirEntryA */ -PIMAGE_RESOURCE_DIRECTORY GetResDirEntryA( PIMAGE_RESOURCE_DIRECTORY resdirptr, - LPCSTR name, DWORD root, - BOOL allowdefault ) +const IMAGE_RESOURCE_DIRECTORY *GetResDirEntryA( const IMAGE_RESOURCE_DIRECTORY *resdirptr, + LPCSTR name, LPCVOID root, + BOOL allowdefault ) { - PIMAGE_RESOURCE_DIRECTORY retv; + const IMAGE_RESOURCE_DIRECTORY *retv; LPWSTR nameW = HIWORD(name)? HEAP_strdupAtoW( GetProcessHeap(), 0, name ) : (LPWSTR)name; @@ -136,42 +208,34 @@ PIMAGE_RESOURCE_DIRECTORY GetResDirEntryA( PIMAGE_RESOURCE_DIRECTORY resdirptr, */ HRSRC PE_FindResourceExW( HMODULE hmod, LPCWSTR name, LPCWSTR type, WORD lang ) { - PIMAGE_RESOURCE_DIRECTORY resdirptr = get_resdir(hmod); - DWORD root; + const IMAGE_RESOURCE_DIRECTORY *resdirptr = get_resdir(hmod); + const void *root; HRSRC result; if (!resdirptr) return 0; - root = (DWORD) resdirptr; + root = resdirptr; if ((resdirptr = GetResDirEntryW(resdirptr, type, root, FALSE)) == NULL) return 0; if ((resdirptr = GetResDirEntryW(resdirptr, name, root, FALSE)) == NULL) return 0; /* 1. Exact specified language */ - result = (HANDLE)GetResDirEntryW(resdirptr, (LPCWSTR)(UINT)lang, root, FALSE); + if ((result = (HRSRC)find_entry_by_id( resdirptr, lang, root ))) goto found; - if (!result) - { - /* 2. Language with neutral sublanguage */ - lang = MAKELANGID(PRIMARYLANGID(lang), SUBLANG_NEUTRAL); - result = (HANDLE)GetResDirEntryW(resdirptr, (LPCWSTR)(UINT)lang, root, FALSE); - } + /* 2. Language with neutral sublanguage */ + lang = MAKELANGID(PRIMARYLANGID(lang), SUBLANG_NEUTRAL); + if ((result = (HRSRC)find_entry_by_id( resdirptr, lang, root ))) goto found; - if (!result) - { - /* 3. Neutral language with neutral sublanguage */ - lang = MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL); - result = (HANDLE)GetResDirEntryW(resdirptr, (LPCWSTR)(UINT)lang, root, FALSE); - } + /* 3. Neutral language with neutral sublanguage */ + lang = MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL); + if ((result = (HRSRC)find_entry_by_id( resdirptr, lang, root ))) goto found; - if (!result) - { - /* 4. Neutral language with default sublanguage */ - lang = MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT); - result = (HANDLE)GetResDirEntryW(resdirptr, (LPCWSTR)(UINT)lang, root, FALSE); - } + /* 4. Neutral language with default sublanguage */ + lang = MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT); + result = (HRSRC)find_entry_by_id( resdirptr, lang, root ); + found: return result; } @@ -189,14 +253,14 @@ HRSRC PE_FindResourceExW( HMODULE hmod, LPCWSTR name, LPCWSTR type, WORD lang ) */ HRSRC PE_FindResourceW( HMODULE hmod, LPCWSTR name, LPCWSTR type ) { - PIMAGE_RESOURCE_DIRECTORY resdirptr = get_resdir(hmod); - DWORD root; + const IMAGE_RESOURCE_DIRECTORY *resdirptr = get_resdir(hmod); + const void *root; HRSRC result; WORD lang; if (!resdirptr) return 0; - root = (DWORD) resdirptr; + root = resdirptr; if ((resdirptr = GetResDirEntryW(resdirptr, type, root, FALSE)) == NULL) return 0; if ((resdirptr = GetResDirEntryW(resdirptr, name, root, FALSE)) == NULL) @@ -204,42 +268,28 @@ HRSRC PE_FindResourceW( HMODULE hmod, LPCWSTR name, LPCWSTR type ) /* 1. Neutral language with neutral sublanguage */ lang = MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL); - result = (HANDLE)GetResDirEntryW(resdirptr, (LPCWSTR)(UINT)lang, root, FALSE); + if ((result = (HRSRC)find_entry_by_id( resdirptr, lang, root ))) goto found; - if (!result) - { - /* 2. Neutral language with default sublanguage */ - lang = MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT); - result = (HANDLE)GetResDirEntryW(resdirptr, (LPCWSTR)(UINT)lang, root, FALSE); - } + /* 2. Neutral language with default sublanguage */ + lang = MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT); + if ((result = (HRSRC)find_entry_by_id( resdirptr, lang, root ))) goto found; - if (!result) - { - /* 3. Current locale lang id */ - lang = LANGIDFROMLCID(GetUserDefaultLCID()); - result = (HANDLE)GetResDirEntryW(resdirptr, (LPCWSTR)(UINT)lang, root, FALSE); - } + /* 3. Current locale lang id */ + lang = LANGIDFROMLCID(GetUserDefaultLCID()); + if ((result = (HRSRC)find_entry_by_id( resdirptr, lang, root ))) goto found; - if (!result) - { - /* 4. Current locale lang id with neutral sublanguage */ - lang = MAKELANGID(PRIMARYLANGID(lang), SUBLANG_NEUTRAL); - result = (HANDLE)GetResDirEntryW(resdirptr, (LPCWSTR)(UINT)lang, root, FALSE); - } + /* 4. Current locale lang id with neutral sublanguage */ + lang = MAKELANGID(PRIMARYLANGID(lang), SUBLANG_NEUTRAL); + if ((result = (HRSRC)find_entry_by_id( resdirptr, lang, root ))) goto found; - if (!result) - { - /* 5. (!) LANG_ENGLISH, SUBLANG_DEFAULT */ - lang = MAKELANGID(LANG_ENGLISH, SUBLANG_DEFAULT); - result = (HANDLE)GetResDirEntryW(resdirptr, (LPCWSTR)(UINT)lang, root, FALSE); - } + /* 5. (!) LANG_ENGLISH, SUBLANG_DEFAULT */ + lang = MAKELANGID(LANG_ENGLISH, SUBLANG_DEFAULT); + if ((result = (HRSRC)find_entry_by_id( resdirptr, lang, root ))) goto found; - if (!result) - { - /* 6. Return first in the list */ - result = (HANDLE)GetResDirEntryW(resdirptr, (LPCWSTR)(UINT)0, root, TRUE); - } + /* 6. Return first in the list */ + result = (HRSRC)find_entry_default( resdirptr, root ); + found: return result; } @@ -270,8 +320,8 @@ DWORD PE_SizeofResource( HANDLE hRsrc ) BOOL WINAPI EnumResourceTypesA( HMODULE hmod, ENUMRESTYPEPROCA lpfun, LONG lparam) { int i; - PIMAGE_RESOURCE_DIRECTORY resdir = get_resdir(hmod); - PIMAGE_RESOURCE_DIRECTORY_ENTRY et; + const IMAGE_RESOURCE_DIRECTORY *resdir = get_resdir(hmod); + const IMAGE_RESOURCE_DIRECTORY_ENTRY *et; BOOL ret; if (!resdir) return FALSE; @@ -312,8 +362,8 @@ BOOL WINAPI EnumResourceTypesA( HMODULE hmod, ENUMRESTYPEPROCA lpfun, LONG lpara BOOL WINAPI EnumResourceTypesW( HMODULE hmod, ENUMRESTYPEPROCW lpfun, LONG lparam) { int i; - PIMAGE_RESOURCE_DIRECTORY resdir = get_resdir(hmod); - PIMAGE_RESOURCE_DIRECTORY_ENTRY et; + const IMAGE_RESOURCE_DIRECTORY *resdir = get_resdir(hmod); + const IMAGE_RESOURCE_DIRECTORY_ENTRY *et; BOOL ret; if (!resdir) return FALSE; @@ -351,14 +401,14 @@ BOOL WINAPI EnumResourceTypesW( HMODULE hmod, ENUMRESTYPEPROCW lpfun, LONG lpara BOOL WINAPI EnumResourceNamesA( HMODULE hmod, LPCSTR type, ENUMRESNAMEPROCA lpfun, LONG lparam ) { int i; - PIMAGE_RESOURCE_DIRECTORY basedir = get_resdir(hmod); - PIMAGE_RESOURCE_DIRECTORY resdir; - PIMAGE_RESOURCE_DIRECTORY_ENTRY et; + const IMAGE_RESOURCE_DIRECTORY *basedir = get_resdir(hmod); + const IMAGE_RESOURCE_DIRECTORY *resdir; + const IMAGE_RESOURCE_DIRECTORY_ENTRY *et; BOOL ret; if (!basedir) return FALSE; - if (!(resdir = GetResDirEntryA(basedir,type,(DWORD)basedir,FALSE))) return FALSE; + if (!(resdir = GetResDirEntryA(basedir,type,basedir,FALSE))) return FALSE; et =(PIMAGE_RESOURCE_DIRECTORY_ENTRY)(resdir + 1); ret = FALSE; @@ -396,14 +446,14 @@ BOOL WINAPI EnumResourceNamesA( HMODULE hmod, LPCSTR type, ENUMRESNAMEPROCA lpfu BOOL WINAPI EnumResourceNamesW( HMODULE hmod, LPCWSTR type, ENUMRESNAMEPROCW lpfun, LONG lparam ) { int i; - PIMAGE_RESOURCE_DIRECTORY basedir = get_resdir(hmod); - PIMAGE_RESOURCE_DIRECTORY resdir; - PIMAGE_RESOURCE_DIRECTORY_ENTRY et; + const IMAGE_RESOURCE_DIRECTORY *basedir = get_resdir(hmod); + const IMAGE_RESOURCE_DIRECTORY *resdir; + const IMAGE_RESOURCE_DIRECTORY_ENTRY *et; BOOL ret; if (!basedir) return FALSE; - resdir = GetResDirEntryW(basedir,type,(DWORD)basedir,FALSE); + resdir = GetResDirEntryW(basedir,type,basedir,FALSE); if (!resdir) return FALSE; et = (PIMAGE_RESOURCE_DIRECTORY_ENTRY)(resdir + 1); @@ -440,14 +490,14 @@ BOOL WINAPI EnumResourceLanguagesA( HMODULE hmod, LPCSTR type, LPCSTR name, ENUMRESLANGPROCA lpfun, LONG lparam ) { int i; - PIMAGE_RESOURCE_DIRECTORY basedir = get_resdir(hmod); - PIMAGE_RESOURCE_DIRECTORY resdir; - PIMAGE_RESOURCE_DIRECTORY_ENTRY et; + const IMAGE_RESOURCE_DIRECTORY *basedir = get_resdir(hmod); + const IMAGE_RESOURCE_DIRECTORY *resdir; + const IMAGE_RESOURCE_DIRECTORY_ENTRY *et; BOOL ret; if (!basedir) return FALSE; - if (!(resdir = GetResDirEntryA(basedir,type,(DWORD)basedir,FALSE))) return FALSE; - if (!(resdir = GetResDirEntryA(resdir,name,(DWORD)basedir,FALSE))) return FALSE; + if (!(resdir = GetResDirEntryA(basedir,type,basedir,FALSE))) return FALSE; + if (!(resdir = GetResDirEntryA(resdir,name,basedir,FALSE))) return FALSE; et =(PIMAGE_RESOURCE_DIRECTORY_ENTRY)(resdir + 1); ret = FALSE; @@ -468,17 +518,17 @@ BOOL WINAPI EnumResourceLanguagesW( HMODULE hmod, LPCWSTR type, LPCWSTR name, ENUMRESLANGPROCW lpfun, LONG lparam ) { int i; - PIMAGE_RESOURCE_DIRECTORY basedir = get_resdir(hmod); - PIMAGE_RESOURCE_DIRECTORY resdir; - PIMAGE_RESOURCE_DIRECTORY_ENTRY et; + const IMAGE_RESOURCE_DIRECTORY *basedir = get_resdir(hmod); + const IMAGE_RESOURCE_DIRECTORY *resdir; + const IMAGE_RESOURCE_DIRECTORY_ENTRY *et; BOOL ret; if (!basedir) return FALSE; - resdir = GetResDirEntryW(basedir,type,(DWORD)basedir,FALSE); + resdir = GetResDirEntryW(basedir,type,basedir,FALSE); if (!resdir) return FALSE; - resdir = GetResDirEntryW(resdir,name,(DWORD)basedir,FALSE); + resdir = GetResDirEntryW(resdir,name,basedir,FALSE); if (!resdir) return FALSE; et =(PIMAGE_RESOURCE_DIRECTORY_ENTRY)(resdir + 1);