_DISPATCHER_HEADER結構中的WaitListHead和_KWAIT_BLOCK的關系


第一部分:

//
// Wait block
//
// begin_ntddk begin_wdm begin_nthal begin_ntifs begin_ntosp

typedef struct _KWAIT_BLOCK {
??? LIST_ENTRY WaitListEntry;
??? struct _KTHREAD *RESTRICTED_POINTER Thread;
??? PVOID Object;
??? struct _KWAIT_BLOCK *RESTRICTED_POINTER NextWaitBlock;
??? USHORT WaitKey;
??? USHORT WaitType;
} KWAIT_BLOCK, *PKWAIT_BLOCK, *RESTRICTED_POINTER PRKWAIT_BLOCK;

??????? WaitBlock = CONTAINING_RECORD(Event->Header.WaitListHead.Flink,
????????????????????????????????????? KWAIT_BLOCK,
????????????????????????????????????? WaitListEntry);

第二部分:等待塊0x8976d648對應的線程0x8976d5a8第一個等待,等待塊0x89124e40對應的線程0x89124da0第二個等待。
1: kd> dt kevent? 8984ed18
CSRSRV!KEVENT
?? +0x000 Header?????????? : _DISPATCHER_HEADER
1: kd> dx -id 0,0,89838358 -r1 (*((CSRSRV!_DISPATCHER_HEADER *)0x8984ed18))
(*((CSRSRV!_DISPATCHER_HEADER *)0x8984ed18))???????????????? [Type: _DISPATCHER_HEADER]
??? [+0x000] Type???????????? : 0x1 [Type: unsigned char]
??? [+0x001] Absolute???????? : 0x0 [Type: unsigned char]
??? [+0x002] Size???????????? : 0x4 [Type: unsigned char]
??? [+0x003] Inserted???????? : 0x0 [Type: unsigned char]
??? [+0x003] DebugActive????? : 0x0 [Type: unsigned char]
??? [+0x000] Lock???????????? : 262145 [Type: long]
??? [+0x004] SignalState????? : 0 [Type: long]
??? [+0x008] WaitListHead???? [Type: _LIST_ENTRY]
1: kd> dx -id 0,0,89838358 -r1 (*((CSRSRV!_LIST_ENTRY *)0x8984ed20))
(*((CSRSRV!_LIST_ENTRY *)0x8984ed20))???????????????? [Type: _LIST_ENTRY]
??? [+0x000] Flink??????????? : 0x8976d648 [Type: _LIST_ENTRY *]
??? [+0x004] Blink??????????? : 0x89124e40 [Type: _LIST_ENTRY *]
1: kd> dx -id 0,0,89838358 -r1 ((CSRSRV!_LIST_ENTRY *)0x8976d648)
((CSRSRV!_LIST_ENTRY *)0x8976d648)???????????????? : 0x8976d648 [Type: _LIST_ENTRY *]
??? [+0x000] Flink??????????? : 0x89124e40 [Type: _LIST_ENTRY *]
??? [+0x004] Blink??????????? : 0x8984ed20 [Type: _LIST_ENTRY *]
1: kd> dx -id 0,0,89838358 -r1 ((CSRSRV!_LIST_ENTRY *)0x89124e40)
((CSRSRV!_LIST_ENTRY *)0x89124e40)???????????????? : 0x89124e40 [Type: _LIST_ENTRY *]
??? [+0x000] Flink??????????? : 0x8984ed20 [Type: _LIST_ENTRY *]
??? [+0x004] Blink??????????? : 0x8976d648 [Type: _LIST_ENTRY *]


