windows - puede - se cargo el modulo pero no se encontro el punto de entrada dllunregisterserver




¿Cómo puedo probar un archivo DLL de Windows para determinar si es de 32 o 64 bits? (4)

Esta pregunta ya tiene una respuesta aquí:

Me gustaría escribir un script o programa de prueba que afirme que todos los archivos DLL en un directorio dado son de un tipo de compilación particular.

Usaría esto como una comprobación de validez al final de un proceso de compilación en un SDK para asegurarme de que la versión de 64 bits no tenga de alguna manera algunos archivos DLL de 32 bits y viceversa.

¿Hay una manera fácil de mirar un archivo DLL y determinar su tipo?

La solución debería funcionar tanto en xp32 como en xp64.


Detalles sangrientos

Una DLL utiliza el formato de archivo ejecutable de PE, y no es demasiado difícil leer esa información del archivo.

Consulte este artículo de MSDN en el Formato de archivo PE para obtener una descripción general. IMAGE_NT_HEADERS leer el encabezado de MS-DOS y luego leer la estructura IMAGE_NT_HEADERS . Este contiene la estructura IMAGE_FILE_HEADER que contiene la información que necesita en el miembro de la Máquina que contiene uno de los siguientes valores

  • IMAGE_FILE_MACHINE_I386 (0x014c)
  • IMAGE_FILE_MACHINE_IA64 (0x0200)
  • IMAGE_FILE_MACHINE_AMD64 (0x8664)

Esta información debe estar en un desplazamiento fijo en el archivo, pero aún así recomiendo atravesar el archivo y verificar la firma del encabezado de MS-DOS y los IMAGE_NT_HEADERS para asegurarse de hacer frente a cualquier cambio futuro.

Use ImageHelp para leer los encabezados ...

También puede utilizar la API de ImageHelp para hacer esto: cargue la DLL con LoadImage y obtendrá una estructura LOADED_IMAGE que contendrá un puntero a una estructura IMAGE_NT_HEADERS. Desasigne LOADED_IMAGE con ImageUnload.

... o adaptar este guión de Perl en bruto

Aquí está el guión de Perl que hace el trabajo. Comprueba que el archivo tiene un encabezado de DOS, luego lee el offset PE de los 60 bytes de IMAGE_DOS_HEADER en el archivo.

A continuación, busca el inicio de la parte de PE, lee la firma y la verifica, y luego extrae el valor que nos interesa.

#!/usr/bin/perl
#
# usage: petype <exefile>
#
$exe = $ARGV[0];

open(EXE, $exe) or die "can't open $exe: $!";
binmode(EXE);
if (read(EXE, $doshdr, 64)) {

   ($magic,$skip,$offset)=unpack('a2a58l', $doshdr);
   die("Not an executable") if ($magic ne 'MZ');

   seek(EXE,$offset,SEEK_SET);
   if (read(EXE, $pehdr, 6)){
       ($sig,$skip,$machine)=unpack('a2a2v', $pehdr);
       die("No a PE Executable") if ($sig ne 'PE');

       if ($machine == 0x014c){
            print "i386\n";
       }
       elsif ($machine == 0x0200){
            print "IA64\n";
       }
       elsif ($machine == 0x8664){
            print "AMD64\n";
       }
       else{
            printf("Unknown machine type 0x%lx\n", $machine);
       }
   }
}

close(EXE);

Dependencia Walker lo dice todo (bueno casi). http://www.dependencywalker.com/

No se "instala"; simplemente consígalo, extráigalo y ejecute el exec. Funciona para cualquier aplicación de módulos de Windows x32 o x64.

Como recuerdo, es bastante sencillo ver todas las dependencias, es decir, los módulos dll, y desde la aplicación. es una suma de las dependencias que uno puede determinar si está llena x64, x32 (x86) o un poco de cada una.

El tipo de CPU para la que se construyó el módulo se encuentra en la columna "CPU". La mayoría de los aps de 64 bits son todavía un poco de cada uno, pero de 32 bits ap w / b todo x86.

Hermoso programa para geeks / programadores y es gratis ...


Si tiene instalado Cygwin (que recomiendo encarecidamente por varios motivos), puede usar la utilidad 'archivo' en la DLL

file <filename>

Lo que daría una salida como esta:

icuuc36.dll: MS-DOS executable PE  for MS Windows (DLL) (GUI) Intel 80386 32-bit

Una forma burda sería llamar a dumpbin con la opción de encabezados de las herramientas de Visual Studio en cada DLL y buscar el resultado apropiado:

dumpbin /headers my32bit.dll

PE signature found

File Type: DLL

FILE HEADER VALUES
             14C machine (x86)
               1 number of sections
        45499E0A time date stamp Thu Nov 02 03:28:10 2006
               0 file pointer to symbol table
               0 number of symbols
              E0 size of optional header
            2102 characteristics
                   Executable
                   32 bit word machine
                   DLL

OPTIONAL HEADER VALUES
             10B magic # (PE32)

Puede ver un par de pistas en esa salida de que es una DLL de 32 bits, incluido el valor de 14C que menciona Paul. Debe ser fácil de buscar en un script.





32bit-64bit