GetModuleHandle 实现不起作用

问题描述 投票:0回答:0

出于培训目的,我自己实现了 WINAPI 函数 GetModuleHandle

这里是:

PVOID SelfGetModuleHandle(PCWSTR name) {

    PEB* pPeb = RtlGetCurrentPeb();//getting Process Environement Bloc
    PPEB_LDR_DATA pLdr = pPeb->Ldr; //https://learn.microsoft.com/en-us/windows/win32/api/winternl/ns-winternl-peb
    LIST_ENTRY Lentry = pLdr->InMemoryOrderModuleList;//https://learn.microsoft.com/en-us/windows/win32/api/winternl/ns-winternl-peb_ldr_data
    LIST_ENTRY FirstLentry = Lentry;
    do
    {
        LDR_DATA_TABLE_ENTRY LDataTableEntry = *(LDR_DATA_TABLE_ENTRY*)Lentry.Flink;
        if (StrCmpW(LDataTableEntry.FullDllName.Buffer, name) == 0) {
            printf("Base foud: %p\n", LDataTableEntry.DllBase);
            return (LDataTableEntry.DllBase);
        }
        Lentry = *Lentry.Flink;
    } while (memcmp(&Lentry, &FirstLentry, sizeof(LIST_ENTRY)));
    return NULL;
}

我认为我的函数很酷并且可以正常工作,但是示例代码得到了 SIGSEV(段错误)

typedef
double
(__stdcall* POW)( //pow from NTDLL (offset 0x151498)
    double a,
    double b
    );

int main(){
    HMODULE dllBase = (HMODULE)SelfGetModuleHandle(L"ntdll.dll");//00000000001F8000 instead of 00007FFD36FD0000
    POW pow = (POW)GetProcAddress(dllBase, "pow");
    printf("%f", pow(2.0,3.0));

}

我正在搜索我做错了什么但找不到。

也许我没有为此获得正确的 dllbase,在错误的表中,或者 PVOID 需要更大的转换才能成为 HMODULE,但我不认为是这样。

谢谢。

c windows winapi
© www.soinside.com 2019 - 2024. All rights reserved.