设为首页 加入收藏

TOP

Loader简介----2
2014-11-24 00:11:50 来源: 作者: 【 】 浏览:16
Tags:Loader 简介 ----2

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


摘自 云淡风轻

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇AT45DB041D存储驱动设计和页式存.. 下一篇C语言const指针使用技巧之――返..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: