当前位置: 首页 > article >正文

Ntfs!NtfsReadBootSector函数分析之nt!CcGetVacbMiss中得到一个nt!_VACB结构


第一部分:

1: kd> g
Breakpoint 3 hit
nt!CcGetVacbMiss:
80a1a19e 6a30            push    30h
1: kd> kc
 #
00 nt!CcGetVacbMiss
01 nt!CcGetVirtualAddress
02 nt!CcMapData
03 Ntfs!NtfsMapStream
04 Ntfs!NtfsReadBootSector                    Ntfs!NtfsReadBootSector
05 Ntfs!NtfsMountVolume
06 Ntfs!NtfsCommonFileSystemControl
07 Ntfs!NtfsFspDispatch
08 nt!ExpWorkerThread
09 nt!PspSystemThreadStartup
0a nt!KiThreadStartup


1: kd> kv
 # ChildEBP RetAddr  Args to Child              
00 f78d6994 80a1a947 89901cc8 00000000 00000000 nt!CcGetVacbMiss (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\base\ntos\cache\vacbsup.c @ 492]
01 f78d69c0 80bf97f1 89901d98 00000000 00000000 nt!CcGetVirtualAddress+0xc7 (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\base\ntos\cache\vacbsup.c @ 414]
02 f78d6a28 f7171729 899c41b0 f78d6a64 00000200 nt!CcMapData+0x89 (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\base\ntos\cache\pinsup.c @ 191]
03 f78d6a54 f7196c08 895de328 898ffa10 00000000 Ntfs!NtfsMapStream+0xaf (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\base\fs\ntfs\cachesup.c @ 625]
04 f78d6ac0 f7191e0a 895de328 898fe7f8 f78d6c80 Ntfs!NtfsReadBootSector+0x15a (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\base\fs\ntfs\fsctrl.c @ 5143]
05 f78d6cec f717c5aa 895de328 89456310 895de328 Ntfs!NtfsMountVolume+0x226 (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\base\fs\ntfs\fsctrl.c @ 1307]
06 f78d6d04 f71484b0 895de328 89456310 8999d020 Ntfs!NtfsCommonFileSystemControl+0x8c (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\base\fs\ntfs\fsctrl.c @ 837]
07 f78d6d80 80af2bb9 895de328 00000000 8999d020 Ntfs!NtfsFspDispatch+0x1fe (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\base\fs\ntfs\fspdisp.c @ 336]
08 f78d6dac 80d391f0 895de328 00000000 00000000 nt!ExpWorkerThread+0x10f (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\base\ntos\ex\worker.c @ 1153]
09 f78d6ddc 80b00d52 80af2aaa 00000000 00000000 nt!PspSystemThreadStartup+0x2e (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\base\ntos\ps\create.c @ 2213]
0a 00000000 00000000 00000000 00000000 00000000 nt!KiThreadStartup+0x16 [d:\srv03rtm\base\ntos\ke\i386\threadbg.asm @ 81]


第二部分:

1: kd> dt SHARED_CACHE_MAP 89901cc8
nt!SHARED_CACHE_MAP
   +0x000 NodeTypeCode     : 0n767
   +0x002 NodeByteSize     : 0n304
   +0x004 OpenCount        : 1
   +0x008 FileSize         : _LARGE_INTEGER 0x2200
   +0x010 BcbList          : _LIST_ENTRY [ 0x89901cd8 - 0x89901cd8 ]
   +0x018 SectionSize      : _LARGE_INTEGER 0x100000
   +0x020 ValidDataLength  : _LARGE_INTEGER 0x7fffffff`ffffffff
   +0x028 ValidDataGoal    : _LARGE_INTEGER 0x7fffffff`ffffffff
   +0x030 InitialVacbs     : [4] (null)
   +0x040 Vacbs            : 0x89901cf8  -> (null)             +0x040 Vacbs            : 0x89901cf8
   +0x044 FileObject       : 0x899c41b0 _FILE_OBJECT
   +0x048 ActiveVacb       : (null)
   +0x04c NeedToZero       : (null)
   +0x050 ActivePage       : 0
   +0x054 NeedToZeroPage   : 0
   +0x058 ActiveVacbSpinLock : 0
   +0x05c VacbActiveCount  : 0                +0x05c VacbActiveCount  : 0


