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;
装载
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;
相关文章推荐
- platform_driver_register()与platform_device_register()
- C++的价值
- csharp:存儲過程輸出參數,和返回值
- Spring JPA 不使用persistence.xml
- uva 11437 - Triangle Fun
- MFC六大关键技术之初始化过程
- Linux程序编译速度提高方法
- Android Repo的manifest XML文件格式
- 将博客搬至CSDN
- 二叉树的遍历!
- Oracle 数据库监听配置
- java文件读写操作大全
- C&C++图形图像处理开源库
- Photoshop CS6常用快捷键
- windows cmake 编译opencv 出错
- 【会议记录】第四次例会(10.26)记录
- Csharp:操作存儲過程輸出參數,和返回值
- 帝国后台看不见模板内容解决方法
- 问题—抱怨?人品差?别搞笑了!
- 理解warden-基本概念及如何做资源隔离限制