从大文件中检索版本信息

我们有大型可执行文件(> 1,2 GB),其中包含自定义版本信息。 我尝试使用’FileVersionInfo’类的’GetVersionInfo’从这些文件中检索此“版本信息”。 由于某些原因,此方法不会返回Windows XP中较大文件(测试> 1 GB)的版本信息。 它适用于大小为18 MB的文件。 当我在Windows 7(x86和X64)中尝试相同时,它适用于所有文件,甚至更大的onces!

我使用了一个Reflector工具来查看FileVersionInfo类,我创建了一个小型控制台应用程序来检索’File Version Info’-Size,就像’GetVersionInfo’方法一样。 在Windows XP和Windows 7中返回大小为0(零)的大小为1428,返回相同的文件。 XP中的最后一个错误是1812(’指定的图像文件不包含资源部分’)。

这在Windows XP中不起作用并且在Windows 7中有效的原因是什么? 是否有解决版本信息的工作?

在我测试过的代码下面:

class Program { [DllImport("version.dll", BestFitMapping = false, CharSet = CharSet.Auto, SetLastError = true)] public static extern int GetFileVersionInfoSize(string lptstrFilename, out int handle); static void Main(string[] args) { Console.Write("Path which contains the executables: "); string path = Console.ReadLine(); foreach (string fileName in Directory.EnumerateFiles(path)) { int num; int fileVersionInfoSize = GetFileVersionInfoSize(fileName, out num); int error = Marshal.GetLastWin32Error(); Console.WriteLine("File Version Info Size: " + fileVersionInfoSize); if (error != 0) { Console.WriteLine("Last Error: " + error); } } Console.ReadKey(); } } 

加载程序可能无法将整个文件映射到其地址空间。 随意阅读PE文件格式以查找版本资源。

但是, 你用这么大的PE图像做什么 ? 如果它的自定义资源,它更适合将它们附加到.exe,因此加载器只需映射一点,然后直接访问它们。 这需要您知道您的大小(在偏移124处有4个字节可以安全地覆盖,因为它们是在“此程序无法在MS-DOS模式下运行”后填充的。错误消息存根)。