2014-05-23 80 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文件中。