Frage

Ich habe versucht, die folgende .asm Datei in VS2008 (als Teil eines leeren Win32-DLL-Projekt, an dem ich diese einzelne .asm Datei hinzugefügt) zu kompilieren:

.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

Der Code wurde zuerst HIER.

Wenn ich baue ich eine Warnung:

Warnung LNK4086: Einstiegspunkt '_start' ist nicht mit 12 Byte von Argumenten __stdcall; Bild möglicherweise nicht ausgeführt

Allerdings ist eine DLL erzeugt wird.

Beim Versuch, diese DLL zu verwenden, erhalte ich eine Ausnahme, weil „nicht imstande, Einstiegspunkt CPUIDIsSupported in DLL zu finden“

Aber jetzt hier ist der Kicker:

Wenn ich genau die gleiche asm-Datei in MASM32 kompilieren, habe ich noch die LNK4086 bekommen, aber die DLL aufgerufen werden kann richtig.

würde Ich mag die asm-Datei in meiner VS2008-Lösung aufzunehmen und es von dort zu bauen, anstatt verwenden MASM32 zu haben. Daher würde Ich mag wissen, was ich brauche, um meinen Build-Prozess zu ändern, um eine Arbeits dll zu erhalten. Ich bin auch daran interessiert zu hören, wie ich eine 64-Bit-Version der DLL aus VS2008 erstellen kann.

War es hilfreich?

Lösung

Ändern der end start end DllEntry sollten die Probleme beheben. VS2008 hat eine viel neuere Version von ML zu dem mit MASM32 enthalten und es kann in Bezug auf den Einstiegspunkt strenger sein.

DllEntry und start sind eigentlich der gleiche Punkt, weshalb der Code ausgeführt wird. Ich würde vermuten, dass, wenn die Warnung kein Einstiegspunkt erscheint tatsächlich in dem PE-Header angegeben ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top