我使用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編譯器中執行此操作?
不是說你不能繼續前進,編寫自己的概要,但Visual Studio中附帶了一個採樣和檢測儀器基於探查 –
我剖析繞道win32 API函數,VS分析器會從結果中刪除這些 - 所以我最終什麼都沒有。 – paulm