第三部分:
1: kd> dt KWAIT_BLOCK 0x8976d648?? ??? ??? ??? ??? ??? ??? ?//Flink??????????? : 0x8976d648
CSRSRV!KWAIT_BLOCK
?? +0x000 WaitListEntry??? : _LIST_ENTRY [ 0x89124e40 - 0x8984ed20 ]
?? +0x008 Thread?????????? : 0x8976d5a8 _KTHREAD
?? +0x00c Object?????????? : 0x8984ed18 Void
?? +0x010 NextWaitBlock??? : 0x8976d648 _KWAIT_BLOCK
?? +0x014 WaitKey????????? : 0
?? +0x016 WaitType???????? : 1
1: kd> dx -id 0,0,89838358 -r1 ((CSRSRV!_KTHREAD *)0x8976d5a8)
((CSRSRV!_KTHREAD *)0x8976d5a8)???????????????? : 0x8976d5a8 [Type: _KTHREAD *]
??? [+0x000] Header?????????? [Type: _DISPATCHER_HEADER]
??? [+0x010] MutantListHead?? [Type: _LIST_ENTRY]
??? [+0x018] InitialStack???? : 0xba247000 [Type: void *]
??? [+0x01c] StackLimit?????? : 0xba244000 [Type: void *]
??? [+0x020] KernelStack????? : 0xba246c5c [Type: void *]
??? [+0x024] ThreadLock?????? : 0x0 [Type: unsigned long]
??? [+0x028] ContextSwitches? : 0x1 [Type: unsigned long]
??? [+0x02c] State??????????? : 0x5 [Type: unsigned char]
??? [+0x02d] NpxState???????? : 0xa [Type: unsigned char]
??? [+0x02e] WaitIrql???????? : 0x0 [Type: unsigned char]
??? [+0x02f] WaitMode???????? : 1 [Type: char]
??? [+0x030] Teb????????????? : 0x7ff98000 [Type: void *]
??? [+0x034] ApcState???????? [Type: _KAPC_STATE]
??? [+0x04c] ApcQueueLock???? : 0x0 [Type: unsigned long]
??? [+0x050] WaitStatus?????? : 0 [Type: long]
??? [+0x054] WaitBlockList??? : 0x8976d648 [Type: _KWAIT_BLOCK *]
? ?
1: kd> dt KWAIT_BLOCK? 0x89124e40
CSRSRV!KWAIT_BLOCK
?? +0x000 WaitListEntry??? : _LIST_ENTRY [ 0x8984ed20 - 0x8976d648 ]
?? +0x008 Thread?????????? : 0x89124da0 _KTHREAD
?? +0x00c Object?????????? : 0x8984ed18 Void
?? +0x010 NextWaitBlock??? : 0x89124e40 _KWAIT_BLOCK
?? +0x014 WaitKey????????? : 0
?? +0x016 WaitType???????? : 1
1: kd> dx -id 0,0,89838358 -r1 ((CSRSRV!_KTHREAD *)0x89124da0)
((CSRSRV!_KTHREAD *)0x89124da0)???????????????? : 0x89124da0 [Type: _KTHREAD *]
??? [+0x000] Header?????????? [Type: _DISPATCHER_HEADER]
??? [+0x010] MutantListHead?? [Type: _LIST_ENTRY]
??? [+0x018] InitialStack???? : 0xba2b7000 [Type: void *]
??? [+0x01c] StackLimit?????? : 0xba2b3000 [Type: void *]
??? [+0x020] KernelStack????? : 0xba2b681c [Type: void *]
??? [+0x024] ThreadLock?????? : 0x0 [Type: unsigned long]
??? [+0x028] ContextSwitches? : 0x4 [Type: unsigned long]
??? [+0x02c] State??????????? : 0x5 [Type: unsigned char]
??? [+0x02d] NpxState???????? : 0xa [Type: unsigned char]
??? [+0x02e] WaitIrql???????? : 0x0 [Type: unsigned char]
??? [+0x02f] WaitMode???????? : 1 [Type: char]
??? [+0x030] Teb????????????? : 0x7ff9a000 [Type: void *]
??? [+0x034] ApcState???????? [Type: _KAPC_STATE]
??? [+0x04c] ApcQueueLock???? : 0x0 [Type: unsigned long]
??? [+0x050] WaitStatus?????? : 0 [Type: long]
??? [+0x054] WaitBlockList??? : 0x89124e40 [Type: _KWAIT_BLOCK *]
? ?

第四部分:

LONG
KeSetEvent (
??? IN PRKEVENT Event,
??? IN KPRIORITY Increment,
??? IN BOOLEAN Wait
??? )

{

??? KIRQL OldIrql;
??? LONG OldState;
??? PRKTHREAD Thread;

??? ASSERT_EVENT(Event);
??? ASSERT(KeGetCurrentIrql() <= DISPATCH_LEVEL);

??? //
??? // Collect call data.
??? //

#if defined(_COLLECT_SET_EVENT_CALLDATA_)

??? RECORD_CALL_DATA(&KiSetEventCallData);

#endif

??? //
??? // Raise IRQL to dispatcher level and lock dispatcher database.
??? //

??? KiLockDispatcherDatabase(&OldIrql);

??? //
??? // Capture the old state and set the new state to signaled.
??? //
??? // If the old state is not-signaled and the wait list is not empty,
??? // then satisfy as many waits as possible.
??? //

??? OldState = Event->Header.SignalState;
??? Event->Header.SignalState = 1;
??? if ((OldState == 0) &&
??????? (IsListEmpty(&Event->Header.WaitListHead) == FALSE)) {

??????? if (Event->Header.Type == EventNotificationObject) {
??????????? KiWaitTestWithoutSideEffects(Event, Increment);


第五部分:

FORCEINLINE
VOID
KiWaitTestWithoutSideEffects (
??? IN PVOID Object,
??? IN KPRIORITY Increment
??? )
{

??? PKEVENT Event = Object;
??? PLIST_ENTRY ListHead;
??? PRKTHREAD Thread;
??? PRKWAIT_BLOCK WaitBlock;
??? PLIST_ENTRY WaitEntry;

??? //
??? // Empty the entire list of waiters since the specified object has
??? // no side effects when a wait is satisfied.
??? //

??? ListHead = &Event->Header.WaitListHead;

??? ASSERT(IsListEmpty(&Event->Header.WaitListHead) == FALSE);

??? WaitEntry = ListHead->Flink;
??? do {

??????? //
??????? // Get the address of the wait block and the thread doing the wait.
??????? //

??????? WaitBlock = CONTAINING_RECORD(WaitEntry, KWAIT_BLOCK, WaitListEntry);
??????? Thread = WaitBlock->Thread;

??????? //
??????? // If the wait type is wait any, then unwait the thread with the
??????? // wait key status. Otherwise, unwait the thread with a kernel APC
??????? // status.
??????? //

??????? if (WaitBlock->WaitType == WaitAny) {
??????????? KiUnwaitThread(Thread, (NTSTATUS)WaitBlock->WaitKey, Increment);

??????? } else {
??????????? KiUnwaitThread(Thread, STATUS_KERNEL_APC, Increment);
??????? }

??????? WaitEntry = ListHead->Flink;//激活第一個線程后,第一個等待塊會脫鏈!!
??? } while (WaitEntry != ListHead);

??? return;
}

第六部分:

例子1:只有一個等待線程
1: kd> g
Breakpoint 22 hit
nt!KeSetEvent:
80a34206 55????????????? push??? ebp
0: kd> dv
????????? Event = 0xf78ce2f8
????? Increment = 0n0
?????????? Wait = 0x00 ''
?????? OldState = 0n8
??????? OldIrql = 0xf7 ''
0: kd> dx -r1 ((ntkrnlmp!_KEVENT *)0xf78ce2f8)
((ntkrnlmp!_KEVENT *)0xf78ce2f8)???????????????? : 0xf78ce2f8 [Type: _KEVENT *]
??? [+0x000] Header?????????? [Type: _DISPATCHER_HEADER]
0: kd> dx -r1 (*((ntkrnlmp!_DISPATCHER_HEADER *)0xf78ce2f8))
(*((ntkrnlmp!_DISPATCHER_HEADER *)0xf78ce2f8))???????????????? [Type: _DISPATCHER_HEADER]
??? [+0x000] Type???????????? : 0x0 [Type: unsigned char]
??? [+0x001] Absolute???????? : 0x0 [Type: unsigned char]
??? [+0x002] Size???????????? : 0x4 [Type: unsigned char]
??? [+0x003] Inserted???????? : 0x0 [Type: unsigned char]
??? [+0x003] DebugActive????? : 0x0 [Type: unsigned char]
??? [+0x000] Lock???????????? : 262144 [Type: long]
??? [+0x004] SignalState????? : 0 [Type: long]
??? [+0x008] WaitListHead???? [Type: _LIST_ENTRY]
0: kd> dx -r1 (*((ntkrnlmp!_LIST_ENTRY *)0xf78ce300))
(*((ntkrnlmp!_LIST_ENTRY *)0xf78ce300))???????????????? [Type: _LIST_ENTRY]
??? [+0x000] Flink??????????? : 0x8999e6c0 [Type: _LIST_ENTRY *]
??? [+0x004] Blink??????????? : 0x8999e6c0 [Type: _LIST_ENTRY *]

0: kd> g
Breakpoint 33 hit
nt!KiUnwaitThread:
80a402c6 55????????????? push??? ebp

0: kd> g
Breakpoint 32 hit
nt!KiReadyThread:
80a42c6c 8b4144????????? mov???? eax,dword ptr [ecx+44h]
?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/73302.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/73302.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/73302.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

flutter 自定義控件RenderObjectWidget使用

CustomWidget的自定義組件的注釋還是比較清晰的 參考文檔Flutter實戰 import package:flutter/cupertino.dart; import package:flutter/gestures.dart; import package:flutter/material.dart; /* * 如果組件不會包含子組件&#xff0c;則我們可以直接繼承自 LeafRenderObject…

機器視覺場景應用中,有沒有超景深的工業鏡頭

在機器視覺領域,確實存在具有超景深特性的工業鏡頭,這類鏡頭通過特殊的光學設計或技術手段,能夠顯著擴大清晰成像的縱向范圍,從而滿足復雜檢測場景中對多平面物體清晰成像的需求。以下是相關技術要點及典型鏡頭類型: 1. 遠心鏡頭 遠心鏡頭是超景深鏡頭的典型代表,其特點包…

【Linux】同步原理剖析及模擬BlockQueue生產消費模型

&#x1f4e2;博客主頁&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;博客倉庫&#xff1a;https://gitee.com/JohnKingW/linux_test/tree/master/lesson &#x1f4e2;歡迎點贊 &#x1f44d; 收藏 ?留言 &#x1f4dd; 如有錯誤敬請指正&#xff01; &…

光流 | 基于KLT算法的人臉檢測與跟蹤原理及公式,算法改進,matlab代碼

===================================================== github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ===================================================== 人臉檢測與跟蹤 一、KLT算法原理與分析1. 核心思想2. 數學模型二、人臉…

<數據集>軌道異物識別數據集<目標檢測>

數據集下載鏈接&#xff1a;https://download.csdn.net/download/qq_53332949/90527370 數據集格式&#xff1a;VOCYOLO格式 圖片數量&#xff1a;1659張 標注數量(xml文件個數)&#xff1a;1659 標注數量(txt文件個數)&#xff1a;1659 標注類別數&#xff1a;6 標注類別…

LabVIEW液壓振動錘控制系統

在現代工程機械領域&#xff0c;液壓振動錘的高效與精準控制日益顯得重要。本文通過LabVIEW軟件&#xff0c;展開液壓振動錘啟停共振控制技術的研究與應用&#xff0c;探討如何通過改進控制系統來優化液壓振動錘的工作性能&#xff0c;確保其在復雜工況下的穩定性與效率。 ? …

【開源寶藏】30天學會CSS - DAY7 第七課 CSS 關鍵幀打造Preloader 追逐動畫

你的代碼實現了一個 方形軌跡預加載動畫&#xff08;Preloader Animation&#xff09;&#xff0c;其中三個 span 元素沿著一個 22 網格 軌跡循環移動。現在&#xff0c;我們將 拆解核心實現步驟&#xff0c;讓你能一步步理解并調整動畫效果。 第 0 步&#xff1a;項目概覽 你…

在shell腳本內部獲取該腳本所在目錄的絕對路徑

目錄 需求描述 方法一&#xff1a;使用 dirname 和 readlink 命令 方法二&#xff1a;使用 BASH_SOURCE 變量 方法三&#xff1a;僅使用純 Bash 實現 需求描述 工作中經常有這樣情況&#xff0c;需要在腳本內部獲取該腳本自己所在目錄的絕對路徑。 假如有一個腳本/a/b/c/…

常考計算機操作系統面試習題(一下)

目錄 操作系統基本類型 操作系統的功能 操作系統的主要任務 進程與線程 進程狀態轉變 內存管理 文件系統與文件管理 虛擬存儲器 設備管理 磁盤調度 死鎖 信號量機制 文件打開與管理 進程與線程的互斥與同步 進程同步 進程調度 文件分配磁盤塊的方法 程序執行…

GPT-SoVITS本地部署:低成本實現語音克隆遠程生成音頻全流程實戰

文章目錄 前言1.GPT-SoVITS V2下載2.本地運行GPT-SoVITS V23.簡單使用演示4.安裝內網穿透工具4.1 創建遠程連接公網地址 5. 固定遠程訪問公網地址 前言 今天要給大家安利一個絕對能讓你大呼過癮的聲音黑科技——GPT-SoVITS&#xff01;這款由花兒不哭大佬精心打造的語音克隆神…

JVM(基礎篇)

一.初識JVM 1.什么是JVM JVM全稱Java Virtyal Machine&#xff0c;中文譯名 Java虛擬機 。JVM本質上是一個運行在計算機上的程序&#xff0c;他的職責是運行Java字節碼文件(將字節碼解釋成機器碼)。 2.JVM的功能 解釋和運行&#xff1a;對字節碼文件中的指令號&#xff0c;實時…

【高并發內存池】第四彈---深入理解PageCache:整體設計、核心實現及Span獲取策略詳解

?個人主頁&#xff1a; 熬夜學編程的小林 &#x1f497;系列專欄&#xff1a; 【C語言詳解】 【數據結構詳解】【C詳解】【Linux系統編程】【Linux網絡編程】【項目詳解】 目錄 1、pagecache 1.1、整體設計 1.2、核心實現 1.3、獲取Span 1.3.1、獲取一個非空的Span 1.3…

深入理解C語言數據結構之快速排序三路劃分

在數據結構和算法的世界里&#xff0c;排序算法是基石一般的存在。快速排序作為一種高效的排序算法&#xff0c;以其平均情況下的優秀時間復雜度而被廣泛應用。今天&#xff0c;讓我們深入探討快速排序的一種變體——三路劃分的快速排序&#xff0c;看看它是如何在C語言中施展魔…

Java實現后量子密碼(PQC)與國密算法(SM4)混合加密

以下是使用Java實現一種后量子密碼(PQC)與國密算法(SM4)混合加密的示例方案。該方案結合了后量子密碼的抗量子特性與國密算法的國產化合規要求,適合需要雙重安全保障的場景。 一 . 方案驗證 1.代碼截圖 2.運行測試 二 . 方案設計 密鑰交換:使用后量子密碼(如Kyber)生…

【SQL Server數據庫備份詳細教程】

&#x1f3a5;博主&#xff1a;程序員不想YY啊 &#x1f4ab;CSDN優質創作者&#xff0c;CSDN實力新星&#xff0c;CSDN博客專家 &#x1f917;點贊&#x1f388;收藏?再看&#x1f4ab;養成習慣 ?希望本文對您有所裨益&#xff0c;如有不足之處&#xff0c;歡迎在評論區提出…

SpringBoot古典舞在線交流平臺設計與實現

隨著古典舞文化的普及&#xff0c;越來越多的人希望通過線上平臺交流學習。幽絡源作為一站式綜合平臺&#xff0c;致力于為用戶提供免費源碼、技術教程及網絡兼職資源。本文將詳細介紹基于SpringBoot的古典舞在線交流平臺的設計與實現&#xff0c;幫助開發者快速搭建一個功能完…

關于絕對時間、人類時間、本地時間、時區時間的對比分析,結合編程場景(如Java)進行說明

以下是關于絕對時間、人類時間、本地時間、時區時間的對比分析&#xff0c;結合編程場景&#xff08;如Java&#xff09;進行說明&#xff1a; 1. 定義與核心區別 (1) 絕對時間&#xff08;Absolute Time&#xff09; 定義&#xff1a;不受時區影響&#xff0c;以固定時間起點…

go語言中的strings庫

strings庫 func EqualFold func EqualFold(s, t string) bool判斷兩個utf-8編碼字符串&#xff08;將unicode大寫、小寫、標題三種格式字符視為相同&#xff09;是否相同。 func main() {fmt.Println(strings.EqualFold("hello", "hello")) //truefmt.…

Git沖突解決

目錄 一、Git沖突產生的原因二、解決Git沖突的步驟1. 發現沖突2. 查看沖突文件3. 手動解決沖突4. 提交解決后的代碼5. 完成合并 三、預防Git沖突的小技巧四、總結 在團隊協作開發中&#xff0c;Git沖突是常見的問題。當多個開發者同時修改了同一個文件的不同部分&#xff0c;然…

Spring AOP + RocketMQ 實現企業級操作日志異步采集(實戰全流程)

Spring AOP + RocketMQ 實現企業級操作日志異步采集(實戰全流程) ?? 項目背景 在企業級微服務架構中,記錄操作日志是一項剛需。傳統方式常使用數據庫直接寫入或通過 Feign 調用日志微服務,但這樣存在耦合高、主流程阻塞、擴展性差等問題。 為此,我們將使用: Spring …