Changeset 589 for trunk/src/kernel32/winimgres.cpp
- Timestamp:
- Aug 19, 1999, 9:51:18 PM (26 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kernel32/winimgres.cpp
r576 r589 1 /* $Id: winimgres.cpp,v 1. 9 1999-08-19 12:53:18sandervl Exp $ */1 /* $Id: winimgres.cpp,v 1.10 1999-08-19 19:50:40 sandervl Exp $ */ 2 2 3 3 /* … … 34 34 //PE spec says names & ids are sorted; keep on searching just to be sure 35 35 //****************************************************************************** 36 Win32Resource *Win32Image::getPEResource(ULONG id, ULONG type, ULONG lang) 36 PIMAGE_RESOURCE_DATA_ENTRY 37 Win32Image::getPEResourceEntry(ULONG id, ULONG type, ULONG lang) 37 38 { 38 39 PIMAGE_RESOURCE_DIRECTORY prdType; 39 40 PIMAGE_RESOURCE_DIRECTORY_ENTRY prde; 40 41 PIMAGE_RESOURCE_DATA_ENTRY pData = NULL; 41 Win32Resource *res; 42 ULONG nodeData[3]; 42 ULONG nodeData[3], i, j; 43 43 BOOL fFound = FALSE, fNumType; 44 char *winres = NULL;45 int i, stringid = -1, j;46 44 47 45 /* set pointer to first resource type entry */ … … 66 64 } 67 65 else type = i; 68 }69 70 //String format: tables of 16 strings stored as one resource71 //upper 12 bits of resource id passed by user determines block (res id)72 //lower 4 bits are an index into the string table73 if(fNumType) {74 if(type == NTRT_STRING) {75 stringid = id & 0xF;76 id = (id >> 4);77 }78 }79 else {80 if(stricmp((char *)type, ResTypes[NTRT_STRING]) == 0) {81 stringid = id & 0xF;82 id = (id >> 4);83 }84 66 } 85 67 … … 128 110 prde++; 129 111 } 112 return pData; 113 } 114 //****************************************************************************** 115 //level: 2 ids 116 // 3 languages 117 //****************************************************************************** 118 PIMAGE_RESOURCE_DATA_ENTRY 119 Win32Image::ProcessResSubDir(PIMAGE_RESOURCE_DIRECTORY prdType, 120 ULONG *nodeData, int level) 121 { 122 PIMAGE_RESOURCE_DIRECTORY prdType2; 123 PIMAGE_RESOURCE_DIRECTORY_ENTRY prde; 124 PIMAGE_RESOURCE_DIR_STRING_U pstring; 125 PIMAGE_RESOURCE_DATA_ENTRY pData; 126 BOOL fFound = FALSE, fNumId; 127 ULONG nrres; 128 char *resname; 129 int i; 130 131 if(*nodeData == 0xFFFFFFFF) {//shouldn't happen! 132 dprintf(("ProcessResSubDir: *nodeData == 0xFFFFFFFF!\n")); 133 return(NULL); 134 } 135 prdType = (PIMAGE_RESOURCE_DIRECTORY)((ULONG)prdType & ~0x80000000); 136 prde = (PIMAGE_RESOURCE_DIRECTORY_ENTRY)((DWORD)prdType + sizeof(IMAGE_RESOURCE_DIRECTORY)); 137 138 if(level == 3 && *nodeData == LANG_GETFIRST) { 139 nrres = prdType->NumberOfNamedEntries + prdType->NumberOfIdEntries; 140 fNumId = (prdType->NumberOfNamedEntries == 0); 141 } 142 else { 143 fNumId = HIWORD(*nodeData) == 0; 144 145 if(fNumId) {//numeric or string id? 146 nrres = prdType->NumberOfIdEntries; 147 prde += prdType->NumberOfNamedEntries; //skip name entries 148 } 149 else nrres = prdType->NumberOfNamedEntries; 150 } 151 152 for(i=0;i<nrres;i++) { 153 /* locate directory or each resource type */ 154 prdType2 = (PIMAGE_RESOURCE_DIRECTORY)((ULONG)pResDir + (ULONG)prde->u2.OffsetToData); 155 156 if(!fNumId) {//name or id entry? 157 if(prde->u1.s.NameIsString) //unicode directory string /*PLF Sat 97-06-21 22:30:35*/ 158 prde->u1.Name &= ~0x80000000; 159 160 pstring = (PIMAGE_RESOURCE_DIR_STRING_U)((ULONG)pResDir + (ULONG)prde->u1.Name); 161 resname = UnicodeToAsciiStringN(pstring->NameString, pstring->Length); 162 if(stricmp(resname, (char *)*nodeData) == 0) { 163 fFound = TRUE; 164 } 165 FreeAsciiString(resname); 166 } 167 else { 168 if(*nodeData == prde->u1.Id) 169 fFound = TRUE; 170 } 171 if(*nodeData == LANG_GETFIRST) 172 fFound = TRUE; 173 174 if(fFound) { 175 if((ULONG)prdType2 & 0x80000000) {//subdirectory? 176 return ProcessResSubDir(prdType2, nodeData+1, 3); 177 } 178 else { 179 pData = (PIMAGE_RESOURCE_DATA_ENTRY)prdType2; 180 if(pData->Size) {//winamp17 winzip archive has resource with size 0 181 return(pData); 182 } 183 else return(NULL); 184 } 185 } 186 prde++; 187 } 188 return(NULL); 189 } 190 //****************************************************************************** 191 //****************************************************************************** 192 ULONG Win32Image::getPEResourceSize(ULONG id, ULONG type, ULONG lang) 193 { 194 PIMAGE_RESOURCE_DATA_ENTRY pData = NULL; 195 196 pData = getPEResourceEntry(id, type, lang); 130 197 if(pData == NULL) { 131 dprintf(("getResource: res not found!\n")); 132 return(NULL); 133 } 134 135 char *resdata = (char *)((char *)pResDir + pData->OffsetToData - pResSection->virtaddr); 198 dprintf(("Win32Image::getPEResourceSize: couldn't find resource %d (type %d, lang %d)", id, type, lang)); 199 return 0; 200 } 201 return pData->Size; 202 } 203 //****************************************************************************** 204 //****************************************************************************** 205 Win32Resource *Win32Image::getPEResource(ULONG id, ULONG type, ULONG lang) 206 { 207 PIMAGE_RESOURCE_DATA_ENTRY pData = NULL; 208 Win32Resource *res; 209 BOOL fNumType; 210 char *winres = NULL; 211 int i, stringid = -1, j; 212 213 fNumType = TRUE; //assume numeric 214 if(HIWORD(type) != 0) {//string id? 215 for(i=0;i<MAX_RES;i++) { 216 if(stricmp((char *)type, ResTypes[i]) == 0) 217 break; 218 } 219 if(i == MAX_RES) {//custom resource type 220 fNumType = FALSE; 221 } 222 else type = i; 223 } 224 225 //String format: tables of 16 strings stored as one resource 226 //upper 12 bits of resource id passed by user determines block (res id) 227 //lower 4 bits are an index into the string table 228 if(fNumType) { 229 if(type == NTRT_STRING) { 230 stringid = id & 0xF; 231 id = (id >> 4); 232 } 233 } 234 else { 235 if(stricmp((char *)type, ResTypes[NTRT_STRING]) == 0) { 236 stringid = id & 0xF; 237 id = (id >> 4); 238 } 239 } 240 241 pData = getPEResourceEntry(id, type, lang); 242 if(pData == NULL) { 243 dprintf(("Win32Image::getPEResource: couldn't find resource %d (type %d, lang %d)", id, type, lang)); 244 return 0; 245 } 246 247 char *resdata = (char *)((char *)pResDir + pData->OffsetToData - (pResSection->virtaddr - oh.ImageBase)); 136 248 if(stringid != -1) {//search for string in table 137 249 USHORT *unicodestr = (USHORT *)resdata; … … 151 263 } 152 264 //****************************************************************************** 153 //level: 2 ids154 // 3 languages155 //******************************************************************************156 PIMAGE_RESOURCE_DATA_ENTRY157 Win32Image::ProcessResSubDir(PIMAGE_RESOURCE_DIRECTORY prdType,158 ULONG *nodeData, int level)159 {160 PIMAGE_RESOURCE_DIRECTORY prdType2;161 PIMAGE_RESOURCE_DIRECTORY_ENTRY prde;162 PIMAGE_RESOURCE_DIR_STRING_U pstring;163 PIMAGE_RESOURCE_DATA_ENTRY pData;164 BOOL fFound = FALSE, fNumId;165 ULONG nrres;166 char *resname;167 int i;168 169 if(*nodeData == 0xFFFFFFFF) {//shouldn't happen!170 dprintf(("ProcessResSubDir: *nodeData == 0xFFFFFFFF!\n"));171 return(NULL);172 }173 prdType = (PIMAGE_RESOURCE_DIRECTORY)((ULONG)prdType & ~0x80000000);174 prde = (PIMAGE_RESOURCE_DIRECTORY_ENTRY)((DWORD)prdType + sizeof(IMAGE_RESOURCE_DIRECTORY));175 176 if(level == 3 && *nodeData == LANG_GETFIRST) {177 nrres = prdType->NumberOfNamedEntries + prdType->NumberOfIdEntries;178 fNumId = (prdType->NumberOfNamedEntries != 0);179 }180 else {181 fNumId = HIWORD(*nodeData) == 0;182 183 if(fNumId) {//numeric or string id?184 nrres = prdType->NumberOfIdEntries;185 prde += prdType->NumberOfNamedEntries; //skip name entries186 }187 else nrres = prdType->NumberOfNamedEntries;188 }189 190 for(i=0;i<nrres;i++) {191 /* locate directory or each resource type */192 prdType2 = (PIMAGE_RESOURCE_DIRECTORY)((ULONG)pResDir + (ULONG)prde->u2.OffsetToData);193 194 if(!fNumId) {//name or id entry?195 if(prde->u1.s.NameIsString) //unicode directory string /*PLF Sat 97-06-21 22:30:35*/196 prde->u1.Name &= ~0x80000000;197 198 pstring = (PIMAGE_RESOURCE_DIR_STRING_U)((ULONG)pResDir + (ULONG)prde->u1.Name);199 resname = UnicodeToAsciiStringN(pstring->NameString, pstring->Length);200 if(stricmp(resname, (char *)*nodeData) == 0) {201 fFound = TRUE;202 }203 FreeAsciiString(resname);204 }205 else {206 if(*nodeData == prde->u1.Id)207 fFound = TRUE;208 }209 if(*nodeData == LANG_GETFIRST)210 fFound = TRUE;211 212 if(fFound) {213 if((ULONG)prdType2 & 0x80000000) {//subdirectory?214 ProcessResSubDir(prdType2, nodeData+1, 3);215 }216 else {217 pData = (PIMAGE_RESOURCE_DATA_ENTRY)prdType2;218 if(pData->Size) {//winamp17 winzip archive has resource with size 0219 return(pData);220 }221 else return(NULL);222 }223 }224 prde++;225 }226 return(NULL);227 }228 //******************************************************************************229 265 //****************************************************************************** 230 266 HRSRC Win32Image::findResourceA(LPCSTR lpszName, LPSTR lpszType) … … 240 276 //else converted win32 exe/dll 241 277 242 if( (int)lpszType >> 16!= 0) {//type name, translate to id278 if(HIWORD(lpszType) != 0) {//type name, translate to id 243 279 for(i=0;i<MAX_RES;i++) { 244 280 if(strcmp(lpszType, ResTypes[i]) == 0) … … 279 315 dprintf(("FindResourceA from %X type %d (%X)\n", hinstance, szType, lpszType)); 280 316 281 if( (int)lpszName >> 16!= 0) {//convert string name identifier to numeric id317 if(HIWORD(lpszName) != 0) {//convert string name identifier to numeric id 282 318 dprintf(("FindResource %s\n", lpszName)); 283 319 if(lpszName[0] == '#') {// #344 … … 294 330 } 295 331 296 if(hres == NULL && (int)lpszName >> 16== 0 && (int)szType == NTRT_STRING) {332 if(hres == NULL && HIWORD(lpszName) == 0 && (int)szType == NTRT_STRING) { 297 333 hres = O32_FindResource(hinstance, (LPCSTR)(((int)lpszName - 1)*16), (LPCSTR)NTRT_RCDATA); 298 334 if(hres) … … 317 353 318 354 if(fNativePEImage == TRUE) {//load resources directly from res section 319 if( (int)lpszType >> 16!= 0) {355 if(HIWORD(lpszType) != 0) { 320 356 char *resname = UnicodeToAsciiString(lpszType); 321 357 } 322 358 else astring1 = (char *)lpszType; 323 359 324 if( (int)lpszName >> 16!= 0) {360 if(HIWORD(lpszName) != 0) { 325 361 astring2 = UnicodeToAsciiString(lpszName); 326 362 } … … 334 370 } 335 371 //else converted win32 exe/dll 336 if( (int)lpszType >> 16!= 0) {//type name, translate to id372 if(HIWORD(lpszType) != 0) {//type name, translate to id 337 373 char *resname = UnicodeToAsciiString(lpszType); 338 374 for(i=0;i<MAX_RES;i++) { … … 375 411 dprintf(("FindResourceW type %d\n", szType)); 376 412 377 if( (int)lpszName >> 16!= 0) {//convert string name identifier to numeric id413 if(HIWORD(lpszName) != 0) {//convert string name identifier to numeric id 378 414 astring1 = UnicodeToAsciiString(lpszName); 379 415 dprintf(("FindResourceW %X %s\n", hinstance, astring1)); … … 391 427 } 392 428 393 if(hres == NULL && (int)lpszName >> 16== 0 && (int)szType == NTRT_STRING) {429 if(hres == NULL && HIWORD(lpszName) == 0 && (int)szType == NTRT_STRING) { 394 430 hres = O32_FindResource(hinstance, (LPCSTR)(((ULONG)lpszName - 1)*16), (LPCSTR)NTRT_RCDATA); 395 431 if(hres) … … 407 443 //****************************************************************************** 408 444 //****************************************************************************** 445 ULONG Win32Image::getResourceSizeA(LPCSTR lpszName, LPSTR lpszType) 446 { 447 if(fNativePEImage == TRUE) { 448 return getPEResourceSize((ULONG)lpszName, (ULONG)lpszType); 449 } 450 DebugInt3(); 451 return 0; 452 } 453 //****************************************************************************** 454 //****************************************************************************** 455 ULONG Win32Image::getResourceSizeW(LPCWSTR lpszName, LPWSTR lpszType) 456 { 457 char *astring1 = NULL, *astring2 = NULL; 458 ULONG ressize; 459 460 if(fNativePEImage == TRUE) {//load resources directly from res section 461 if(HIWORD(lpszType) != 0) { 462 char *resname = UnicodeToAsciiString(lpszType); 463 } 464 else astring1 = (char *)lpszType; 465 466 if(HIWORD(lpszName) != 0) { 467 astring2 = UnicodeToAsciiString((LPWSTR)lpszName); 468 } 469 else astring2 = (char *)lpszName; 470 471 ressize = getPEResourceSize((ULONG)astring1, (ULONG)astring1); 472 if(astring1) FreeAsciiString(astring1); 473 if(astring2) FreeAsciiString(astring2); 474 475 return(ressize); 476 } 477 DebugInt3(); 478 return 0; 479 } 480 //****************************************************************************** 481 //******************************************************************************
Note:
See TracChangeset
for help on using the changeset viewer.