private byte[] GetResourceDataForCulture(ResourceDirectoryEntry level2Entry, int cultureID) { var resourceSectionHeader = _sectionMap[DataDirectoryEntry.Resource]; var resourceDirectoryFileOffset = resourceSectionHeader.PointerToRawData + ResourceDirectory.RESOURCE_DIRECTORY_SIZE; _fileStream.Seek(resourceDirectoryFileOffset + (level2Entry.OffsetToData & 0x7FFFFFFF), SeekOrigin.Begin); ResourceDirectoryEntry level3Entry; do { level3Entry = GetResourceDirectoryEntryAtCurrentFilePosition(); if (level3Entry.Name == cultureID) { var resourceDataEntry = GetResourceDataEntryAtOffset(level3Entry.OffsetToData); var bitmapDataOffset = resourceSectionHeader.PointerToRawData + resourceDataEntry.OffsetToData - resourceSectionHeader.VirtualAddress; _fileStream.Seek(bitmapDataOffset, SeekOrigin.Begin); var bytes = new byte[resourceDataEntry.Size]; _fileStream.Read(bytes, 0, bytes.Length); return bytes; } } while (level3Entry.Name != 0); return new byte[0]; }
private byte[] FindMatchingLevel2ResourceEntry(ResourceDirectoryEntry level1Entry, int resourceID, int cultureID) { var resourceSectionHeader = _sectionMap[DataDirectoryEntry.Resource]; var resourceSectionFileOffset = resourceSectionHeader.PointerToRawData; var resourceDirectoryFileOffset = resourceSectionFileOffset + ResourceDirectory.RESOURCE_DIRECTORY_SIZE; _fileStream.Seek(resourceDirectoryFileOffset + (level1Entry.OffsetToData & 0x7FFFFFFF), SeekOrigin.Begin); ResourceDirectoryEntry level2Entry; do { level2Entry = GetResourceDirectoryEntryAtCurrentFilePosition(); if (level2Entry.Name == resourceID) { return GetResourceDataForCulture(level2Entry, cultureID); } } while (level2Entry.Name != 0); return new byte[0]; }