Windows 7上的动态负载失败

时间:2009-12-21 20:51:42

标签: c windows-7

正如我之前提到的一个问题,我在我的代码中使用模拟GetProcAddress()。以下代码成功执行此操作,但它会导致应用程序在Windows 7上崩溃

void *GetFuncAddr(HMODULE hModule, char *fname) 
{
    unsigned int count = 1;
    IMAGE_DOS_HEADER *DosHeader;
    IMAGE_NT_HEADERS *NtHeaders;
    IMAGE_OPTIONAL_HEADER *OptionalHeader;
    IMAGE_DATA_DIRECTORY *DataDirectory;
    IMAGE_EXPORT_DIRECTORY *Exp;
    ULONG *addrof;
    char *fullfname;
    ULONG *faddr;

    DosHeader = (IMAGE_DOS_HEADER *)hModule; 
    if (DosHeader->e_magic != IMAGE_DOS_SIGNATURE) 
    { 
        return NULL;
    } 

    NtHeaders = (IMAGE_NT_HEADERS *)(((BYTE *)DosHeader) + DosHeader->e_lfanew); 
    if (NtHeaders->Signature != IMAGE_NT_SIGNATURE)
    { 
        return NULL;
    } 

    OptionalHeader = &NtHeaders->OptionalHeader; 
    DataDirectory = &OptionalHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT]; 

    Exp = (IMAGE_EXPORT_DIRECTORY *)((size_t)DosHeader + DataDirectory->VirtualAddress); 

    addrof = (ULONG *)((BYTE*) hModule + Exp->addrof);
    faddr = (ULONG*) ((BYTE*) hModule + Exp->AddressOfFunctions);

    for(count = 0; count < Exp->NumberOfNames; count++)
    {
        fullfname = (char*)((BYTE*) hModule + addrof[count]);       
        if(strcmp(fullfname, fname) == 0)
        {   
            return (void*)((BYTE*) hModule + faddr[count]);
        }
    }

    return NULL;
}   

使用此应用程序崩溃尝试加载的功能无关紧要。调用导入的函数时会发生崩溃,因此我的猜测是返回的指针可能是令人讨厌的事情。这在x86和x64上都会发生。 这段代码中是否有明显的原因?

我尝试将函数设置为返回FARPROC,但我对如何转换返回((BYTE *)hModule + faddr [count])感到困惑;

无论如何,有什么想法吗?解决方案? 任何帮助表示赞赏。

感谢。杰斯。

编辑我导入的某些API返回的错误是错误18,参数不正确。

3 个答案:

答案 0 :(得分:4)

我认为您可能需要进行额外的查找。

USHORT *ford;
...
ford = (USHORT*) ((BYTE*) hModule + Exp->AddressOfNameOrdinals);

然后由序数偏移:

            return (void*)((BYTE*) hModule + faddr[ford[count]]);

本文讨论了一些问题:http://msdn.microsoft.com/en-us/magazine/cc301808.aspx

答案 1 :(得分:1)

看起来您正在假设表中的Ordinal#= offset。也许在Windows 7 DLL中不是这样。

答案 2 :(得分:0)

如何创建句柄hModule?为什么不使用GetProcAddress(你的函数似乎复制了函数的行为)?