2015-01-26 99 views
1

我在使用virtualalloc时有一些奇怪的行为。我在C++,Visual Studio 2010中VirtualAlloc的顺序似乎很重要(C++)

我有两件事情我想分配,和我使用的VirtualAlloc(我有我的理由,无关的问题)

1 - 空间举行的x86汇编代码缓冲
2 - 空间来保存的x86代码要

在我的代码中的数据结构我做:

thread_data_t * p_data = (thread_data_t*)VirtualAlloc(NULL, sizeof(thread_data_t), MEM_COMMIT, PAGE_READWRITE); 
//set up all the values in the structure 
unsigned char* p_function = (unsigned char*)VirtualAlloc(NULL, sizeof(buffer), MEM_COMMIT, PAGE_EXECUTE_READWRITE); 
memcpy(p_function, buffer, sizeof(buffer)); 
CreateThread(0, (LPTHREAD_START_ROUTINE)p_function, p_data, 0, NULL); 
在调试模式

:做工精细
在RELEASE模式下:启动线程接收一个空作为其输入数据。通过调试进行验证,当我调用createThread时,指针正确

如果我切换VirtualAlloc的周围,以便在数据空间之前分配函数空间,那么DEBUG和RELEASE模式都可以正常工作。

任何想法为什么?我已验证我的所有VS版本设置在DEBUG/RELEASE之间是相同的

回答

4

将汇编代码复制到内存缓冲区后,不能直接跳到该缓冲区。你需要刷新CPU缓存等,否则它将无法工作。您可以使用FlushInstructionCache来执行此操作。

https://msdn.microsoft.com/en-us/library/windows/desktop/ms679350%28v=vs.85%29.aspx

很难说究竟为什么重新排序的拨款会解决这个问题,但如果你复制的指令到他们的缓冲区,然后跳进缓冲区之前做了很多工作,这将有可能提高“逃避它”的几率,因为CPU缓存会有更多机会被其他方式刷新。

+0

顺便说一句我把我的链接换成了更好的参考。旧的链接更多的是关于检测案件而不是解决案件。 – StilesCrisis 2015-01-26 21:27:19

+0

你是否也可以放回你的另一个链接?所以我可以阅读有关检测并解决它?谢谢 ! – 2015-01-26 21:35:26

+0

同样在阅读链接时,我看到“在x86或x64 CPU架构上不需要FlushInstructionCache,因为它们具有透明缓存。” – 2015-01-26 21:36:11