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;
}