문제

vs2008에서 다음 .AMS 파일을 컴파일하려고 시도했습니다 (이 단일 .AMS 파일을 추가 한 빈 WIN32 DLL 프로젝트의 일부로) :

.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

코드는 원래 게시되었습니다 여기.

내가 만들 때 경고를받습니다.

경고 lnk4086 : EntryPoint '_start'는 __stdcall이 아닙니다. 이미지가 실행되지 않을 수 있습니다

그러나 .dll이 생성됩니다.

해당 DLL을 사용하려고 할 때 "DLL에서 EntryPoint CpuidissSupported를 찾을 수 없기 때문에 예외가 발생합니다."

하지만 이제 키커가 있습니다.

MASM32에서 ASM 파일을 정확히 컴파일하면 여전히 LNK4086을 얻지 만 DLL을 올바르게 호출 할 수 있습니다.

VS2008 솔루션에 ASM 파일을 포함시키고 MASM32를 사용하지 않고 여기에서 빌드하고 싶습니다. 따라서 작동하는 DLL을 얻기 위해 빌드 프로세스에 대해 무엇을 변경 해야하는지 알고 싶습니다. 또한 VS2008 내에서 64 비트 버전의 DLL을 만드는 방법을 듣고 싶습니다.

도움이 되었습니까?

해결책

변경 end start 에게 end DllEntry 문제를 해결해야합니다. VS2008은 MASM32에 포함 된 것에 대한 훨씬 새로운 버전의 ML을 가지고 있으며 진입 점과 관련하여 더 엄격 할 수 있습니다.

DllEntry 그리고 start 실제로 같은 지점이므로 코드가 실행되는 이유입니다. 경고가 나타나면 실제로 PE 헤더에 진입 점이 지정되지 않은 것으로 생각합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top