2012-01-11 12 views
7

Tenemos grandes archivos ejecutables (> 1,2 GB) que contienen información de versión personalizada. Intento recuperar esta 'Información de versión' de estos archivos utilizando 'GetVersionInfo' de la clase 'FileVersionInfo'. Por alguna razón, este método no devuelve la información de versión para archivos más grandes (probados con> 1 GB) en Windows XP. Funcionó para un archivo con un tamaño de 18 MB. Cuando intento lo mismo en Windows 7 (x86 y X64) funciona para todos los archivos, ¡incluso para los más grandes!Recuperar información de la versión desde archivos de gran tamaño

Utilicé una herramienta Reflector para echar un vistazo a la clase FileVersionInfo y he creado una pequeña aplicación de consola para recuperar el 'Tamaño de la información de archivo', , tal como lo hace el método 'GetVersionInfo'. Se devuelve un tamaño de 0 (cero) en Windows XP y en Windows 7 se devuelve un tamaño de 1428 para los mismos archivos. El último error en XP es 1812 ('El archivo de imagen especificado no contenía una sección de recursos').

¿Cuál es la razón por la que esto no funciona en Windows XP y funciona en Windows 7? ¿Existe un problema para recuperar la información de la versión?

A continuación el código que he probado con:

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(); 
    } 
} 
+0

Para confirmar, ¿el archivo de 18 mb funciona en XP? – keyboardP

+0

Sí, ¡los 18 mb sí funcionan en XP! – RBDev

Respuesta

2

El cargador probablemente no asignó todo el archivo en su espacio de direcciones. Siéntase libre de leer en el formato de archivo PE para encontrar el recurso de la versión.

Sin embargo, ¿qué haces con una imagen PE tan grande? Si se trata de recursos personalizados, funciona mejor para agregarlos al archivo .exe, por lo que el cargador solo tiene que mapear un poco, luego acceda a ellos directamente. Esto requiere que conozca su tamaño (hay 4 bytes en el offset 124 que se pueden sobrescribir de manera segura ya que son pad después del mensaje "Este programa no se puede ejecutar en modo MS-DOS".

Cuestiones relacionadas