Windows APC学习笔记(二)—— 挂入过程执行过程
生活随笔
收集整理的這篇文章主要介紹了
Windows APC学习笔记(二)—— 挂入过程执行过程
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Windows APC學習筆記(二)—— 掛入過程&執行過程
- 基礎知識
- 掛入過程
- KeInitializeApc
- ApcStateIndex
- KiInsertQueueApc
- Alertable
- 執行過程
- 內核APC執行過程
- 執行點:線程切換
- SwapContext
- KiServiceExit
- KiDeliverApc
- 總結
- 用戶APC執行過程
- 執行用戶APC時的堆棧操作
- KiDeliverApc
- KiInitializeUserApc函數分析:備份CONTEXT
- ntdll.KiUserApcDispatcher
- 總結
基礎知識
掛入過程
KeInitializeApc
描述:這個函數只做了一件事,那就是給當前KAPC結構體賦值,KAPC結構體的空間在NtQueueApcThread中分配
VOID KeInitializeApc (IN PKAPC Apc, //KAPC指針IN PKTHREAD Thread, //目標線程IN KAPC_ENVIRONMENT TargetEnvironment, //0 1 2 3四種狀態IN PKKERNEL_ROUTINE KernelRoutine, //銷毀KAPC的函數地址IN PKRUNDOWN_ROUTINE RundownRoutine OPTIONAL,IN PKNORMAL_ROUTINE NormalRoutine, //用戶APC總入口或者內核apc函數IN KPROCESSOR_MODE Mode, //要插入用戶apc隊列還是內核apc隊列IN PVOID Context //內核APC:NULL 用戶APC:真正的APC函數 )ApcStateIndex
ApcStateIndex 有四個值:
0:原始環境; 1:掛靠環境 2:當前環境 3:插入APC時的當前環境
正常情況下:ApcStatePointer[0] 指向 ApcState;ApcStatePointer[1] 指向 SavedApcState
掛靠情況下:ApcStatePointer[0] 指向 SavedApcState;ApcStatePointer[1] 指向 ApcState
KiInsertQueueApc
步驟:
Alertable
描述:
kd> dt _KTHREAD
ntdll!_KTHREAD
…
+0x164 Alertable : UChar
…
可通過以下兩個函數手動設置Alertable:
DWORD SleepEx(DWORD dwMilliseconds, // time-out intervalBOOL bAlertable // early completion option ); DWORD WaitForSingleObjectEx(HANDLE hHandle, // handle to objectDWORD dwMilliseconds, // time-out intervalBOOL bAlertable // alertable option );執行過程
描述:
在A線程中向B線程插入一個APC,插入的動作是在A線程中完成的,但什么時候執行則由B線程決定!,所以叫“異步過程調用”
內核APC執行過程
執行點:線程切換
SwapContext
返回前:
返回后:
KiServiceExit
KiDeliverApc
執行過程:
反匯編:
總結
執行點二:R0返回到R3時
用戶APC執行過程
執行用戶APC時的堆棧操作
處理用戶APC要比內核APC復雜的多,因為,用戶APC函數要在用戶空間執行的,這里涉及到大量換棧的操作:
內核–>用戶空間–>再回到內核空間
KiDeliverApc
執行過程:
反匯編:
KiInitializeUserApc函數分析:備份CONTEXT
描述:
將原來 _Trap_Frame 的值備份到一個新的結構體中(CONTEXT),這個功能由其子函數KeContextFromKframes來完成
反匯編:
一、備份CONTEXT
二、備份局部變量
三、準備用戶層需要的環境
ntdll.KiUserApcDispatcher
描述:
NormalRoutine,這個參數是在QueueUserAPC內部指定的:Kernel.BaseDispatchAPC
ZwContinue后面的代碼不會執行,線程從哪里進0環仍然會從哪里回去
反匯編:
總結
總結
以上是生活随笔為你收集整理的Windows APC学习笔记(二)—— 挂入过程执行过程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows APC学习笔记(一)——
- 下一篇: Windows事件等待学习笔记(一)——