1: kd> dd 0x89901cf8
89901cf8  00000000 00000000 00000000 00000000
89901d08  89901cf8 899c41b0 00000000 00000000
89901d18  00000000 00000000 00000000 00000000
89901d28  00000000 80b1cbd0 80b1cbd0 00000204


PVACB
CcGetVacbMiss (
    IN PSHARED_CACHE_MAP SharedCacheMap,
    IN LARGE_INTEGER FileOffset,
    IN OUT PKIRQL OldIrql
    )

1: kd> dv
   SharedCacheMap = 0x89901cc8
       FileOffset = {0}
          OldIrql = 0xf78d69bf ""

    //
    //  Mark it in use so no one else will muck with it after
    //  we release the spin lock.
    //

    Vacb->Overlay.ActiveCount = 1;
    SharedCacheMap->VacbActiveCount += 1;


第三部分:预先分析

        Vacb = CONTAINING_RECORD( CcVacbFreeList.Flink, VACB, LruList );
        CcMoveVacbToReuseTail( Vacb );

1: kd> x nt!CcVacbFreeList
80b1cb58          nt!CcVacbFreeList = struct _LIST_ENTRY [ 0x89988010 - 0x89993fc8 ]
1: kd> dx -r1 (*((ntkrnlmp!_LIST_ENTRY *)0x80b1cb58))
(*((ntkrnlmp!_LIST_ENTRY *)0x80b1cb58))                 [Type: _LIST_ENTRY]
    [+0x000] Flink            : 0x89988010 [Type: _LIST_ENTRY *]
    [+0x004] Blink            : 0x89993fc8 [Type: _LIST_ENTRY *]

1: kd> dt _vacb 0x89988010-10
nt!_VACB
   +0x000 BaseAddress      : (null)
   +0x004 SharedCacheMap   : (null)
   +0x008 Overlay          : __unnamed
   +0x010 LruList          : _LIST_ENTRY [ 0x89988028 - 0x80b1cb58 ]


#define CcMoveVacbToReuseTail(V)        RemoveEntryList( &(V)->LruList );                 \
                                        InsertTailList( &CcVacbLru, &(V)->LruList );

1: kd> x nt!CcVacbLru
80b1cb60          nt!CcVacbLru = struct _LIST_ENTRY [ 0x80b1cb60 - 0x80b1cb60 ]
1: kd> dx -r1 (*((ntkrnlmp!_LIST_ENTRY *)0x80b1cb60))
(*((ntkrnlmp!_LIST_ENTRY *)0x80b1cb60))                 [Type: _LIST_ENTRY]
    [+0x000] Flink            : 0x80b1cb60 [Type: _LIST_ENTRY *]
    [+0x004] Blink            : 0x80b1cb60 [Type: _LIST_ENTRY *]


第四部分:调试过程

        Vacb = CONTAINING_RECORD( CcVacbFreeList.Flink, VACB, LruList );    //之后


dv
             Vacb = 0x89988000

1: kd> dx -r1 ((ntkrnlmp!_VACB *)0x89988000)
((ntkrnlmp!_VACB *)0x89988000)                 : 0x89988000 [Type: _VACB *]
    [+0x000] BaseAddress      : 0x0 [Type: void *]
    [+0x004] SharedCacheMap   : 0x0 [Type: _SHARED_CACHE_MAP *]
    [+0x008] Overlay          [Type: __unnamed]
    [+0x010] LruList          [Type: _LIST_ENTRY]
