MCPcopy Create free account
hub / github.com/danoon2/Boxedwine / readResourceDirectory

Function readResourceDirectory

source/ui/utils/readIcons.cpp:262–296  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

260};
261
262void 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
298void readPalette(BitmapInfoHeader& bih, BReadFile& f, U32* palette) {
299 int depth = bih.biBitCount;

Callers 1

extractIconFromExeFunction · 0.85

Calls 3

setPosMethod · 0.80
readMethod · 0.45
push_backMethod · 0.45

Tested by

no test coverage detected