2014-05-23 49 views
1

我使用VS2013以下编译器选项:Visual Studio 2013/GH/Gh _penter/_pexit 64bit如何保存寄存器?

/高华(启用_penter钩子函数)

http://msdn.microsoft.com/en-us/library/c63a9b7h.aspx

/GH(启用_pexit钩子函数) http://msdn.microsoft.com/en-us/library/xc11y76y.aspx

正如我试图为我的代码实现一些基本的分析。然而,随着64位编译它不可能使用裸属性:

http://msdn.microsoft.com/en-us/library/h5w10wxs.aspx

我不认为这是一个真正的问题,但什么是问题是,我不能找到一种方法在此编译器中不支持内联汇编的寄存器。所以如果改变任何寄存器,那么它们的值就会被丢弃。例如:

; int __cdecl DllMain(void *hModule, unsigned int ulReason, _CONTEXT *pContext) 
push rbx 
sub  rsp, 20h 
call _penter 

在这里,我们必须确保_penter不会垃圾RSP的值:

; int __cdecl penter(LARGE_INTEGER PerformanceCount) 
PerformanceCount= LARGE_INTEGER ptr 8 

sub  rsp, 28h 
xor  eax, eax 
lea  rcx, [rsp+28h+PerformanceCount] ; lpPerformanceCount 
mov  qword ptr [rsp+28h+PerformanceCount], rax 
call cs:__imp_QueryPerformanceCounter 
add  rsp, 28h 
retn 
_penter endp 

在这种情况下,其作为_penter确定被固定了RSP - 但是EAX的价值观和rcx正在被覆盖。在x86编译器中,我可以简单地添加内联asm来推送和弹出这些寄存器。我如何在x64编译器中执行此操作?

+1

不是说你不能继续前进,编写自己的概要,但Visual Studio中附带了一个采样和检测仪器基于探查 –

+0

我剖析绕道win32 API函数,VS分析器会从结果中删除这些 - 所以我最终什么都没有。 – paulm

回答

1

因为Visual Studio不支持x64中的内联汇编代码,所以您必须将assmebly编码移动到.asm文件中。