Pergunta

Eu tentei compilar o seguinte arquivo .asm no VS2008 (como parte de um projeto Win32 dll vazio para que eu adicionei este arquivo .asm single):

.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

O código foi originalmente publicado aqui .

Quando eu construo Eu começo um aviso:

aviso LNK4086: '_start' entrypoint não é __stdcall com 12 bytes de argumentos; imagem pode não ser executado

No entanto, um arquivo .dll é gerado.

Ao tentar usar essa dll eu recebo uma exceção porque "Incapaz de encontrar o ponto de entrada CPUIDIsSupported na DLL"

Mas agora aqui está o kicker:

Se eu compilar exatamente o mesmo arquivo asm em masm32, eu ainda obter o LNK4086 mas a dll pode ser corretamente chamado.

Gostaria de incluir o arquivo asm na minha solução VS2008 e construí-lo de lá, em vez de ter que usar masm32. Portanto, eu gostaria de saber o que eu preciso mudar em meu processo de construção, a fim de obter uma dll de trabalho. Também estou interessado em saber como eu posso criar uma versão da dll de 64 bits a partir de dentro VS2008.

Foi útil?

Solução

A alteração do end start para end DllEntry deve corrigir os problemas. VS2008 tem uma versão muito mais recente do ML à incluída com masm32 e pode ser mais rigorosa com relação ao ponto de entrada.

DllEntry e start são realmente o mesmo ponto, que é por que o código é executado. Eu acho que quando aparece o aviso nenhum ponto de entrada é realmente especificado no cabeçalho do PE.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top