Question

J'ai essayé de compiler le fichier suivant dans .asm VS2008 (dans le cadre d'un projet dll Win32 vide auquel j'ai ajouté ce seul fichier 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

Le code a été publié ICI .

Quand je construis, je reçois un avertissement:

LNK4086 d'avertissement: entrypoint '_start' est pas __stdcall avec 12 octets d'arguments; l'image peut ne pas fonctionner

Cependant, une DLL est généré.

Lorsque vous essayez d'utiliser cette dll je reçois une exception parce que « Impossible de trouver entrypoint CPUIDIsSupported dans dll »

Mais est maintenant ici le kicker:

Si je compile exactement le même fichier asm dans MASM32, je reçois toujours le LNK4086 mais le dll peut être correctement appelé.

Je voudrais inclure le fichier asm dans ma solution VS2008 et construire à partir de là au lieu d'avoir à utiliser MASM32. Par conséquent, je voudrais savoir ce que je dois changer au sujet de mon processus de construction afin d'obtenir une dll de travail. Aussi je suis intéressé à entendre ce que je peux créer une version 64 bits de la dll de l'intérieur VS2008.

Était-ce utile?

La solution

Modification du end start à end DllEntry devrait corriger les problèmes. VS2008 a une version beaucoup plus récente de ML à celui inclus avec MASM32 et il peut être plus stricte en ce qui concerne le point d'entrée.

DllEntry et start sont en fait le même point, ce qui est la raison pour laquelle le code est exécuté. Je suppose que lorsque l'avertissement apparaît pas de point d'entrée est effectivement spécifié dans l'en-tête PE.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top