سؤال

حاولت تجميع ملف. الهضم التالي في VS2008 (كجزء من مشروع 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: إلغاء "_start" ليس __stdcall مع 12 بايت من الحجج؛ قد لا تعمل الصورة

ومع ذلك، يتم إنشاء .dll.

عند محاولة استخدام هذا DLL أحصل على استثناء لأنه "غير قادر على العثور على CPuidissupported في DLL"

ولكن الآن هنا هو كيكر:

إذا قمت بتجميع نفس ملف ASM بالضبط في Masm32، ما زلت أحصل على LNK4086 ولكن يمكن استدعاء DLL بشكل صحيح.

أرغب في تضمين ملف ASM في حل VS2008 الخاص بي وبناء عليه من هناك بدلا من الاضطرار إلى استخدام MASM32. لذلك أود أن أعرف ما أحتاج إلى تغيير عملية بناء بلدي من أجل الحصول على DLL العمل. كما أنني مهتم بسماع كيف يمكنني إنشاء نسخة 64 بت من DLL من داخل VS2008.

هل كانت مفيدة؟

المحلول

تغيير end start ل end DllEntry يجب إصلاح المشكلات. يحتوي VS2008 على إصدار أحدث من ML إلى واحد مضمن مع MASM32 وقد يكون الأمر أكثر صرامة فيما يتعلق بنقطة الدخول.

DllEntry و start هي في الواقع نفس النقطة، وهذا هو السبب في تشغيل الكود. أعتقد أنه عندما لا يبدو أن التحذير لا توجد نقطة دخول محددة بالفعل في رأس PE.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top