您的位置:首页 > 其它

ldrFile支持(PE ELF EX STUFF等各种格式支持)

2013-10-30 16:57 162 查看
\src\VBox\Runtime\common\ldr\ldrFile.cpp

装载

RTLdrOpen(const char *pszFilename, uint32_t fFlags, RTLDRARCH enmArch, PRTLDRMOD phLdrMod)

A)创建

PRTLDRREADER pReader;

int rc = rtldrFileCreate(&pReader, pszFilename);

B)

rc = rtldrOpenWithReader(pReader, fFlags, enmArch, phLdrMod);

PE格式文件

\src\VBox\Runtime\common\ldr\ldrPE.cpp



文件IO

为装载模块,先通过file io将模块打开.

\src\VBox\Runtime\r3\win\fileio-win.cpp

\src\VBox\Runtime\r3\win\fileaio-win.cpp

一个阻塞,一个异步

A) 打开文件

size_t cchFilename = strlen(pszFilename);

int rc = VERR_NO_MEMORY;

PRTLDRREADERFILE pFileReader = (PRTLDRREADERFILE)RTMemAlloc(sizeof(*pFileReader) + cchFilename);

if (pFileReader)

{

memcpy(pFileReader->szFilename, pszFilename, cchFilename + 1);

rc = RTFileOpen(&pFileReader->File, pszFilename, RTFILE_O_READ | RTFILE_O_OPEN | RTFILE_O_DENY_WRITE);

....

B) 文件大小

rc = RTFileGetSize(pFileReader->File, (uint64_t *)&pFileReader->cbFile);



C) 设置pFileReader

pFileReader->Core.pfnRead = rtldrFileRead;

pFileReader->Core.pfnTell = rtldrFileTell;

pFileReader->Core.pfnSize = rtldrFileSize;

pFileReader->Core.pfnLogName = rtldrFileLogName;

pFileReader->Core.pfnMap = rtldrFileMap;

pFileReader->Core.pfnUnmap = rtldrFileUnmap;

pFileReader->Core.pfnDestroy = rtldrFileDestroy;

pFileReader->off = 0;

pFileReader->cMappings = 0;

pFileReader->pvMapping = NULL;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: