nt!MiFlushSectionInternal函數分析從nt!IoSynchronousPageWrite函數到Ntfs!NtfsFsdWrite函數

第一部分:

??????????????? while (TRUE) {

??????????????????? KeClearEvent (&IoEvent);

??????????????????? Status = IoSynchronousPageWrite (FilePointer,
???????????????????????????????????????????????????? Mdl,
???????????????????????????????????????????????????? (PLARGE_INTEGER)&StartingOffset,
???????????????????????????????????????????????????? &IoEvent,
???????????????????????????????????????????????????? IoStatus);

1: kd> p
nt!MiFlushSectionInternal+0x6f6:
80a72410 e8c74bfbff????? call??? nt!IoSynchronousPageWrite (80a26fdc)
1: kd> t
Breakpoint 43 hit
nt!IoSynchronousPageWrite:
80a26fdc 55????????????? push??? ebp
1: kd> kc
?#
00 nt!IoSynchronousPageWrite
01 nt!MiFlushSectionInternal
02 nt!MmFlushSection
03 nt!CcFlushCache
04 Ntfs!LfsFlushLfcb
05 Ntfs!LfsFlushToLsnPriv
06 Ntfs!LfsWriteLfsRestart
07 Ntfs!LfsWriteRestartArea
08 Ntfs!NtfsCheckpointVolume
09 Ntfs!NtfsCheckpointAllVolumes
0a nt!ExpWorkerThread
0b nt!PspSystemThreadStartup
0c nt!KiThreadStartup
1: kd> dv
????????? FileObject = 0x89469688
MemoryDescriptorList = 0xf78d263c
????? StartingOffset = 0xf78d26bc {7884800}
?????????????? Event = 0xf78d26a0
?????? IoStatusBlock = 0xf78d2834


1: kd> dx -r1 ((ntkrnlmp!_MDL *)0xf78d263c)
((ntkrnlmp!_MDL *)0xf78d263c)???????????????? : 0xf78d263c [Type: _MDL *]
??? [+0x000] Next???????????? : 0x0 [Type: _MDL *]
??? [+0x004] Size???????????? : 92 [Type: short]
??? [+0x006] MdlFlags???????? : 2 [Type: short]
??? [+0x008] Process????????? : 0x0 [Type: _EPROCESS *]
??? [+0x00c] MappedSystemVa?? : 0x0 [Type: void *]
??? [+0x010] StartVa????????? : 0x0 [Type: void *]
??? [+0x014] ByteCount??????? : 0x2000 [Type: unsigned long]
??? [+0x018] ByteOffset?????? : 0x0 [Type: unsigned long]


??? if (CcIsFileCached(FileObject)) {
??????? CcDataFlushes += 1;
??????? CcDataPages += (MemoryDescriptorList->ByteCount + PAGE_SIZE - 1) >> PAGE_SHIFT;?? ?eax=00000002
??? }


1: kd> x nt!CcDataFlushes
80b1ca50????????? nt!CcDataFlushes = 0xb

1: kd> p
nt!IoSynchronousPageWrite+0x27:
80a27003 c1e80c????????? shr???? eax,0Ch
1: kd> p
nt!IoSynchronousPageWrite+0x2a:
80a27006 01054ccab180??? add???? dword ptr [nt!CcDataPages (80b1ca4c)],eax
1: kd> r
eax=00000002


第二部分:

1: kd> p
nt!IoSynchronousPageWrite+0x43:
80a2701f ff150888b180??? call??? dword ptr [nt!pIoAllocateIrp (80b18808)]
1: kd> p
nt!IoSynchronousPageWrite+0x49:
80a27025 85c0??????????? test??? eax,eax
1: kd> r
eax=894c7980


1: kd> dt _irp 894c7980
ntdll!_IRP
?? +0x000 Type???????????? : 0n6
?? +0x002 Size???????????? : 0x190
?? +0x004 MdlAddress?????? : (null)
?? +0x008 Flags??????????? : 0
?? +0x00c AssociatedIrp??? : __unnamed
?? +0x010 ThreadListEntry? : _LIST_ENTRY [ 0x894c7990 - 0x894c7990 ]
?? +0x018 IoStatus???????? : _IO_STATUS_BLOCK
?? +0x020 RequestorMode??? : 0 ''
?? +0x021 PendingReturned? : 0 ''
?? +0x022 StackCount?????? : 7 ''
?? +0x023 CurrentLocation? : 8 ''
?? +0x024 Cancel?????????? : 0 ''
?? +0x025 CancelIrql?????? : 0 ''
?? +0x026 ApcEnvironment?? : 0 ''
?? +0x027 AllocationFlags? : 0x4 ''
?? +0x028 UserIosb???????? : (null)
?? +0x02c UserEvent??????? : (null)
?? +0x030 Overlay????????? : __unnamed
?? +0x038 CancelRoutine??? : (null)
?? +0x03c UserBuffer?????? : (null)
?? +0x040 Tail???????????? : __unnamed

第三部分:

??? irp->MdlAddress = MemoryDescriptorList;
??? irp->Flags = IRP_PAGING_IO | IRP_NOCACHE | IRP_SYNCHRONOUS_PAGING_IO;

??? irp->RequestorMode = KernelMode;
??? irp->UserIosb = IoStatusBlock;
??? irp->UserEvent = Event;
??? irp->UserBuffer = (PVOID) ((PCHAR) MemoryDescriptorList->StartVa + MemoryDescriptorList->ByteOffset);
??? irp->Tail.Overlay.OriginalFileObject = FileObject;
??? irp->Tail.Overlay.Thread = PsGetCurrentThread();

1: kd> dt _irp 894c7980
ntdll!_IRP
?? +0x000 Type???????????? : 0n6
?? +0x002 Size???????????? : 0x190
?? +0x004 MdlAddress?????? : 0xf78d263c _MDL
?? +0x008 Flags??????????? : 0x43
?? +0x00c AssociatedIrp??? : __unnamed
?? +0x010 ThreadListEntry? : _LIST_ENTRY [ 0x894c7990 - 0x894c7990 ]
?? +0x018 IoStatus???????? : _IO_STATUS_BLOCK
?? +0x020 RequestorMode??? : 0 ''
?? +0x021 PendingReturned? : 0 ''
?? +0x022 StackCount?????? : 7 ''
?? +0x023 CurrentLocation? : 8 ''
?? +0x024 Cancel?????????? : 0 ''
?? +0x025 CancelIrql?????? : 0 ''
?? +0x026 ApcEnvironment?? : 0 ''
?? +0x027 AllocationFlags? : 0x4 ''
?? +0x028 UserIosb???????? : 0xf78d2834 _IO_STATUS_BLOCK
?? +0x02c UserEvent??????? : 0xf78d26a0 _KEVENT
?? +0x030 Overlay????????? : __unnamed
?? +0x038 CancelRoutine??? : (null)
?? +0x03c UserBuffer?????? : (null)
?? +0x040 Tail???????????? : __unnamed
1: kd> dx -id 0,0,899a2278 -r1 ((ntdll!_MDL *)0xf78d263c)
((ntdll!_MDL *)0xf78d263c)???????????????? : 0xf78d263c [Type: _MDL *]
??? [+0x000] Next???????????? : 0x0 [Type: _MDL *]
??? [+0x004] Size???????????? : 92 [Type: short]
??? [+0x006] MdlFlags???????? : 2 [Type: short]
??? [+0x008] Process????????? : 0x0 [Type: _EPROCESS *]
??? [+0x00c] MappedSystemVa?? : 0x0 [Type: void *]
??? [+0x010] StartVa????????? : 0x0 [Type: void *]
??? [+0x014] ByteCount??????? : 0x2000 [Type: unsigned long]
??? [+0x018] ByteOffset?????? : 0x0 [Type: unsigned long]


第四部分:

??? //
??? // Fill in the normal write parameters.
??? //

??? irpSp->MajorFunction = IRP_MJ_WRITE;
??? irpSp->Parameters.Write.Length = MemoryDescriptorList->ByteCount;
??? irpSp->Parameters.Write.ByteOffset = *StartingOffset;
??? irpSp->FileObject = FileObject;
dv
????? StartingOffset = 0xf78d26bc {7884800}

1: kd> dt _io_stack_location 894c7ac8
ntdll!_IO_STACK_LOCATION
?? +0x000 MajorFunction??? : 0x4 ''
?? +0x001 MinorFunction??? : 0 ''
?? +0x002 Flags??????????? : 0 ''
?? +0x003 Control????????? : 0 ''
?? +0x004 Parameters?????? : __unnamed
?? +0x014 DeviceObject???? : (null)
?? +0x018 FileObject?????? : (null)
?? +0x01c CompletionRoutine : (null)
?? +0x020 Context????????? : (null)


1: kd> dt _io_stack_location 894c7ac8
ntdll!_IO_STACK_LOCATION
?? +0x000 MajorFunction??? : 0x4 ''
?? +0x001 MinorFunction??? : 0 ''
?? +0x002 Flags??????????? : 0 ''
?? +0x003 Control????????? : 0 ''
?? +0x004 Parameters?????? : __unnamed
?? +0x014 DeviceObject???? : (null)
?? +0x018 FileObject?????? : 0x89469688 _FILE_OBJECT
?? +0x01c CompletionRoutine : (null)
?? +0x020 Context????????? : (null)


1: kd> dt _io_stack_location 894c7ac8 -r
ntdll!_IO_STACK_LOCATION
?? +0x000 MajorFunction??? : 0x4 ''
?? +0x001 MinorFunction??? : 0 ''
?? +0x002 Flags??????????? : 0 ''
?? +0x003 Control????????? : 0 ''
?? +0x004 Parameters?????? : __unnamed

????? +0x000 Write??????????? : __unnamed
???????? +0x000 Length?????????? : 0x2000
???????? +0x004 Key????????????? : 0
???????? +0x008 ByteOffset?????? : _LARGE_INTEGER 0x785000


第五部分:

1: kd> p
nt!IoSynchronousPageWrite+0xa8:
80a27084 e871f6ffff????? call??? nt!IofCallDriver (80a266fa)
1: kd> t
nt!IofCallDriver:
80a266fa 55????????????? push??? ebp
1: kd> kc
?#
00 nt!IofCallDriver
01 nt!IoSynchronousPageWrite
02 nt!MiFlushSectionInternal
03 nt!MmFlushSection
04 nt!CcFlushCache
05 Ntfs!LfsFlushLfcb
06 Ntfs!LfsFlushToLsnPriv
07 Ntfs!LfsWriteLfsRestart
08 Ntfs!LfsWriteRestartArea
09 Ntfs!NtfsCheckpointVolume
0a Ntfs!NtfsCheckpointAllVolumes
0b nt!ExpWorkerThread
0c nt!PspSystemThreadStartup
0d nt!KiThreadStartup
1: kd> dv
?? DeviceObject = 0x894c7980 Device for {...}
??????????? Irp = 0x8962e020

NTSTATUS
FASTCALL
IofCallDriver(
??? IN PDEVICE_OBJECT DeviceObject,
??? IN OUT PIRP Irp
??? )
{
??? if (pIofCallDriver != NULL) {

??????? //
??????? // This routine will either jump immediately to IovCallDriver or
??????? // IoPerfCallDriver.
??????? //
??????? return pIofCallDriver(DeviceObject, Irp, _ReturnAddress());
??? }

??? return IopfCallDriver(DeviceObject, Irp);
}

1: kd> p
nt!IofCallDriver+0x5c:
80a26756 56????????????? push??? esi
1: kd> p
nt!IofCallDriver+0x5d:
80a26757 57????????????? push??? edi
1: kd> p
nt!IofCallDriver+0x5e:
80a26758 ff548138??????? call??? dword ptr [ecx+eax*4+38h]
1: kd> r
eax=00000004 ebx=00000000 ecx=89630390 edx=894c7980 esi=894c7980 edi=8962e020
eip=80a26758 esp=f78d25ec ebp=f78d2600 iopl=0???????? nv up ei ng nz na po nc
cs=0008? ss=0010? ds=0023? es=0023? fs=0030? gs=0000???????????? efl=00000282
nt!IofCallDriver+0x5e:
80a26758 ff548138??????? call??? dword ptr [ecx+eax*4+38h] ds:0023:896303d8={Ntfs!NtfsFsdWrite (f714171a)}

1: kd> t
Ntfs!NtfsFsdWrite:
f714171a 6a48??????????? push??? 48h
1: kd> kc
?#
00 Ntfs!NtfsFsdWrite
01 nt!IofCallDriver
02 nt!IoSynchronousPageWrite
03 nt!MiFlushSectionInternal
04 nt!MmFlushSection
05 nt!CcFlushCache
06 Ntfs!LfsFlushLfcb
07 Ntfs!LfsFlushToLsnPriv
08 Ntfs!LfsWriteLfsRestart
09 Ntfs!LfsWriteRestartArea
0a Ntfs!NtfsCheckpointVolume
0b Ntfs!NtfsCheckpointAllVolumes
0c nt!ExpWorkerThread
0d nt!PspSystemThreadStartup
0e nt!KiThreadStartup
1: kd> dv
?? VolumeDeviceObject = 0x8962e020
????????????????? Irp = 0x894c7980

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

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

相關文章

開發Qt程序時,為什么是CMake?

開發Qt程序時,為什么是CMake? 什么是CMake? CMake 是一個跨平臺的構建工具,用來管理 C/C 項目的編譯過程。它通過讀取 CMakeLists.txt 配置文件,自動生成適合不同操作系統和編譯器的構建腳本(比如 Makefi…

web布局10

Grid 布局指的是 CSS Grid Layout ,它和以往 CSS 框架(CSS Framework)中所說的網格系統(Grid System)有所不同。至今為止,它是唯一一個具有二維能力的布局系統,即,它是一個基于二維網…

Spring AI 項目實戰(十二):Spring Boot +AI + DeepSeek + 百度OCR 公司發票智能處理系統的技術實踐(附完整源碼)

系列文章 序號文章名稱1Spring AI 項目實戰(一):Spring AI 核心模塊入門2Spring AI 項目實戰(二):Spring Boot + AI + DeepSeek 深度實戰(附完整源碼)3Spring AI 項目實戰(三):Spring Boot + AI + DeepSeek 打造智能客服系統(附完整源碼)4

【FR801xH】Ubuntu24.04搭建富芮坤FR801xH系列開發環境教程

00. 目錄 文章目錄 00. 目錄01. FR801xH概述02. FR801xH特性03. gcc-arm-none-eabi-10.3-2021.10概述04. gcc-arm-none-eabi-10.3-2021.10下載05. gcc-arm-none-eabi-10.3-2021.10安裝06. FR801xH-SDK編譯07. 附錄 01. FR801xH概述 FR801xH 系列芯片是面向 SOC(片上…

Excel學習05

員工排班表 通過之前的學習,目前的我們已經具備了Excel的初步制作能力。接下來將從實際出發制作一個員工排班表。在制作排版表之前,先來看我們要用到的函數。 DATE函數 date函數是Excel中處理日期的核心函數之一,它能夠將單獨的年、月、日…

黑馬JVM解析筆記(五):深入理解Java字節碼執行機制

1.從字節碼的角度分析i /** * 從字節碼角度分析 a 相關題目 */ public class Demo3_2 {public static void main(String[] args) {int a 10;int b a a a--;System.out.println(a);System.out.println(b);} }a 和 a 實際上代表了兩個不同的操作,它們分別對應自增…

從社交媒體到金融“超級應用”,馬斯克X平臺將上線投資交易服務

報道稱,馬斯克旗下的X平臺將推出“超級App”,提供投資和交易服務,另外,X也在探索引入信用卡或借記卡。作為金融服務布局的第一步,X平臺已宣布將推出X Money——一項數字錢包和點對點支付服務,Visa將成為其首…

【入門第2課】Splunk數據接入

前言 Splunk支持多種多樣的數據源,比如它可以直接上傳文件,可以監控本地的任何目錄或文件,也可以配置通用轉發器等方式來完成數據接入。Splunk所有的設置都可以通過Web頁面、使用Splunk CLI命令,甚至是直接修改配置文件,以此來完成設置。 那么,如何接入數據呢?我們通過…

【數據挖掘】關聯規則算法學習—Apriori

關聯規則算法學習—Apriori Apriori算法是關聯規則挖掘中的經典算法,用于發現數據集中的頻繁項集和強關聯規則。其核心思想基于先驗性質:若一個項集是頻繁的,則其所有子集也一定是頻繁的。該算法通過逐層搜索的迭代方法高效挖掘關聯規則。 要…

助力高考,利用python獲取本專科專業選考科目要求

大家好,今天我們來利用python技術助力高考,獲取網上的本專科專業選考科目要求,用到的Python模塊有:Requests、Json、BeautifulSoup、Pandas ,主要思路是Requests獲取接口請求,利用BeautifulSoup 解析網站的…

Python 商務數據分析—— NumPy 學習筆記Ⅱ

一、 數組元素值的替換 我們可以使用索引或 where () 函數來替換 NumPy 數組中的元素值。 1.1 方式一:索引 import numpy as npnp.random.seed(42)a3 np.random.randint(0, 10, size(3, 4))print("原數組:\n", a3)a3\[1] 0 # 將a3數組第一行數據全…

遙感圖像語義分割1-安裝mmsegmentation

參考: mmsegmentation: 安裝并使用自定義數據集進行訓練_mmsegmentation安裝-CSDN博客 最新Windows配置安裝mmcv與mmsegmentation,以及mmsegmentation的驗證_mmcv安裝-CSDN博客 GitCode - 全球開發者的開源社區,開源代碼托管平臺 參考: …

【菜狗的記錄】模糊聚類最大樹、圖神經網絡、大模型量化——20250627

每日學習過程中記錄的筆記,從各個網站整理下來,用于當日復盤。 如果其中的知識點能幫到你,也很榮幸呀。 -------------------------------------------------------20250622------------------------------------------------------------- …

《短劇平臺開發指南:技術方案、核心功能與行業趨勢》

一、短劇行業現狀與系統開發價值 近年來,短劇市場呈現爆發式增長,成為數字內容領域的新風口。數據顯示,2023年國內短劇市場規模已突破300億元,用戶規模達到4.5億。這種以"短、平、快"為特點的內容形式,憑借…

[FPGA]嵌入式系統FPGA設計資源

嵌入式系統FPGA設計資源 一、供應商 https://www.altera.com- Altera FPGA 供應商網站 https://www.altera.com/events/northamerica/intel-soc-fpga-developer-forum/overview.html- SoC 開發人員論壇 https://www.altera.com/content/dam/altera-www/global/en_US/pdfs/li…

ClickHouse 可觀測性最佳實踐

ClickHouse 介紹 ClickHouse 是一款高性能、列式存儲的開源分析型數據庫,專為在線分析處理(OLAP)場景設計。它能夠處理海量數據,支持實時查詢和復雜的數據分析,具備極高的讀寫性能和數據壓縮能力。ClickHouse 提供了強…

Android Framework設置時間為24小時制

文章目錄 定位源碼實現附錄12 小時制與 24 小時制的詳細解析一、基本定義與核心區別二、轉換方法與示例三、應用場景與文化差異四、延伸知識:特殊計時制與歷史背景 目的是把設置中使用默認語言區域關掉,并把使用24小時制打開 如下圖為原始的:…

基于STM32設計的掃地機器人

一、前言 1.1 項目介紹 【1】項目開發背景 隨著社會節奏的加快和人們生活方式的改變,智能家居產品逐漸走入千家萬戶。作為智能清潔系統的重要組成部分,掃地機器人憑借其自動化、高效性和便捷性,成為現代家庭中不可或缺的智能設備之一。傳統…

什么是接口測試?

2025最新Jmeter接口測試從入門到精通(全套項目實戰教程) 接口測試概念 接口測試是項目測試的一部分,它測試的主要對象是接口,是測試系統組件間接口的一種測試。接口測試主要用于檢測外部系統與所測系統之間以及內部各系統之間的交…

JDY-23藍牙模塊與電腦的連接方式

JDY-23藍牙模塊支持多種連接方式,包括SPP(串口通信)模式和BLE(低功耗藍牙)模式。以下是與電腦連接的具體方法: 1. 通過SPP模式連接 JDY-23模塊支持SPP協議,可以通過串口與電腦通信。以下是連接…