- Timestamp:
- Jun 28, 2000, 8:08:36 PM (25 years ago)
- Location:
- trunk/src/kernel32
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kernel32/hmdevice.h
r3642 r3765 1 /* $Id: hmdevice.h,v 1. 19 2000-06-01 11:28:46sandervl Exp $ */1 /* $Id: hmdevice.h,v 1.20 2000-06-28 18:08:34 sandervl Exp $ */ 2 2 3 3 /* … … 176 176 177 177 /* this is a handler method for calls to LockFile() */ 178 virtual DWORDLockFile(PHMHANDLEDATA pHMHandleData,178 virtual BOOL LockFile(PHMHANDLEDATA pHMHandleData, 179 179 DWORD arg2, 180 180 DWORD arg3, … … 183 183 184 184 /* this is a handler method for calls to LockFileEx() */ 185 virtual DWORDLockFileEx(PHMHANDLEDATA pHMHandleData,185 virtual BOOL LockFileEx(PHMHANDLEDATA pHMHandleData, 186 186 DWORD dwFlags, 187 187 DWORD dwReserved, … … 191 191 192 192 /* this is a handler method for calls to UnlockFile() */ 193 virtual DWORDUnlockFile(PHMHANDLEDATA pHMHandleData,193 virtual BOOL UnlockFile(PHMHANDLEDATA pHMHandleData, 194 194 DWORD arg2, 195 195 DWORD arg3, … … 198 198 199 199 /* this is a handler method for calls to UnlockFileEx() */ 200 virtual DWORDUnlockFileEx(PHMHANDLEDATA pHMHandleData,200 virtual BOOL UnlockFileEx(PHMHANDLEDATA pHMHandleData, 201 201 DWORD dwReserved, 202 202 DWORD nNumberOfBytesToLockLow, -
trunk/src/kernel32/hmfile.cpp
r3751 r3765 1 /* $Id: hmfile.cpp,v 1. 6 2000-06-25 12:33:16sandervl Exp $ */1 /* $Id: hmfile.cpp,v 1.7 2000-06-28 18:08:34 sandervl Exp $ */ 2 2 3 3 /* … … 858 858 *****************************************************************************/ 859 859 860 DWORDHMDeviceFileClass::LockFile(PHMHANDLEDATA pHMHandleData,860 BOOL HMDeviceFileClass::LockFile(PHMHANDLEDATA pHMHandleData, 861 861 DWORD dwFileOffsetLow, 862 862 DWORD dwFileOffsetHigh, … … 898 898 *****************************************************************************/ 899 899 900 DWORDHMDeviceFileClass::LockFileEx(PHMHANDLEDATA pHMHandleData,900 BOOL HMDeviceFileClass::LockFileEx(PHMHANDLEDATA pHMHandleData, 901 901 DWORD dwFlags, 902 902 DWORD dwReserved, … … 942 942 *****************************************************************************/ 943 943 944 DWORDHMDeviceFileClass::UnlockFile(PHMHANDLEDATA pHMHandleData,944 BOOL HMDeviceFileClass::UnlockFile(PHMHANDLEDATA pHMHandleData, 945 945 DWORD dwFileOffsetLow, 946 946 DWORD dwFileOffsetHigh, … … 983 983 *****************************************************************************/ 984 984 985 DWORDHMDeviceFileClass::UnlockFileEx(PHMHANDLEDATA pHMHandleData,986 987 988 989 985 BOOL HMDeviceFileClass::UnlockFileEx(PHMHANDLEDATA pHMHandleData, 986 DWORD dwReserved, 987 DWORD nNumberOfBytesToLockLow, 988 DWORD nNumberOfBytesToLockHigh, 989 LPOVERLAPPED lpOverlapped) 990 990 { 991 991 -
trunk/src/kernel32/hmfile.h
r3642 r3765 1 /* $Id: hmfile.h,v 1. 1 2000-06-01 11:28:47sandervl Exp $ */1 /* $Id: hmfile.h,v 1.2 2000-06-28 18:08:34 sandervl Exp $ */ 2 2 3 3 /* … … 128 128 129 129 /* this is a handler method for calls to LockFile() */ 130 virtual DWORDLockFile(PHMHANDLEDATA pHMHandleData,130 virtual BOOL LockFile(PHMHANDLEDATA pHMHandleData, 131 131 DWORD arg2, 132 132 DWORD arg3, … … 135 135 136 136 /* this is a handler method for calls to LockFileEx() */ 137 virtual DWORDLockFileEx(PHMHANDLEDATA pHMHandleData,137 virtual BOOL LockFileEx(PHMHANDLEDATA pHMHandleData, 138 138 DWORD dwFlags, 139 139 DWORD dwReserved, … … 143 143 144 144 /* this is a handler method for calls to UnlockFile() */ 145 virtual DWORDUnlockFile(PHMHANDLEDATA pHMHandleData,145 virtual BOOL UnlockFile(PHMHANDLEDATA pHMHandleData, 146 146 DWORD arg2, 147 147 DWORD arg3, … … 150 150 151 151 /* this is a handler method for calls to UnlockFileEx() */ 152 virtual DWORDUnlockFileEx(PHMHANDLEDATA pHMHandleData,152 virtual BOOL UnlockFileEx(PHMHANDLEDATA pHMHandleData, 153 153 DWORD dwReserved, 154 154 DWORD nNumberOfBytesToLockLow, -
trunk/src/kernel32/winimagebase.cpp
r3678 r3765 1 /* $Id: winimagebase.cpp,v 1.2 2 2000-06-08 18:08:56sandervl Exp $ */1 /* $Id: winimagebase.cpp,v 1.23 2000-06-28 18:08:35 sandervl Exp $ */ 2 2 3 3 /* … … 47 47 errorState(NO_ERROR), entryPoint(0), fullpath(NULL), 48 48 tlsAddress(0), tlsIndexAddr(0), tlsInitSize(0), tlsTotalSize(0), 49 tlsCallBackAddr(0), tlsIndex(-1), pRes Dir(NULL),49 tlsCallBackAddr(0), tlsIndex(-1), pResRootDir(NULL), 50 50 ulRVAResourceSection(0) 51 51 { -
trunk/src/kernel32/winimagebase.h
r3720 r3765 1 /* $Id: winimagebase.h,v 1.1 2 2000-06-17 09:03:36sandervl Exp $ */1 /* $Id: winimagebase.h,v 1.13 2000-06-28 18:08:35 sandervl Exp $ */ 2 2 3 3 /* … … 22 22 #endif 23 23 24 #define LANG_GETFIRST 0x 8000000025 #define ID LANG_GETFIRST LANG_GETFIRST24 #define LANG_GETFIRST 0xF0000000 25 #define ID_GETFIRST 0xF0000000 26 26 27 27 #ifndef ENUMRESNAMEPROC … … 59 59 60 60 //Returns required OS version for this image 61 virtual ULONG 61 virtual ULONG getVersion(); 62 62 63 virtual void setFullPath(char *name);63 virtual void setFullPath(char *name); 64 64 char *getFullPath() { return fullpath; }; 65 65 … … 67 67 68 68 //findResource returns the pointer of the resource's IMAGE_RESOURCE_DATA_ENTRY structure 69 virtualHRSRC findResourceA(LPCSTR lpszName, LPSTR lpszType, ULONG lang = LANG_GETFIRST);70 69 HRSRC findResourceA(LPCSTR lpszName, LPSTR lpszType, ULONG lang = LANG_GETFIRST); 70 HRSRC findResourceW(LPWSTR lpszName, LPWSTR lpszType, ULONG lang = LANG_GETFIRST); 71 71 72 virtual ULONG getResourceSizeA(LPCSTR lpszName, LPSTR lpszType, ULONG lang = LANG_GETFIRST);73 ULONG getResourceSizeW(LP CWSTR lpszName, LPWSTR lpszType, ULONG lang = LANG_GETFIRST);74 virtualBOOL enumResourceNamesA(HMODULE hmod, LPCTSTR lpszType, ENUMRESNAMEPROCA lpEnumFunc, LONG lParam);75 virtualBOOL enumResourceNamesW(HMODULE hmod, LPCWSTR lpszType, ENUMRESNAMEPROCW lpEnumFunc, LONG lParam);76 virtualBOOL enumResourceTypesA(HMODULE hmod, ENUMRESTYPEPROCA lpEnumFunc,72 ULONG getResourceSizeA(LPSTR lpszName, LPSTR lpszType, ULONG lang = LANG_GETFIRST); 73 ULONG getResourceSizeW(LPWSTR lpszName, LPWSTR lpszType, ULONG lang = LANG_GETFIRST); 74 BOOL enumResourceNamesA(HMODULE hmod, LPCTSTR lpszType, ENUMRESNAMEPROCA lpEnumFunc, LONG lParam); 75 BOOL enumResourceNamesW(HMODULE hmod, LPCWSTR lpszType, ENUMRESNAMEPROCW lpEnumFunc, LONG lParam); 76 BOOL enumResourceTypesA(HMODULE hmod, ENUMRESTYPEPROCA lpEnumFunc, 77 77 LONG lParam); 78 virtualBOOL enumResourceTypesW(HMODULE hmod, ENUMRESTYPEPROCW lpEnumFunc,78 BOOL enumResourceTypesW(HMODULE hmod, ENUMRESTYPEPROCW lpEnumFunc, 79 79 LONG lParam); 80 80 81 virtualULONG getVersionSize();82 virtualBOOL getVersionStruct(char *verstruct, ULONG bufLength);81 ULONG getVersionSize(); 82 BOOL getVersionStruct(char *verstruct, ULONG bufLength); 83 83 84 84 //Returns pointer to data of resource handle … … 140 140 ULONG tlsIndex; //module TLS index 141 141 142 ULONG getPEResourceSize(ULONG id, ULONG type, ULONG lang = LANG_GETFIRST);143 144 PIMAGE_RESOURCE_DATA_ENTRY getPEResourceEntry(ULONG id, ULONG type, ULONG lang, int *error);145 PIMAGE_RESOURCE_DATA_ENTRY ProcessResSubDir(PIMAGE_RESOURCE_DIRECTORY prdType,146 ULONG *nodeData, int level, int *error);147 142 PIMAGE_RESOURCE_DIRECTORY getResSubDirW(PIMAGE_RESOURCE_DIRECTORY pResDir, LPCWSTR lpszName); 148 143 PIMAGE_RESOURCE_DIRECTORY getResSubDirA(PIMAGE_RESOURCE_DIRECTORY pResDir, LPCTSTR lpszName); 149 144 150 PIMAGE_RESOURCE_DIRECTORY pResDir; 145 PIMAGE_RESOURCE_DATA_ENTRY getResDataLang(PIMAGE_RESOURCE_DIRECTORY pResDir, ULONG language, BOOL fGetDefault = FALSE); 146 147 PIMAGE_RESOURCE_DIRECTORY pResRootDir; 151 148 152 149 //substracted from RVA data offsets -
trunk/src/kernel32/winimagelx.cpp
r3625 r3765 1 /* $Id: winimagelx.cpp,v 1. 7 2000-05-28 16:45:13sandervl Exp $ */1 /* $Id: winimagelx.cpp,v 1.8 2000-06-28 18:08:35 sandervl Exp $ */ 2 2 3 3 /* … … 56 56 57 57 //Pointer to PE resource tree generates by wrc (or NULL for system dlls) 58 pRes Dir = (PIMAGE_RESOURCE_DIRECTORY)pResData;58 pResRootDir = (PIMAGE_RESOURCE_DIRECTORY)pResData; 59 59 60 60 //ulRVAResourceSection contains the virtual address of the imagebase in the PE header -
trunk/src/kernel32/winimagepe2lx.cpp
r3433 r3765 1 /* $Id: winimagepe2lx.cpp,v 1.1 0 2000-04-19 22:16:49 birdExp $ */1 /* $Id: winimagepe2lx.cpp,v 1.11 2000-06-28 18:08:35 sandervl Exp $ */ 2 2 3 3 /* … … 174 174 * Read the PE section table the set the RVAs in paSections. 175 175 * Locate and set the entrypoint. 176 * Locate the resource directory (if any). (pRes Dir, ulRVAResourceSection)176 * Locate the resource directory (if any). (pResRootDir, ulRVAResourceSection) 177 177 * TLS - FIXME! 178 178 * @status completely implemented. … … 259 259 { 260 260 ulRVAResourceSection = pNtHdrs->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_RESOURCE].VirtualAddress; 261 pRes Dir = (PIMAGE_RESOURCE_DIRECTORY)getPointerFromRVA(ulRVAResourceSection);261 pResRootDir = (PIMAGE_RESOURCE_DIRECTORY)getPointerFromRVA(ulRVAResourceSection); 262 262 } 263 263 -
trunk/src/kernel32/winimagepeldr.cpp
r3757 r3765 1 /* $Id: winimagepeldr.cpp,v 1.4 8 2000-06-26 12:23:54sandervl Exp $ */1 /* $Id: winimagepeldr.cpp,v 1.49 2000-06-28 18:08:36 sandervl Exp $ */ 2 2 3 3 /* … … 501 501 SetPDBInstance(hinstance); 502 502 503 //PH: get pRes Dir pointer correct first, since processImports may503 //PH: get pResRootDir pointer correct first, since processImports may 504 504 // implicitly call functions depending on it. 505 505 if(GetSectionHdrByName (win32file, &sh, ".rsrc")) { 506 506 //get offset in resource object of directory entry 507 pRes Dir = (PIMAGE_RESOURCE_DIRECTORY)(sh.VirtualAddress + realBaseAddress);507 pResRootDir = (PIMAGE_RESOURCE_DIRECTORY)(sh.VirtualAddress + realBaseAddress); 508 508 ulRVAResourceSection = sh.VirtualAddress; 509 509 } -
trunk/src/kernel32/winimgres.cpp
r3753 r3765 1 /* $Id: winimgres.cpp,v 1.4 1 2000-06-26 07:35:56 sandervl Exp $ */1 /* $Id: winimgres.cpp,v 1.42 2000-06-28 18:08:36 sandervl Exp $ */ 2 2 3 3 /* 4 4 * Win32 PE Image class (resource methods) 5 5 * 6 * Copyright 1998 Sander van Leeuwen (sandervl@xs4all.nl)6 * Copyright 1998-2000 Sander van Leeuwen (sandervl@xs4all.nl) 7 7 * 8 8 * … … 10 10 * 11 11 * TODO: Check created resource objects before loading the resource! 12 * TODO: Once the resource handling in PE2LX/win32k is changed,13 * getVersionStruct/Size can be moved into the Win32ImageBase class14 12 * TODO: Support for 'DIB' resource type (VPBuddy) 15 13 * … … 32 30 33 31 #define MAX_RES 17 34 char *ResTypes[MAX_RES] = 35 {"niks", "CURSOR", "BITMAP", "ICON", "MENU", "DIALOG", "STRING", 36 "FONTDIR", "FONT", "ACCELERATOR", "RCDATA", "MESSAGETABLE", 37 "GROUP_CURSOR", "niks", "GROUP_ICON", "niks", "VERSION"}; 32 typedef struct { 33 char *typename; 34 int namelen; 35 } STD_RESTYPE; 36 37 STD_RESTYPE ResType[MAX_RES] = 38 { {NULL, 0}, 39 {"CURSOR", 6}, 40 {"BITMAP", 6}, 41 {"ICON", 4}, 42 {"MENU", 4}, 43 {"DIALOG", 6}, 44 {"STRING", 6}, 45 {"FONTDIR", 7}, 46 {"FONT", 4}, 47 {"ACCELERATOR", 11}, 48 {"RCDATA", 6}, 49 {"MESSAGETABLE",12}, 50 {"GROUP_CURSOR",12}, 51 {NULL, 0}, 52 {"GROUP_ICON", 10}, 53 {NULL, 0}, 54 {"VERSION", 7} 55 }; 38 56 39 57 //SvL: VPBuddy bugfix, seems to load bitmaps with type name 'DIB' 40 58 #define BITMAP_TYPENAME2 "DIB" 41 59 42 #define RESERR_SUCCESS 0 43 #define RESERR_IDNOTFOUND 1 44 #define RESERR_TYPENOTFOUND 2 45 #define RESERR_LANGNOTFOUND 3 46 47 //****************************************************************************** 48 //Assuming names are case insensitive 49 //PE spec says names & ids are sorted; keep on searching just to be sure 50 //****************************************************************************** 51 PIMAGE_RESOURCE_DATA_ENTRY 52 Win32ImageBase::getPEResourceEntry(ULONG id, ULONG type, ULONG lang, int *error) 53 { 54 PIMAGE_RESOURCE_DIRECTORY prdType; 55 PIMAGE_RESOURCE_DIRECTORY_ENTRY prde; 56 PIMAGE_RESOURCE_DIR_STRING_U pstring; 57 PIMAGE_RESOURCE_DATA_ENTRY pData = NULL; 58 ULONG nodeData[3], i, j, nameOffset; 59 BOOL fFound = FALSE, fNumType; 60 61 *error = RESERR_TYPENOTFOUND; 62 63 //PH: our system LX DLLs might not have a resource segment 64 if (pResDir == NULL) 65 return NULL; 66 67 if(HIWORD(type)) { 68 char *lpszName = (char *)type; 69 //"#102" really means numeric id 102 70 if(lpszName[0] == '#') { 71 type = atoi(&lpszName[1]); 72 } 73 } 74 75 if(HIWORD(id) && id != IDLANG_GETFIRST) { 76 char *lpszName = (char *)id; 77 //"#102" really means numeric id 102 78 if(lpszName[0] == '#') { 79 id = atoi(&lpszName[1]); 80 } 81 } 82 83 /* set pointer to first resource type entry */ 84 prde = (PIMAGE_RESOURCE_DIRECTORY_ENTRY)((ULONG)pResDir + sizeof(IMAGE_RESOURCE_DIRECTORY)); 85 86 /* loop through all resource directory entry types */ 87 //1st level -> types 88 //2nd level -> names 89 //3rd level -> language 90 nodeData[0] = id; 91 nodeData[1] = lang; 92 nodeData[2] = 0xFFFFFFFF; 93 94 fNumType = TRUE; //assume numeric 95 if(HIWORD(type) != 0) {//string id? 96 for(i=0;i<MAX_RES;i++) { 97 if(stricmp((char *)type, ResTypes[i]) == 0) 98 break; 99 } 100 //TODO: 101 #if 0 102 if(stricmp((char *)type, BITMAP_TYPENAME2) == 0) { 103 i = (int)RT_BITMAPA; 104 } 105 #endif 106 107 if(i == MAX_RES) {//custom resource type 108 fNumType = FALSE; 109 } 110 else type = i; 111 } 112 113 for (i=0; i<pResDir->NumberOfNamedEntries+pResDir->NumberOfIdEntries; i++) { 114 /* locate directory or each resource type */ 115 prdType = (PIMAGE_RESOURCE_DIRECTORY)((int)pResDir + (int)prde->u2.OffsetToData); 116 117 if(i < pResDir->NumberOfNamedEntries) 118 {//name or id entry? 119 //SvL: 30-10-'97, high bit is set, so clear to get real offset 120 nameOffset = prde->u1.Name & ~0x80000000; 121 122 pstring = (PIMAGE_RESOURCE_DIR_STRING_U)((ULONG)pResDir + nameOffset); 123 char *typename = (char *)malloc(pstring->Length+1); 124 lstrcpynWtoA(typename, pstring->NameString, pstring->Length+1); 125 typename[pstring->Length] = 0; 126 127 if(!fNumType) { 128 if(stricmp(typename, (char *)type) == 0) { 129 fFound = TRUE; 130 } 131 } 132 else { 133 for(j=0;j<MAX_RES;j++) { 134 if(stricmp(typename, ResTypes[j]) == 0) 135 break; 136 } 137 if(j == type) { 138 fFound = TRUE; 139 } 140 } 141 free(typename); 142 } 143 else { 144 if(prde->u1.Id == type) { 145 fFound = TRUE; 146 } 147 } 148 if(fFound) { 149 if((ULONG)prdType & 0x80000000) {//subdirectory? 150 pData = ProcessResSubDir(prdType, &nodeData[0], 2, error); 151 } 152 else { 153 pData = (PIMAGE_RESOURCE_DATA_ENTRY)prdType; 154 dprintf(("getResource: not a subdir!!\n")); 155 } 156 break; 157 } 158 /* increment to next entry */ 159 prde++; 160 } 161 if(pData) { 162 *error = RESERR_SUCCESS; //found it 163 } 164 return pData; 165 } 166 //****************************************************************************** 167 //level: 2 ids 168 // 3 languages 169 //****************************************************************************** 170 PIMAGE_RESOURCE_DATA_ENTRY 171 Win32ImageBase::ProcessResSubDir(PIMAGE_RESOURCE_DIRECTORY prdType, 172 ULONG *nodeData, int level, int *error) 173 { 174 PIMAGE_RESOURCE_DIRECTORY prdType2; 175 PIMAGE_RESOURCE_DIRECTORY_ENTRY prde; 176 PIMAGE_RESOURCE_DIR_STRING_U pstring; 177 PIMAGE_RESOURCE_DATA_ENTRY pData; 178 BOOL fFound = FALSE, fNumId; 179 ULONG nrres, nameOffset; 180 char *resname; 181 int i; 182 183 if(*nodeData == 0xFFFFFFFF) {//shouldn't happen! 184 dprintf(("ProcessResSubDir: *nodeData == 0xFFFFFFFF!\n")); 185 DebugInt3(); 186 return(NULL); 187 } 188 prdType = (PIMAGE_RESOURCE_DIRECTORY)((ULONG)prdType & ~0x80000000); 189 prde = (PIMAGE_RESOURCE_DIRECTORY_ENTRY)((DWORD)prdType + sizeof(IMAGE_RESOURCE_DIRECTORY)); 190 191 if(level == 2) { 192 *error = RESERR_IDNOTFOUND; 193 } 194 else { 195 *error = RESERR_LANGNOTFOUND; 196 } 197 //level 2 (id) -> get first id? 198 //level 3 (lang) -> get first language? 199 if(*nodeData == IDLANG_GETFIRST) { 200 nrres = prdType->NumberOfNamedEntries + prdType->NumberOfIdEntries; 201 fNumId = (prdType->NumberOfNamedEntries == 0); 202 } 203 else { 204 fNumId = HIWORD(*nodeData) == 0; 205 206 if(fNumId) {//numeric or string id? 207 nrres = prdType->NumberOfIdEntries; 208 prde += prdType->NumberOfNamedEntries; //skip name entries 209 } 210 else nrres = prdType->NumberOfNamedEntries; 211 } 212 213 for(i=0;i<nrres;i++) { 214 /* locate directory or each resource type */ 215 prdType2 = (PIMAGE_RESOURCE_DIRECTORY)((ULONG)pResDir + (ULONG)prde->u2.OffsetToData); 216 217 if(*nodeData == IDLANG_GETFIRST) { 218 fFound = TRUE; //always take the first one 219 } 220 else 221 if(!fNumId) {//name or id entry? 222 nameOffset = prde->u1.Name; 223 if(prde->u1.s.NameIsString) //unicode directory string /*PLF Sat 97-06-21 22:30:35*/ 224 nameOffset &= ~0x80000000; 225 226 pstring = (PIMAGE_RESOURCE_DIR_STRING_U)((ULONG)pResDir + nameOffset); 227 228 resname = (char *)malloc(pstring->Length+1); 229 lstrcpynWtoA(resname, pstring->NameString, pstring->Length+1); 230 resname[pstring->Length] = 0; 231 if(stricmp(resname, (char *)*nodeData) == 0) { 232 fFound = TRUE; 233 } 234 free(resname); 235 } 236 else { 237 if(*nodeData == prde->u1.Id) 238 fFound = TRUE; 239 } 240 241 if(fFound) { 242 if((ULONG)prdType2 & 0x80000000) {//subdirectory? 243 return ProcessResSubDir(prdType2, nodeData+1, 3, error); 244 } 245 else { 246 pData = (PIMAGE_RESOURCE_DATA_ENTRY)prdType2; 247 if(pData->Size) {//winamp17 winzip archive has resource with size 0 248 return(pData); 249 } 250 else return(NULL); 251 } 252 } 253 prde++; 254 } 255 return(NULL); 256 } 257 //****************************************************************************** 258 //****************************************************************************** 259 ULONG Win32ImageBase::getPEResourceSize(ULONG id, ULONG type, ULONG lang) 60 //****************************************************************************** 61 //****************************************************************************** 62 ULONG Win32ImageBase::getResourceSizeA(LPSTR lpszName, LPSTR lpszType, ULONG lang) 260 63 { 261 64 PIMAGE_RESOURCE_DATA_ENTRY pData = NULL; 262 int error; 263 264 switch(lang) { 265 case LOCALE_SYSTEM_DEFAULT: 266 lang = GetSystemDefaultLangID(); 267 break; 268 case LOCALE_USER_DEFAULT: 269 lang = GetUserDefaultLangID(); 270 break; 271 case LOCALE_NEUTRAL: 272 //TODO: Not correct; should take language associated with current thread 273 lang = IDLANG_GETFIRST; 274 break; 275 } 276 277 pData = getPEResourceEntry(id, type, lang, &error); 65 66 pData = (PIMAGE_RESOURCE_DATA_ENTRY)findResourceA(lpszName, lpszType, lang); 278 67 if(pData == NULL) { 279 dprintf(("Win32ImageBase::getPEResourceSize: couldn't find resource %d (type %d, lang %x)", id, type, lang)); 68 dprintf(("Win32ImageBase::getPEResourceSizeA: couldn't find resource %x (type %x, lang %x)", lpszName, lpszType, lang)); 69 return 0; 70 } 71 return pData->Size; 72 } 73 //****************************************************************************** 74 //****************************************************************************** 75 ULONG Win32ImageBase::getResourceSizeW(LPWSTR lpszName, LPWSTR lpszType, ULONG lang) 76 { 77 PIMAGE_RESOURCE_DATA_ENTRY pData = NULL; 78 79 pData = (PIMAGE_RESOURCE_DATA_ENTRY)findResourceW(lpszName, lpszType, lang); 80 if(pData == NULL) { 81 dprintf(("Win32ImageBase::getResourceSizeW: couldn't find resource %x (type %x, lang %x)", lpszName, lpszType, lang)); 280 82 return 0; 281 83 } … … 296 98 //for the resource section (images loaded by the pe.exe and pe2lx/win32k) 297 99 //For LX images, this is 0 as OffsetToData contains a relative offset 298 return (char *)((char *)pRes Dir + (pData->OffsetToData - ulRVAResourceSection));100 return (char *)((char *)pResRootDir + (pData->OffsetToData - ulRVAResourceSection)); 299 101 } 300 102 //****************************************************************************** … … 313 115 //findResource returns the pointer of the resource's IMAGE_RESOURCE_DATA_ENTRY structure 314 116 //****************************************************************************** 315 HRSRC Win32ImageBase::findResourceA(LPCSTR lpszName, LPSTR lpszType, ULONG langid) 316 { 317 PIMAGE_RESOURCE_DATA_ENTRY pData = NULL; 318 char *winres = NULL; 319 ULONG id, type, lang; 320 int i, j, error; 321 322 #ifdef DEBUG 323 if(HIWORD(lpszType) != 0) {//string id? 324 for(i=0;i<MAX_RES;i++) { 325 if(stricmp(lpszType, ResTypes[i]) == 0) 117 HRSRC Win32ImageBase::findResourceA(LPCSTR lpszName, LPSTR lpszType, ULONG lang) 118 { 119 PIMAGE_RESOURCE_DIRECTORY pResDirRet; 120 int typelen; 121 HRSRC hRes; 122 123 if(HIWORD(lpszType) != 0) 124 { 125 typelen = strlen(lpszType); 126 127 for(int i=0;i<MAX_RES;i++) { 128 if(ResType[i].namelen && 129 ResType[i].namelen == typelen && 130 stricmp(lpszType, ResType[i].typename) == 0) 326 131 break; 327 132 } 328 if(i == MAX_RES) {//custom resourcetype329 type = (ULONG)lpszType;133 if(i != MAX_RES) {//standard res type 134 lpszType = (LPSTR)i; 330 135 } 331 else type = i; 332 } 333 else type = (ULONG)lpszType; 334 #else 335 type = (ULONG)lpszType; 336 #endif 337 338 switch(langid) { 339 case LOCALE_SYSTEM_DEFAULT: 136 } 137 pResDirRet = getResSubDirA(pResRootDir, lpszType); 138 if(!pResDirRet) { 139 SetLastError(ERROR_RESOURCE_TYPE_NOT_FOUND); 140 return NULL; 141 } 142 pResDirRet = getResSubDirA(pResDirRet, lpszName); 143 if(!pResDirRet) { 144 SetLastError(ERROR_RESOURCE_NAME_NOT_FOUND); 145 return NULL; 146 } 147 148 switch(lang) { 149 case LANG_SYSTEM_DEFAULT: 340 150 lang = GetSystemDefaultLangID(); 341 break; 342 case L OCALE_USER_DEFAULT:151 break; 152 case LANG_USER_DEFAULT: 343 153 lang = GetUserDefaultLangID(); 344 154 break; 345 case L OCALE_NEUTRAL:155 case LANG_NEUTRAL: 346 156 //TODO: Not correct; should take language associated with current thread 347 lang = IDLANG_GETFIRST;157 lang = LANG_NEUTRAL; 348 158 break; 349 case IDLANG_GETFIRST:159 case LANG_GETFIRST: 350 160 lang = GetUserDefaultLangID(); 351 161 break; 352 162 } 353 id = (ULONG)lpszName; 354 pData = getPEResourceEntry(id, type, lang, &error); 355 if(pData == NULL) { 356 //TODO: Optimize this; check if language wasn't found 357 //try system default language 358 if(error == RESERR_LANGNOTFOUND) { 359 pData = getPEResourceEntry(id, type, GetSystemDefaultLangID(), &error); 163 164 hRes = (HRSRC)getResDataLang(pResDirRet, lang); 165 if(!hRes) { 166 //try primary language with default sublang 167 lang = MAKELANGID(PRIMARYLANGID(lang), SUBLANG_DEFAULT); 168 hRes = (HRSRC)getResDataLang(pResDirRet, lang); 169 if(!hRes) { 170 //try neutral language or get first entry if nothing found 171 hRes = (HRSRC)getResDataLang(pResDirRet, LANG_NEUTRAL, TRUE); 360 172 } 361 if(pData == NULL) { 362 //finally try first available language 363 if(error == RESERR_LANGNOTFOUND) { 364 pData = getPEResourceEntry(id, type, IDLANG_GETFIRST, &error); 365 } 366 if(pData == NULL) { 367 if(HIWORD(id)) { 368 dprintf(("Win32ImageBase::getPEResource %s: couldn't find resource %s (type %d, lang %x)", szModule, id, type, lang)); 369 } 370 else dprintf(("Win32ImageBase::getPEResource %s: couldn't find resource %d (type %d, lang %x)", szModule, id, type, lang)); 371 return 0; 372 } 173 } 174 175 if((ULONG)lpszName != ID_GETFIRST && HIWORD(lpszName)) { 176 dprintf(("FindResource %s: resource %s (type %x, lang %x)", szModule, lpszName, lpszType, lang)); 177 } 178 else dprintf(("FindResource %s: resource %x (type %x, lang %x)", szModule, lpszName, lpszType, lang)); 179 180 return hRes; 181 } 182 //****************************************************************************** 183 //****************************************************************************** 184 HRSRC Win32ImageBase::findResourceW(LPWSTR lpszName, LPWSTR lpszType, ULONG lang) 185 { 186 PIMAGE_RESOURCE_DIRECTORY pResDirRet; 187 char *astring1 = NULL; 188 int typelen; 189 HRSRC hRes; 190 191 if(HIWORD(lpszType) != 0 && lpszType[0] != (WCHAR)'#') 192 { 193 astring1 = UnicodeToAsciiString(lpszType); 194 typelen = strlen(astring1); 195 196 for(int i=0;i<MAX_RES;i++) { 197 if(ResType[i].namelen && 198 ResType[i].namelen == typelen && 199 stricmp(astring1, ResType[i].typename) == 0) 200 break; 201 } 202 if(i != MAX_RES) {//standard res type 203 lpszType = (LPWSTR)i; 204 } 205 FreeAsciiString(astring1); 206 } 207 pResDirRet = getResSubDirW(pResRootDir, lpszType); 208 if(!pResDirRet) { 209 SetLastError(ERROR_RESOURCE_TYPE_NOT_FOUND); 210 return NULL; 211 } 212 pResDirRet = getResSubDirW(pResDirRet, lpszName); 213 if(!pResDirRet) { 214 SetLastError(ERROR_RESOURCE_NAME_NOT_FOUND); 215 return NULL; 216 } 217 218 switch(lang) { 219 case LANG_SYSTEM_DEFAULT: 220 lang = GetSystemDefaultLangID(); 221 break; 222 case LANG_USER_DEFAULT: 223 lang = GetUserDefaultLangID(); 224 break; 225 case LANG_NEUTRAL: 226 //TODO: Not correct; should take language associated with current thread 227 lang = LANG_NEUTRAL; 228 break; 229 case LANG_GETFIRST: 230 lang = GetUserDefaultLangID(); 231 break; 232 } 233 234 hRes = (HRSRC)getResDataLang(pResDirRet, lang); 235 if(!hRes) { 236 //try primary language with default sublang 237 lang = MAKELANGID(PRIMARYLANGID(lang), SUBLANG_DEFAULT); 238 hRes = (HRSRC)getResDataLang(pResDirRet, lang); 239 if(!hRes) { 240 //try neutral language or get first entry if nothing found 241 hRes = (HRSRC)getResDataLang(pResDirRet, LANG_NEUTRAL, TRUE); 373 242 } 374 243 } 375 if(HIWORD(id)) { 376 dprintf(("FindResource %s: resource %s (type %d, lang %x)", szModule, id, type, lang)); 377 } 378 else dprintf(("FindResource %s: resource %d (type %d, lang %x)", szModule, id, type, lang)); 379 380 return (HRSRC) pData; 381 } 382 //****************************************************************************** 383 //****************************************************************************** 384 HRSRC Win32ImageBase::findResourceW(LPWSTR lpszName, LPWSTR lpszType, ULONG lang) 385 { 386 HRSRC hres; 387 char *astring1 = NULL, *astring2 = NULL; 388 389 if(HIWORD(lpszName) != 0) { 390 astring1 = UnicodeToAsciiString(lpszName); 391 } 392 else astring1 = (char *)lpszName; 393 394 if(HIWORD(lpszType) != 0) { 395 astring2 = UnicodeToAsciiString(lpszType); 396 } 397 else astring2 = (char *)lpszType; 398 399 hres = findResourceA(astring1, astring2, lang); 400 401 if(HIWORD(astring1)) FreeAsciiString(astring1); 402 if(HIWORD(astring2)) FreeAsciiString(astring2); 403 404 return(hres); 405 } 406 //****************************************************************************** 407 //****************************************************************************** 408 ULONG Win32ImageBase::getResourceSizeA(LPCSTR lpszName, LPSTR lpszType, ULONG lang) 409 { 410 return getPEResourceSize((ULONG)lpszName, (ULONG)lpszType, lang); 411 } 412 //****************************************************************************** 413 //****************************************************************************** 414 ULONG Win32ImageBase::getResourceSizeW(LPCWSTR lpszName, LPWSTR lpszType, ULONG lang) 415 { 416 char *astring1 = NULL, *astring2 = NULL; 417 ULONG ressize; 418 419 if(HIWORD(lpszName) != 0) { 420 astring1 = UnicodeToAsciiString((LPWSTR)lpszName); 421 } 422 else astring1 = (char *)lpszName; 423 424 if(HIWORD(lpszType) != 0) { 425 astring2 = UnicodeToAsciiString(lpszType); 426 } 427 else astring2 = (char *)lpszType; 428 429 ressize = getResourceSizeA(astring2, astring1, lang); 430 431 if(HIWORD(astring1)) FreeAsciiString(astring1); 432 if(HIWORD(astring2)) FreeAsciiString(astring2); 433 434 return(ressize); 244 245 return hRes; 435 246 } 436 247 //****************************************************************************** … … 438 249 ULONG Win32ImageBase::getVersionSize() 439 250 { 440 return getResourceSize A((LPCSTR)1, (LPSTR)NTRT_VERSION);251 return getResourceSizeW((LPWSTR)1, (LPWSTR)NTRT_VERSION); 441 252 } 442 253 //****************************************************************************** … … 444 255 BOOL Win32ImageBase::getVersionStruct(char *verstruct, ULONG bufLength) 445 256 { 446 PIMAGE_RESOURCE_DATA_ENTRY pData = NULL; 447 int error; 257 HRSRC hRes; 448 258 449 259 if(verstruct == NULL || bufLength == 0) { … … 451 261 return FALSE; 452 262 } 453 pData = getPEResourceEntry(IDLANG_GETFIRST, NTRT_VERSION, IDLANG_GETFIRST, &error); 454 if(pData == NULL) { 263 hRes = findResourceW((LPWSTR)ID_GETFIRST, (LPWSTR)NTRT_VERSION, LANG_GETFIRST); 264 if(hRes == NULL) { 265 //last error already set by findResourceW 455 266 dprintf(("Win32PeLdrImage::getVersionStruct: couldn't find version resource!")); 456 SetLastError(ERROR_RESOURCE_DATA_NOT_FOUND);457 267 return 0; 458 268 } 459 char *resdata = (char *)((char *)pResDir + pData->OffsetToData - ulRVAResourceSection); 460 memcpy(verstruct, resdata, min(bufLength, pData->Size)); 269 memcpy(verstruct, getResourceAddr(hRes), min(bufLength, getResourceSize(hRes))); 461 270 return TRUE; 462 271 } … … 505 314 PIMAGE_RESOURCE_DIRECTORY_ENTRY paResDirEntries; 506 315 507 if (pRes Dir == NULL)316 if (pResRootDir == NULL) 508 317 { 509 318 SetLastError(ERROR_RESOURCE_DATA_NOT_FOUND); … … 512 321 513 322 /* validate parameters - FIXME... Exception handler??? */ 514 if (( unsigned)lpszType >= 0xc0000000) //....323 if ((ULONG)lpszType >= 0xc0000000) //.... 515 324 { 516 325 SetLastError(ERROR_INVALID_PARAMETER); … … 518 327 } 519 328 520 if (( unsigned)lpEnumFunc < 0x10000 || (unsigned)lpEnumFunc >= 0xc0000000)329 if ((ULONG)lpEnumFunc < 0x10000 || (ULONG)lpEnumFunc >= 0xc0000000) 521 330 { 522 331 SetLastError(ERROR_NOACCESS); … … 529 338 //3rd level -> language 530 339 531 pResDirOurType = getResSubDirA(pRes Dir, lpszType);340 pResDirOurType = getResSubDirA(pResRootDir, lpszType); 532 341 if (pResDirOurType != NULL) 533 342 { … … 539 348 fRet = TRUE; 540 349 cResEntries = pResDirOurType->NumberOfNamedEntries + pResDirOurType->NumberOfIdEntries; 541 paResDirEntries = (PIMAGE_RESOURCE_DIRECTORY_ENTRY)(( unsigned)pResDirOurType + sizeof(*pResDirOurType));350 paResDirEntries = (PIMAGE_RESOURCE_DIRECTORY_ENTRY)((ULONG)pResDirOurType + sizeof(*pResDirOurType)); 542 351 for (i = 0; i < cResEntries && fRet; i++) 543 352 { … … 547 356 { 548 357 PIMAGE_RESOURCE_DIR_STRING_U pResDirString = 549 (PIMAGE_RESOURCE_DIR_STRING_U)(paResDirEntries[i].u1.s.NameOffset + ( unsigned)pResDir);358 (PIMAGE_RESOURCE_DIR_STRING_U)(paResDirEntries[i].u1.s.NameOffset + (ULONG)pResRootDir); 550 359 551 360 /* ASCII buffer allocation/adjustment? */ … … 626 435 PIMAGE_RESOURCE_DIRECTORY_ENTRY paResDirEntries; 627 436 628 if (pRes Dir == NULL)437 if (pResRootDir == NULL) 629 438 { 630 439 SetLastError(ERROR_RESOURCE_DATA_NOT_FOUND); … … 633 442 634 443 /* validate parameters - FIXME... Exception handler??? */ 635 if (( unsigned)lpszType >= 0xc0000000) //....444 if ((ULONG)lpszType >= 0xc0000000) //.... 636 445 { 637 446 SetLastError(ERROR_INVALID_PARAMETER); … … 639 448 } 640 449 641 if (( unsigned)lpEnumFunc < 0x10000 || (unsigned)lpEnumFunc >= 0xc0000000)450 if ((ULONG)lpEnumFunc < 0x10000 || (ULONG)lpEnumFunc >= 0xc0000000) 642 451 { 643 452 SetLastError(ERROR_NOACCESS); … … 651 460 //3rd level -> language 652 461 653 pResDirOurType = getResSubDirW(pRes Dir, lpszType);462 pResDirOurType = getResSubDirW(pResRootDir, lpszType); 654 463 if (pResDirOurType != NULL) 655 464 { … … 659 468 fRet = TRUE; 660 469 cResEntries = pResDirOurType->NumberOfNamedEntries + pResDirOurType->NumberOfIdEntries; 661 paResDirEntries = (PIMAGE_RESOURCE_DIRECTORY_ENTRY)(( unsigned)pResDirOurType + sizeof(*pResDirOurType));470 paResDirEntries = (PIMAGE_RESOURCE_DIRECTORY_ENTRY)((ULONG)pResDirOurType + sizeof(*pResDirOurType)); 662 471 for (i = 0; i < cResEntries && fRet; i++) 663 472 { … … 665 474 666 475 if (paResDirEntries[i].u1.s.NameIsString) 667 lpszName = (LPWSTR)(paResDirEntries[i].u1.s.NameOffset + ( unsigned)pResDir + 2);476 lpszName = (LPWSTR)(paResDirEntries[i].u1.s.NameOffset + (ULONG)pResRootDir + 2); 668 477 else 669 478 lpszName = (LPWSTR)paResDirEntries[i].u1.Id; … … 692 501 * @author knut st. osmundsen 693 502 */ 694 PIMAGE_RESOURCE_DIRECTORY Win32ImageBase::getResSubDirW(PIMAGE_RESOURCE_DIRECTORY pResDirToSearch, LPCWSTR lpszName) 503 PIMAGE_RESOURCE_DIRECTORY Win32ImageBase::getResSubDirW(PIMAGE_RESOURCE_DIRECTORY pResDirToSearch, 504 LPCWSTR lpszName) 695 505 { 696 506 PIMAGE_RESOURCE_DIRECTORY_ENTRY paResDirEntries; … … 699 509 700 510 /* lpszName */ 701 if ( HIWORD(lpszName) != 0)511 if ((ULONG)lpszName != ID_GETFIRST && HIWORD(lpszName) != 0) 702 512 { 703 513 if (lpszName[0] == '#') … … 711 521 idName = (int)lpszName; 712 522 713 paResDirEntries = (PIMAGE_RESOURCE_DIRECTORY_ENTRY)((unsigned)pResDirToSearch + sizeof(*pResDirToSearch)); 523 paResDirEntries = (PIMAGE_RESOURCE_DIRECTORY_ENTRY)((ULONG)pResDirToSearch + sizeof(*pResDirToSearch)); 524 if(idName == ID_GETFIRST) { 525 return paResDirEntries[0].u2.s.DataIsDirectory ? 526 (PIMAGE_RESOURCE_DIRECTORY) (paResDirEntries[0].u2.s.OffsetToDirectory + (ULONG)pResRootDir) 527 : NULL; 528 } 529 714 530 if (idName != -1) 715 531 { /* idName */ … … 719 535 if (paResDirEntries[i].u1.Id == (WORD)idName) 720 536 return paResDirEntries[i].u2.s.DataIsDirectory ? 721 (PIMAGE_RESOURCE_DIRECTORY) (paResDirEntries[i].u2.s.OffsetToDirectory + ( unsigned)pResDir /*?*/537 (PIMAGE_RESOURCE_DIRECTORY) (paResDirEntries[i].u2.s.OffsetToDirectory + (ULONG)pResRootDir /*?*/ 722 538 /*- ulRVAResourceSection*/) 723 539 : NULL; … … 730 546 { 731 547 PIMAGE_RESOURCE_DIR_STRING_U pResDirStr = 732 (PIMAGE_RESOURCE_DIR_STRING_U)(paResDirEntries[i].u1.s.NameOffset + (unsigned)pResDir /*?*/); 733 548 (PIMAGE_RESOURCE_DIR_STRING_U)(paResDirEntries[i].u1.s.NameOffset + (ULONG)pResRootDir /*?*/); 549 550 //SvL: Must do case insensitive string compare here 734 551 if (pResDirStr->Length == cusName 735 && UniStrncmp(pResDirStr->NameString, lpszName, cusName) == 0)552 && lstrncmpiW(pResDirStr->NameString, lpszName, cusName) == 0) 736 553 { 737 554 return paResDirEntries[i].u2.s.DataIsDirectory ? 738 (PIMAGE_RESOURCE_DIRECTORY) (paResDirEntries[i].u2.s.OffsetToDirectory + ( unsigned)pResDir555 (PIMAGE_RESOURCE_DIRECTORY) (paResDirEntries[i].u2.s.OffsetToDirectory + (ULONG)pResRootDir 739 556 /*- ulRVAResourceSection*/) 740 557 : NULL; … … 755 572 * @author knut st. osmundsen 756 573 */ 757 PIMAGE_RESOURCE_DIRECTORY Win32ImageBase::getResSubDirA(PIMAGE_RESOURCE_DIRECTORY pResDirToSearch, LPCTSTR lpszName) 574 PIMAGE_RESOURCE_DIRECTORY Win32ImageBase::getResSubDirA(PIMAGE_RESOURCE_DIRECTORY pResDirToSearch, 575 LPCTSTR lpszName) 758 576 { 759 577 PIMAGE_RESOURCE_DIRECTORY pResDirRet; … … 761 579 762 580 /* lpszName */ 763 if ( HIWORD(lpszName) != 0)581 if ((ULONG)lpszName != ID_GETFIRST && HIWORD(lpszName) != 0) 764 582 { 765 583 lpszwName = AsciiToUnicodeString((char*)lpszName); … … 772 590 pResDirRet = getResSubDirW(pResDirToSearch, lpszwName); 773 591 774 if ( HIWORD(lpszwName) != 0)592 if ((ULONG)lpszName != ID_GETFIRST && HIWORD(lpszwName) != 0) 775 593 free((void*)lpszwName); 776 594 777 595 return pResDirRet; 596 } 597 //****************************************************************************** 598 /** 599 * This function finds a resource data entry within a given resource directory. 600 * @returns Pointer to resource data entry. NULL if not found 601 * @param pResDirToSearch Pointer to resource directory to search. (lang level) 602 * @param language Resource language id 603 * @param fGetDefault TRUE -> get first available resource if not found 604 * @sketch 605 * @status completely implemented 606 * @author Sander van Leeuwen 607 */ 608 //****************************************************************************** 609 PIMAGE_RESOURCE_DATA_ENTRY 610 Win32ImageBase::getResDataLang(PIMAGE_RESOURCE_DIRECTORY pResDirToSearch, 611 ULONG language, BOOL fGetDefault) 612 { 613 PIMAGE_RESOURCE_DIRECTORY_ENTRY paResDirEntries; 614 int i; 615 616 paResDirEntries = (PIMAGE_RESOURCE_DIRECTORY_ENTRY)((ULONG)pResDirToSearch + sizeof(*pResDirToSearch)); 617 618 if(pResDirToSearch->NumberOfNamedEntries) { 619 DebugInt3(); 620 } 621 paResDirEntries += pResDirToSearch->NumberOfNamedEntries; 622 623 for (i = 0; i < pResDirToSearch->NumberOfIdEntries; i++) { 624 if (paResDirEntries[i].u1.Id == language) 625 { 626 return (PIMAGE_RESOURCE_DATA_ENTRY) (paResDirEntries[i].u2.s.OffsetToDirectory + (ULONG)pResRootDir); 627 } 628 } 629 630 // if nothing found and fGetDefault is true, return first entry 631 if(fGetDefault) 632 { 633 return (PIMAGE_RESOURCE_DATA_ENTRY) (paResDirEntries[0].u2.s.OffsetToDirectory + (ULONG)pResRootDir); 634 } 635 return NULL; 778 636 } 779 637 //****************************************************************************** … … 788 646 BOOL fRet; 789 647 790 if (pRes Dir == NULL)648 if (pResRootDir == NULL) 791 649 { 792 650 SetLastError(ERROR_RESOURCE_DATA_NOT_FOUND); … … 794 652 } 795 653 796 if (( unsigned)lpEnumFunc < 0x10000 || (unsigned)lpEnumFunc >= 0xc0000000)654 if ((ULONG)lpEnumFunc < 0x10000 || (ULONG)lpEnumFunc >= 0xc0000000) 797 655 { 798 656 SetLastError(ERROR_NOACCESS); … … 806 664 807 665 /* set pointer to first resource type entry */ 808 prde = (PIMAGE_RESOURCE_DIRECTORY_ENTRY)((ULONG)pRes Dir + sizeof(IMAGE_RESOURCE_DIRECTORY));809 810 for (i=0; i<pRes Dir->NumberOfNamedEntries+pResDir->NumberOfIdEntries && fRet; i++)666 prde = (PIMAGE_RESOURCE_DIRECTORY_ENTRY)((ULONG)pResRootDir + sizeof(IMAGE_RESOURCE_DIRECTORY)); 667 668 for (i=0; i<pResRootDir->NumberOfNamedEntries+pResRootDir->NumberOfIdEntries && fRet; i++) 811 669 { 812 670 /* locate directory or each resource type */ 813 prdType = (PIMAGE_RESOURCE_DIRECTORY)((int)pRes Dir + (int)prde->u2.OffsetToData);671 prdType = (PIMAGE_RESOURCE_DIRECTORY)((int)pResRootDir + (int)prde->u2.OffsetToData); 814 672 815 673 if (prde->u1.s.NameIsString) … … 818 676 nameOffset = prde->u1.Name & ~0x80000000; 819 677 820 pstring = (PIMAGE_RESOURCE_DIR_STRING_U)((ULONG)pRes Dir + nameOffset);678 pstring = (PIMAGE_RESOURCE_DIR_STRING_U)((ULONG)pResRootDir + nameOffset); 821 679 char *typename = (char *)malloc(pstring->Length+1); 822 680 lstrcpynWtoA(typename, pstring->NameString, pstring->Length+1); … … 846 704 BOOL fRet; 847 705 848 if (pRes Dir == NULL)706 if (pResRootDir == NULL) 849 707 { 850 708 SetLastError(ERROR_RESOURCE_DATA_NOT_FOUND); … … 852 710 } 853 711 854 if (( unsigned)lpEnumFunc < 0x10000 || (unsigned)lpEnumFunc >= 0xc0000000)712 if ((ULONG)lpEnumFunc < 0x10000 || (ULONG)lpEnumFunc >= 0xc0000000) 855 713 { 856 714 SetLastError(ERROR_NOACCESS); … … 864 722 865 723 /* set pointer to first resource type entry */ 866 prde = (PIMAGE_RESOURCE_DIRECTORY_ENTRY)((ULONG)pRes Dir + sizeof(IMAGE_RESOURCE_DIRECTORY));867 868 for (i=0; i<pRes Dir->NumberOfNamedEntries+pResDir->NumberOfIdEntries && fRet; i++)724 prde = (PIMAGE_RESOURCE_DIRECTORY_ENTRY)((ULONG)pResRootDir + sizeof(IMAGE_RESOURCE_DIRECTORY)); 725 726 for (i=0; i<pResRootDir->NumberOfNamedEntries+pResRootDir->NumberOfIdEntries && fRet; i++) 869 727 { 870 728 /* locate directory or each resource type */ 871 prdType = (PIMAGE_RESOURCE_DIRECTORY)((int)pRes Dir + (int)prde->u2.OffsetToData);729 prdType = (PIMAGE_RESOURCE_DIRECTORY)((int)pResRootDir + (int)prde->u2.OffsetToData); 872 730 873 731 if (prde->u1.s.NameIsString) … … 876 734 nameOffset = prde->u1.Name & ~0x80000000; 877 735 878 pstring = (PIMAGE_RESOURCE_DIR_STRING_U)((ULONG)pRes Dir + nameOffset);736 pstring = (PIMAGE_RESOURCE_DIR_STRING_U)((ULONG)pResRootDir + nameOffset); 879 737 fRet = lpEnumFunc(hmod, pstring->NameString, lParam); 880 738 }
Note:
See TracChangeset
for help on using the changeset viewer.