我写了一个简短的程序来读取Windows OBJ文件,查找.text节(section)并运行其中的代码。为此,我调用了以下Windows API函数(对于那些感兴趣的人,完整代码[gist.github.com]):
HANDLE FileHandle = CreateFile("lib.obj",
GENERIC_READ | GENERIC_EXECUTE,
FILE_SHARE_READ, 0,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
HANDLE MappingHandle = CreateFileMapping(FileHandle, 0, PAGE_EXECUTE_READ, 0, 0, 0);
void *Address = MapViewOfFile(MappingHandle, FILE_MAP_EXECUTE | FILE_MAP_READ,
0, 0, 0);
我在文件中找到了.text部分,并将指向代码的指针转换为C ++中的函数指针,然后简单地调用该函数。这实际上对我有用。
如果我没有在映射到文件的虚拟内存范围上调用FlushInstructonCache,我犯了错误吗?
我提出这个问题是因为最近我正在阅读VirtualAlloc文档,它在底部注明:
当创建可执行区域时,调用程序要通过使用适当的FlushInstructionCache调用来确保缓存一致性,一旦代码放置在正确位置。否则,尝试从新的可执行区域执行代码可能会产生不可预测的结果。
我的代码是否可能导致CPU在指令缓存中执行旧指令?
MapViewOfFile或CreateFileMapping页面上没有这样的说明。