Changeset 3588 for trunk/src/kernel32/winimgres.cpp
- Timestamp:
- May 22, 2000, 9:08:01 PM (25 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kernel32/winimgres.cpp
r3547 r3588 1 /* $Id: winimgres.cpp,v 1.3 6 2000-05-18 09:08:38sandervl Exp $ */1 /* $Id: winimgres.cpp,v 1.37 2000-05-22 19:08:00 sandervl Exp $ */ 2 2 3 3 /* … … 35 35 #define BITMAP_TYPENAME2 "DIB" 36 36 37 #define RESERR_SUCCESS 0 38 #define RESERR_IDNOTFOUND 1 39 #define RESERR_TYPENOTFOUND 2 40 #define RESERR_LANGNOTFOUND 3 41 37 42 //****************************************************************************** 38 43 //Assuming names are case insensitive … … 40 45 //****************************************************************************** 41 46 PIMAGE_RESOURCE_DATA_ENTRY 42 Win32ImageBase::getPEResourceEntry(ULONG id, ULONG type, ULONG lang )47 Win32ImageBase::getPEResourceEntry(ULONG id, ULONG type, ULONG lang, int *error) 43 48 { 44 49 PIMAGE_RESOURCE_DIRECTORY prdType; … … 48 53 ULONG nodeData[3], i, j, nameOffset; 49 54 BOOL fFound = FALSE, fNumType; 55 56 *error = RESERR_TYPENOTFOUND; 50 57 51 58 //PH: our system LX DLLs might not have a resource segment … … 120 127 if(fFound) { 121 128 if((ULONG)prdType & 0x80000000) {//subdirectory? 122 pData = ProcessResSubDir(prdType, &nodeData[0], 2 );129 pData = ProcessResSubDir(prdType, &nodeData[0], 2, error); 123 130 } 124 131 else { … … 131 138 prde++; 132 139 } 140 if(pData) { 141 *error = RESERR_SUCCESS; //found it 142 } 133 143 return pData; 134 144 } … … 139 149 PIMAGE_RESOURCE_DATA_ENTRY 140 150 Win32ImageBase::ProcessResSubDir(PIMAGE_RESOURCE_DIRECTORY prdType, 141 ULONG *nodeData, int level )151 ULONG *nodeData, int level, int *error) 142 152 { 143 153 PIMAGE_RESOURCE_DIRECTORY prdType2; … … 158 168 prde = (PIMAGE_RESOURCE_DIRECTORY_ENTRY)((DWORD)prdType + sizeof(IMAGE_RESOURCE_DIRECTORY)); 159 169 170 if(level == 2) { 171 *error = RESERR_IDNOTFOUND; 172 } 173 else { 174 *error = RESERR_LANGNOTFOUND; 175 } 160 176 //level 2 (id) -> get first id? 161 177 //level 3 (lang) -> get first language? … … 204 220 if(fFound) { 205 221 if((ULONG)prdType2 & 0x80000000) {//subdirectory? 206 return ProcessResSubDir(prdType2, nodeData+1, 3 );222 return ProcessResSubDir(prdType2, nodeData+1, 3, error); 207 223 } 208 224 else { … … 222 238 ULONG Win32ImageBase::getPEResourceSize(ULONG id, ULONG type, ULONG lang) 223 239 { 224 PIMAGE_RESOURCE_DATA_ENTRY pData = NULL; 240 PIMAGE_RESOURCE_DATA_ENTRY pData = NULL; 241 int error; 225 242 226 243 switch(lang) { … … 237 254 } 238 255 239 pData = getPEResourceEntry(id, type, lang );256 pData = getPEResourceEntry(id, type, lang, &error); 240 257 if(pData == NULL) { 241 258 dprintf(("Win32ImageBase::getPEResourceSize: couldn't find resource %d (type %d, lang %x)", id, type, lang)); … … 246 263 //****************************************************************************** 247 264 //****************************************************************************** 248 HRSRC Win32ImageBase::findResourceA(LPCSTR lpszName, LPSTR lpszType, ULONG lang )265 HRSRC Win32ImageBase::findResourceA(LPCSTR lpszName, LPSTR lpszType, ULONG langid) 249 266 { 250 267 PIMAGE_RESOURCE_DATA_ENTRY pData = NULL; … … 252 269 BOOL fNumType; 253 270 char *winres = NULL; 254 ULONG id, type ;255 int i, j ;271 ULONG id, type, lang; 272 int i, j, error; 256 273 257 274 fNumType = TRUE; //assume numeric … … 275 292 else type = (ULONG)lpszType; 276 293 277 switch(lang ) {294 switch(langid) { 278 295 case LOCALE_SYSTEM_DEFAULT: 279 296 lang = GetSystemDefaultLangID(); … … 285 302 //TODO: Not correct; should take language associated with current thread 286 303 lang = IDLANG_GETFIRST; 287 break; 304 break; 305 case IDLANG_GETFIRST: 306 lang = GetUserDefaultLangID(); 307 break; 288 308 } 289 309 id = (ULONG)lpszName; 290 310 291 pData = getPEResourceEntry(id, type, lang );311 pData = getPEResourceEntry(id, type, lang, &error); 292 312 if(pData == NULL) { 293 if(HIWORD(id)) { 294 dprintf(("Win32ImageBase::getPEResource %s: couldn't find resource %s (type %d, lang %x)", szModule, id, type, lang)); 295 } 296 else dprintf(("Win32ImageBase::getPEResource %s: couldn't find resource %d (type %d, lang %x)", szModule, id, type, lang)); 297 return 0; 313 //TODO: Optimize this; check if language wasn't found 314 //try system default language 315 if(error == RESERR_LANGNOTFOUND) { 316 pData = getPEResourceEntry(id, type, GetSystemDefaultLangID(), &error); 317 } 318 if(pData == NULL) { 319 //finally try first available language 320 if(error == RESERR_LANGNOTFOUND) { 321 pData = getPEResourceEntry(id, type, IDLANG_GETFIRST, &error); 322 } 323 if(pData == NULL) { 324 if(HIWORD(id)) { 325 dprintf(("Win32ImageBase::getPEResource %s: couldn't find resource %s (type %d, lang %x)", szModule, id, type, lang)); 326 } 327 else dprintf(("Win32ImageBase::getPEResource %s: couldn't find resource %d (type %d, lang %x)", szModule, id, type, lang)); 328 return 0; 329 } 330 } 298 331 } 299 332 if(HIWORD(id)) { … … 374 407 { 375 408 PIMAGE_RESOURCE_DATA_ENTRY pData = NULL; 409 int error; 376 410 377 411 if(verstruct == NULL || bufLength == 0) { … … 379 413 return FALSE; 380 414 } 381 pData = getPEResourceEntry(ID_GETFIRST, NTRT_VERSION );415 pData = getPEResourceEntry(ID_GETFIRST, NTRT_VERSION, IDLANG_GETFIRST, &error); 382 416 if(pData == NULL) { 383 417 dprintf(("Win32PeLdrImage::getVersionStruct: couldn't find version resource!"));
Note:
See TracChangeset
for help on using the changeset viewer.