void* _FindResource(IMAGE_DOS_HEADER* pDosHeader, void* prt, int resIndex, int resType, DWORD* pcbSize) { int count, index = 0; IMAGE_RESOURCE_DIRECTORY_ENTRY* pRes; IMAGE_RESOURCE_DATA_ENTRY* pEntry; pRes = _FindResourceBase(prt, resType, &count); if (resIndex < 0) { for (index = 0; index < count; index++) if (pRes[index].Name == (DWORD)(-resIndex)) break; } else index = resIndex; if (index >= count) return NULL; if (pRes[index].OffsetToData & IMAGE_RESOURCE_DATA_IS_DIRECTORY) { IMAGE_RESOURCE_DIRECTORY* pDir; pDir = (IMAGE_RESOURCE_DIRECTORY*)((LPBYTE)prt + (pRes[index].OffsetToData & ~IMAGE_RESOURCE_DATA_IS_DIRECTORY)); pRes = (IMAGE_RESOURCE_DIRECTORY_ENTRY*)(pDir+1); index = 0; } if (pRes[index].OffsetToData & IMAGE_RESOURCE_DATA_IS_DIRECTORY) return NULL; pEntry = (IMAGE_RESOURCE_DATA_ENTRY*)((LPBYTE)prt + pRes[index].OffsetToData); *pcbSize = pEntry->Size; return _RelativeVirtualAddresstoPtr(pDosHeader, pEntry->OffsetToData); }
int _FindResourceCount(void* prt, int resType) { int count; _FindResourceBase(prt, resType, &count); return count; }
int ExtractIcons::_FindResourceCount( void* prt, INT_PTR resType ) { int count; IMAGE_RESOURCE_DIRECTORY_ENTRY* pRes; pRes = _FindResourceBase( prt, resType, &count ); return count; }
void* ExtractIcons::_FindResource( IMAGE_DOS_HEADER* pDosHeader, void* prt, int resIndex, INT_PTR resType, DWORD* pcbSize ) { int count; IMAGE_RESOURCE_DIRECTORY_ENTRY* pRes; pRes = _FindResourceBase( prt, resType, &count ); int index = 0; // find the actual resource // id (resIndex < 0) // ordinal (resIndex >= 0) if( resIndex < 0 ) { for( index = 0; index < count; index++ ) if( pRes[index].Name == (DWORD)(-resIndex) ) break; } else { index = resIndex; } if( index >= count ) return NULL; // index out of range // another Directory // probably language take the first one if( pRes[index].OffsetToData & IMAGE_RESOURCE_DATA_IS_DIRECTORY) { IMAGE_RESOURCE_DIRECTORY* pDir; pDir = (IMAGE_RESOURCE_DIRECTORY*)((LPBYTE)prt + (pRes[index].OffsetToData & ~IMAGE_RESOURCE_DATA_IS_DIRECTORY) ); pRes = (IMAGE_RESOURCE_DIRECTORY_ENTRY*)(pDir+1); index = 0; } // Oooooooooooo no !! another Directory !!! if( pRes[index].OffsetToData & IMAGE_RESOURCE_DATA_IS_DIRECTORY ) return NULL; IMAGE_RESOURCE_DATA_ENTRY* pEntry; pEntry = (IMAGE_RESOURCE_DATA_ENTRY*)((LPBYTE)prt + pRes[index].OffsetToData); // all OffsetToData fields except the final one are relative to // the start of the section. the final one is a virtual address // we need to go back to the header and get the virtual address // of the resource section to do this right. *pcbSize = pEntry->Size; return _RelativeVirtualAddresstoPtr( pDosHeader, pEntry->OffsetToData ); }