| 260 | }; |
| 261 | |
| 262 | void readResourceDirectory(BReadFile& f, uint32_t resourceVirtualAddress, uint32_t baseResourceFileOffset, unsigned char* resourceBuffer, uint32_t offsetFromBaseResource, uint32_t resourceBufferSize, ImageResourceDirectory* dir, uint16_t type, bool isIcon, std::vector<IconInfo>& icons) { |
| 263 | ImageResourceDirectoryEntry* entry = (ImageResourceDirectoryEntry*)(((unsigned char*)dir)+sizeof(ImageResourceDirectory)); |
| 264 | for (int i=0;i<dir->NumberOfNamedEntries+dir->NumberOfIdEntries;i++, entry++) { |
| 265 | if (entry->DirectoryInfo.DataIsDirectory) { |
| 266 | if (entry->DirectoryInfo.OffsetToDirectory<offsetFromBaseResource || entry->DirectoryInfo.OffsetToDirectory+sizeof(ImageResourceDirectory)>=offsetFromBaseResource+resourceBufferSize) { |
| 267 | unsigned char buffer[4096] = {}; |
| 268 | int newOffsetFromBaseResource = entry->DirectoryInfo.OffsetToDirectory & 0xFFFFF000; |
| 269 | f.setPos(offsetFromBaseResource+baseResourceFileOffset); |
| 270 | f.read(buffer, 4096); |
| 271 | readResourceDirectory(f, resourceVirtualAddress, baseResourceFileOffset, buffer, newOffsetFromBaseResource, 4096, (ImageResourceDirectory*)(entry->DirectoryInfo.OffsetToDirectory+resourceBuffer), entry->Id, isIcon || type==3, icons); |
| 272 | } else { |
| 273 | readResourceDirectory(f, resourceVirtualAddress, baseResourceFileOffset, resourceBuffer, offsetFromBaseResource, resourceBufferSize, (ImageResourceDirectory*)(entry->DirectoryInfo.OffsetToDirectory+resourceBuffer), entry->Id, isIcon || type==3, icons); |
| 274 | } |
| 275 | } else { |
| 276 | if (isIcon) { |
| 277 | ImageResourceDataEntry* data = nullptr; |
| 278 | if (entry->DirectoryInfo.OffsetToDirectory>=offsetFromBaseResource && entry->DirectoryInfo.OffsetToDirectory+sizeof(ImageResourceDirectory)<offsetFromBaseResource+resourceBufferSize) { |
| 279 | data = (ImageResourceDataEntry*)(entry->OffsetToData+resourceBuffer); |
| 280 | } else { |
| 281 | static unsigned char buffer[sizeof(ImageResourceDirectory)]; |
| 282 | f.setPos(entry->DirectoryInfo.OffsetToDirectory+baseResourceFileOffset); |
| 283 | f.read(buffer, sizeof(ImageResourceDirectory)); |
| 284 | data = (ImageResourceDataEntry*)buffer; |
| 285 | } |
| 286 | if (data->Size>0 && data->Size<1024*1024) { |
| 287 | f.setPos((data->OffsetToData-resourceVirtualAddress)+baseResourceFileOffset); |
| 288 | IconInfo info; |
| 289 | f.read((char*)&info.bih, sizeof(BitmapInfoHeader)); |
| 290 | info.fileOffset = (data->OffsetToData-resourceVirtualAddress)+baseResourceFileOffset; |
| 291 | icons.push_back(info); |
| 292 | } |
| 293 | } |
| 294 | } |
| 295 | } |
| 296 | } |
| 297 | |
| 298 | void readPalette(BitmapInfoHeader& bih, BReadFile& f, U32* palette) { |
| 299 | int depth = bih.biBitCount; |
no test coverage detected