Domanda

ho provato a compilare il seguente file .asm in VS2008 (come parte di un progetto vuoto Win32 DLL a cui aggiungere questo file singolo ASM):

.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

Il codice è stato originariamente pubblicato QUI .

Quando costruisco Ho ricevuto un avviso:

warning LNK4086: entrypoint '_start' non è __stdcall con 12 byte di argomenti; immagine non può eseguire

Tuttavia, viene generata una dll.

Quando si tenta di utilizzare tale dll ricevo un'eccezione perché "Impossibile trovare entrypoint CPUIDIsSupported nella DLL"

Ma ora ecco il kicker:

Se compilo esattamente lo stesso file asm in Masm32, ho ancora ottenere il LNK4086 ma la dll può essere chiamato in modo corretto.

Mi piacerebbe includere il file asm nella mia soluzione VS2008 e costruire da lì, invece di dover utilizzare Masm32. Quindi vorrei sapere che cosa ho bisogno di cambiare per il mio processo di generazione al fine di ottenere una dll di lavoro. Anche io sono interessato a sapere come posso creare una versione a 64 bit del dll all'interno di VS2008.

È stato utile?

Soluzione

La modifica della end start a end DllEntry dovrebbe risolvere i problemi. VS2008 ha una versione molto più recente di ML a quello incluso con Masm32 e può essere più rigorosi per quanto riguarda il punto di ingresso.

DllEntry e start sono in realtà lo stesso punto, che è il motivo per cui il codice viene eseguito. Direi che quando compare l'avviso alcun punto di ingresso è in realtà specificato nell'intestazione PE.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top