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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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协议,可以通过串口与电脑通信。以下是连接…