Pregunta

He intentado compilar el siguiente archivo asm en VS2008 (como parte de un proyecto DLL Win32 vacía a la que he añadido este archivo asm individual):

.386
.model flat, stdcall
option casemap:none

TRUE                        equ 1

.code
start:
DllEntry proc instance:DWORD, reason:DWORD, reserved:DWORD
    mov     eax, TRUE
    ret
DllEntry endp

CPUIDIsSupported proc uses ebx edx        
    mov  eax, 0

    pushfd
    pop  eax                    ; Get EFLAGS to EAX
    mov  ecx, eax               ; Preserve it in ECX

    xor  eax, 200000h           ; Check if CPUID bit can toggle
    push eax
    popfd                       ; Restore the modified EAX
                                ; to EFLAGS

    pushfd                      ; Get the EFLAGS again
    pop  ebx                    ; to EBX
    xor  eax, ebx               ; Has it toggled?
    and  eax, 200000h
    jnz  __not_supported        ; No? CPUID is not supported

    mov  eax, 1
    jmp  _ciis_ret_             ; Yes? CPUID is supported

    __not_supported:
    xor  eax, eax

    _ciis_ret_:
    push ecx                    ; Restore the original EFLAGS
    popfd

    ret
CPUIDIsSupported endp

.586
__cpuid proc stdcall public uses ebx edi __funcNumber:dword, __eax:dword, __ebx:dword, __ecx:dword, __edx:dword

    ; Must be 80586 and above
    call    CPUIDIsSupported
    dec     eax
    jz      _cpuid_begin_

    ; No CPUID instruction
    xor     eax, eax
    jmp     _cpuid_ret_

    _cpuid_begin_:
    mov     eax, __funcNumber
    cpuid

    mov     edi, __eax
    mov     dword ptr [edi], eax
    mov     edi, __ecx
    mov     dword ptr [edi], ecx
    mov     edi, __edx
    mov     dword ptr [edi], edx
    mov     edi, __ebx
    mov     dword ptr [edi], ebx

    mov     eax, 1

    _cpuid_ret_:
    ret
__cpuid endp

end start

El código fue originalmente publicado AQUÍ .

Cuando construyo recibo una advertencia:

LNK4086 de advertencia: punto de entrada '_start' no está __stdcall con 12 bytes de argumentos; la imagen no se puede ejecutar

Sin embargo, se genera una .dll.

Al intentar utilizar esa DLL consigo una excepción porque "No se puede encontrar punto de entrada CPUIDIsSupported en DLL"

Pero ahora aquí está el problema:

Si puedo compilar exactamente el mismo archivo asm en MASM32, sigo teniendo el LNK4086 pero el DLL puede ser llamado correctamente.

Me gustaría incluir el archivo asm en mi solución VS2008 y construir desde allí en vez de tener que utilizar MASM32. Por lo tanto me gustaría saber lo que tengo que cambiar mi proceso de construcción con el fin de obtener una DLL de trabajo. También estoy interesado en saber cómo puedo crear una versión de 64 bits de la DLL desde dentro VS2008.

¿Fue útil?

Solución

Cambio de la end start a end DllEntry debe solucionar los problemas. VS2008 tiene una versión mucho más reciente de ML a la que se incluye con MASM32 y puede ser más estricta con respecto al punto de entrada.

DllEntry y start son en realidad el mismo punto, por lo que el código se ejecuta. Yo supongo que cuando aparezca la advertencia que ningún punto de entrada es en realidad especifica en la cabecera PE.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top