コード例 #1
0
ファイル: PEFile.cs プロジェクト: ethanmoffat/PELoaderLib
		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];
		}
コード例 #2
0
ファイル: PEFile.cs プロジェクト: ethanmoffat/PELoaderLib
		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];
		}