Loader----1中将
内存分配放在了函数里面,这样大大降低了函数的可复用性,想想如果我们想在驱动层使用了,所以做如下修改,内存布局函数仅作功能性操作,和系统相关的内存分配放到函数外面吧。
[cpp]
/*
* 将文件内容按虚拟地址信息映射到地址空间
*/ 
BOOL LdrLayoutPe(char*pImage, D
word FileSize, char* pRealImageBase, D
word SizeOfImage) 
{ 
    PIMAGE_FILE_HEADER pFileHeader; 
    PIMAGE_SECTION_HEADER pSectionHeader; 
    char* pSrc; 
    char* pDst; 
    D
word CopySize; 
    D
word i; 
    if(!LdrValidateImage(pImage, FileSize)) 
        return FALSE; 
    pFileHeader = _GetFileHeaderFromPe(pImage); 
    pSectionHeader = _GetSectionHeaderFromPe(pFileHeader); 
    //拷贝文件头信息 
    pDst = pRealImageBase; 
    pSrc = pImage; 
    CopySize = (char*)pSectionHeader - pImage + pFileHeader->NumberOfSections*sizeof(PIMAGE_SECTION_HEADER); 
    if(pDst + CopySize >= pRealImageBase + SizeOfImage) 
        return FALSE; 
    RtlCopyMemory(pDst, pSrc, CopySize); 
    //拷贝节信息到内存 
    for(i = 0; i < pFileHeader->NumberOfSections; i++){ 
        if(!pSectionHeader.Po
interToRawData) 
            continue; 
        //判断目标指针的合法性 
        pDst = pRealImageBase + pSectionHeader.VirtualAddress; 
        pSrc = pImage + pSectionHeader.PointerToRawData; 
        CopySize = pSectionHeader.SizeOfRawData; 
        if(pDst + CopySize >= pRealImageBase + SizeOfImage) 
            return FALSE; 
        RtlCopyMemory(pDst, pSrc, CopySize); 
    } 
    return TRUE; 
}