\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;
模块加载流程解析
本文详细介绍了模块加载过程,包括创建读取器、打开文件、获取文件大小及设置读取器等关键步骤,并展示了如何通过文件I/O操作进行模块加载。

被折叠的 条评论
为什么被折叠?