1: kd> dx -r1 (*((ntkrnlmp!_LIST_ENTRY *)0x89988010))
(*((ntkrnlmp!_LIST_ENTRY *)0x89988010))                 [Type: _LIST_ENTRY]
    [+0x000] Flink            : 0x89988028 [Type: _LIST_ENTRY *]
    [+0x004] Blink            : 0x80b1cb58 [Type: _LIST_ENTRY *]


        CcMoveVacbToReuseTail( Vacb );        //之后

1: kd> dx -r1 ((ntkrnlmp!_VACB *)0x89988000)
((ntkrnlmp!_VACB *)0x89988000)                 : 0x89988000 [Type: _VACB *]
    [+0x000] BaseAddress      : 0x0 [Type: void *]
    [+0x004] SharedCacheMap   : 0x0 [Type: _SHARED_CACHE_MAP *]
    [+0x008] Overlay          [Type: __unnamed]
    [+0x010] LruList          [Type: _LIST_ENTRY]
1: kd> dx -r1 (*((ntkrnlmp!_LIST_ENTRY *)0x89988010))
(*((ntkrnlmp!_LIST_ENTRY *)0x89988010))                 [Type: _LIST_ENTRY]
    [+0x000] Flink            : 0x80b1cb60 [Type: _LIST_ENTRY *]
    [+0x004] Blink            : 0x80b1cb60 [Type: _LIST_ENTRY *]


1: kd> x nt!CcVacbLru
80b1cb60          nt!CcVacbLru = struct _LIST_ENTRY [ 0x89988010 - 0x89988010 ]
1: kd> dx -r1 (*((ntkrnlmp!_LIST_ENTRY *)0x80b1cb60))
(*((ntkrnlmp!_LIST_ENTRY *)0x80b1cb60))                 [Type: _LIST_ENTRY]
    [+0x000] Flink            : 0x89988010 [Type: _LIST_ENTRY *]
    [+0x004] Blink            : 0x89988010 [Type: _LIST_ENTRY *]

http://www.lryc.cn/news/2387582.html

相关文章:

  • 猿大师办公助手WebOffice用二进制数据流在Web前端打开Office文档
  • etcd:高可用,分布式的key-value存储系统
  • AI in Game,大模型能力与实时音视频技术融合,交出AI应用新答卷
  • 欢乐熊大话蓝牙知识11:如何打造一个低功耗蓝牙温湿度传感器?
  • Linux 安装 Remmina
  • 什么是HTTP HTTP 和 HTTPS 的区别
  • cos和dmz学习
  • 上升沿计数 stm32 中断
  • Java 各版本核心新特性的详细说明
  • Nginx 性能优化全解析:从进程到安全的深度实践
  • Pycharm and Flask 的学习心得(10)重定向
  • 单机Kafka配置ssl并在springboot使用
  • 《棒球特长生》棒球升学途径·棒球1号位
  • JavaScript的call和apply
  • DiT、 U-Net 与自回归模型的优势
  • 开源 FcDesigner 表单设计器组件事件详解
  • Teigha应用——解析CAD文件(DWG格式)Teigha在CAD C#二次开发中的基本应用
  • C++23内存分配新特性:std::allocate_at_least
  • JavaScript性能优化全景指南
  • 04-jenkins学习之旅-java后端项目部署实践
  • 基于Python flask 的豆瓣电影top250数据评分可视化
  • Cat.4+WiFi6工业路由器介绍小体积大作用ER4200
  • 大模型应用开发第三讲:大模型是Agent的“大脑”,提供通用推理能力(如GPT-4、Claude 3)
  • 创建型模式之Abstract Factory(抽象工厂)
  • GitLab 18.0 正式发布,15.0 将不再受技术支持,须升级【一】
  • 【DeepSeek论文精读】12. DeepSeek-Prover-V2: 通过强化学习实现子目标分解的形式化数学推理
  • 字符串day7
  • vue2中,codemirror编辑器的使用
  • FastAPI与MongoDB分片集群:异步数据路由与聚合优化
  • Perl单元测试实战指南:从Test::Class入门到精通的完整方案