Loader----1中將內存分配放在了函數裡面,這樣大大降低了函數的可復用性,想想如果我們想在驅動層使用了,所以做如下修改,內存布局函數僅作功能性操作,和系統相關的內存分配放到函數外面吧。
[cpp]
/*
* 將文件內容按虛擬地址信息映射到地址空間
*/
BOOL LdrLayoutPe(char*pImage, DWORD FileSize, char* pRealImageBase, DWORD SizeOfImage)
{
PIMAGE_FILE_HEADER pFileHeader;
PIMAGE_SECTION_HEADER pSectionHeader;
char* pSrc;
char* pDst;
DWORD CopySize;
DWORD 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[i].PointerToRawData)
continue;
//判斷目標指針的合法性
pDst = pRealImageBase + pSectionHeader[i].VirtualAddress;
pSrc = pImage + pSectionHeader[i].PointerToRawData;
CopySize = pSectionHeader[i].SizeOfRawData;
if(pDst + CopySize >= pRealImageBase + SizeOfImage)
return FALSE;
RtlCopyMemory(pDst, pSrc, CopySize);
}
return TRUE;
}
摘自 雲淡風輕