[英]How can I measure CPU time in C++ on windows and include calls of system()?
[英]Can I access Windows Kernel system calls directly?
我一直在研究Windows內部,最近才了解系統調用,我想知道是否可以像功能一樣使用這些系統調用? 我了解它們並不是真的可以從外部訪問。
例如: NtUserEmptyClipboard
是Win32k.sys中的系統調用,其地址為0x117f
如果我想像函數一樣使用此調用,該怎么辦?
您想要做的事情在很大程度上取決於您感興趣的體系結構,但要知道的是, ntdll.dll
是每個系統調用的用戶模式蹦床-即,只有一天結束時才真正進行系統調用的人是ntdll。
因此,通過打開任何舊exe(我選擇了記事本),讓我們在WinDbg中拆卸其中一種方法。 首先,使用x ntdll!*
查找ntdll導出的符號:
0:000> x ntdll!*
00007ff9`ed1aec20 ntdll!RtlpMuiRegCreateLanguageList (void)
00007ff9`ed1cf194 ntdll!EtwDeliverDataBlock (void)
00007ff9`ed20fed0 ntdll!shortsort_s (void)
00007ff9`ed22abbf ntdll!RtlUnicodeStringToOemString$fin$0 (void)
00007ff9`ed1e9af0 ntdll!LdrpAllocateDataTableEntry (void)
...
因此,讓我們隨機選擇一個, NtReadFile
看起來很NtReadFile
。 讓我們分解一下:
0:000> uf ntdll!NtReadFile
ntdll!NtReadFile:
00007ff9`ed21abe0 4c8bd1 mov r10,rcx
00007ff9`ed21abe3 b805000000 mov eax,5
00007ff9`ed21abe8 0f05 syscall
00007ff9`ed21abea c3 ret
在這里,我們看到我們rcx
了rcx
,將syscall編號放入eax
,然后調用syscall
指令。 每個系統調用都有一個由Windows任意分配的數字(即,該數字是ntdll和內核之間的秘密握手,並且會在Microsoft需要時更改)
這些指令都不是“魔術”的,您也可以直接在應用中執行它們(但是,出於實用的考慮,沒有實際的理由)
EmptyClipboard
是所謂的“Win32 API的”一個和NtUserEmptyClipboard
一個相應的“原生API”。
與Linux syscall(2)
,我們很少應該直接調用“本地API”。 我聽說它們位於ntdll.dll
而不是win32k.sys
。 但是我們應該能夠像在普通DLL中定義的普通函數一樣調用它們。
我強烈懷疑0x117f
是您要查找的地址 。 我懷疑這可能是您需要傳遞給GetProcAddress
。 但我不確定,因為這些問題在Windows版本之間有所不同(這就是為什么普通人改用文檔功能的原因)
本機API的主要部分是通過ntdll.dll中的常規功能導出的。 您可以將此dll加載到您的進程中,並像其他任何API函數一樣調用這些函數。 只要您具有正確的函數原型和參數,調用就可以正常工作。 他們在內部做的工作是從用戶模式轉換到內核模式,然后使用偏移量進入系統服務描述符表(SSDT),以在內核模式內存中查找函數的地址,然后調用該函數。 有一個開源項目http://nativetest.codeplex.com/ ,它可以調用您可能引用的本機api。
win32k.sys中的功能未在ntdll.dll中公開。 據我所知,它們沒有暴露在任何地方。 您列出的地址-我相信-實際上是SSDT的偏移量。 如果確實需要調用此函數,則必須自己進行從usermode到kernelmode的轉換,將函數的所有參數和SSDT偏移量放在正確的位置。
正如其他人所建議的那樣,我建議找到usermode API來幫助完成您想做的事情。 FWIW,根據鏈接/轉儲輸出,在user32.dll中,函數EmptyClipboard似乎直接轉發到NtUserEmptyClipboard。
1731 DF 0002018A EmptyClipboard = _NtUserEmptyClipboard@0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.