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