Ntfs!LfsUpdateLfcbFromRestart函数分析之Ntfs!LfsFindOldestClientLsn

第0部分:

    //
//  Find the oldest client Lsn.  Use the last flushed Lsn as a starting point.
//

    Lfcb->OldestLsn = Lfcb->LastFlushedLsn;

    LfsFindOldestClientLsn( RestartArea,
Add2Ptr( RestartArea, Lfcb->ClientArrayOffset, PLFS_CLIENT_RECORD ),
&Lfcb->OldestLsn );


第一部分:

1: kd> p
Ntfs!LfsUpdateLfcbFromRestart+0x2df:
f71fb0e1 e8f26af8ff      call    Ntfs!LfsFindOldestClientLsn (f7181bd8)
1: kd> t
Ntfs!LfsFindOldestClientLsn:
f7181bd8 55              push    ebp
1: kd> kc
#
00 Ntfs!LfsFindOldestClientLsn
01 Ntfs!LfsUpdateLfcbFromRestart
02 Ntfs!LfsRestartLogFile
03 Ntfs!LfsOpenLogFile
04 Ntfs!NtfsStartLogFile
05 Ntfs!NtfsMountVolume
06 Ntfs!NtfsCommonFileSystemControl
07 Ntfs!NtfsFspDispatch
08 nt!ExpWorkerThread
09 nt!PspSystemThreadStartup
0a nt!KiThreadStartup
1: kd> dv
RestartArea = 0xc1140030
ClientArray = 0xc1140070
OldestLsn = 0xe13640c0 {135361636}

第二部分:

1: kd> dx -r1 ((Ntfs!_LFS_RESTART_AREA *)0xc1140030)
((Ntfs!_LFS_RESTART_AREA *)0xc1140030)                 : 0xc1140030 [Type: _LFS_RESTART_AREA *]
[+0x000] CurrentLsn       : {135361636} [Type: _LARGE_INTEGER]
[+0x008] LogClients       : 0x1 [Type: unsigned short]
[+0x00a] ClientFreeList   : 0xffff [Type: unsigned short]
[+0x00c] ClientInUseList  : 0x0 [Type: unsigned short]
[+0x00e] Flags            : 0x0 [Type: unsigned short]
[+0x010] SeqNumberBits    : 0x28 [Type: unsigned long]
[+0x014] RestartAreaLength : 0xe0 [Type: unsigned short]
[+0x016] ClientArrayOffset : 0x40 [Type: unsigned short]
[+0x018] FileSize         : 67108864 [Type: __int64]
[+0x020] LastLsnDataLength : 0x68 [Type: unsigned long]
[+0x024] RecordHeaderLength : 0x30 [Type: unsigned short]
[+0x026] LogPageDataOffset : 0x40 [Type: unsigned short]
[+0x028] RestartOpenLogCount : 0x85e1225b [Type: unsigned long]
[+0x02c] LastFailedFlushStatus : 0x0 [Type: unsigned long]
[+0x030] LastFailedFlushOffset : 0 [Type: __int64]
[+0x038] LastFailedFlushLsn : {0} [Type: _LARGE_INTEGER]
[+0x040] LogClientArray   [Type: _LFS_CLIENT_RECORD [1]]

#define LFS_NO_CLIENT                           0xffff

    //
//  While there are more clients, compare their oldest Lsn with the
//  current oldest.
//

    while (NextClient != LFS_NO_CLIENT) {


ClientBlock = ClientArray + NextClient;    c1140070

1: kd> p
Ntfs!LfsFindOldestClientLsn+0x53:
f7181c2b 03450c          add     eax,dword ptr [ebp+0Ch]
1: kd> r
eax=00000000 ebx=e13640c0 ecx=000003b8 edx=00000c48 esi=e13640c0 edi=c1140030
eip=f7181c2b esp=f78d290c ebp=f78d2914 iopl=0         nv up ei pl zr na pe nc
cs=0008  ss=0010  ds=0023  es=0023  fs=0030  gs=0000             efl=00000246
Ntfs!LfsFindOldestClientLsn+0x53:
f7181c2b 03450c          add     eax,dword ptr [ebp+0Ch] ss:0010:f78d2920=c1140070
1: kd> dv
RestartArea = 0xc1140030
ClientArray = 0xc1140070
OldestLsn = 0xe13640c0 {135361636}

1: kd> ?0n135361636
Evaluate expression: 135361636 = 08117464

1: kd> dd f78d2914+0Ch
f78d2920  c1140070


第三部分:

1: kd> dx -r1 ((Ntfs!_LFS_CLIENT_RECORD *)0xc1140070)
((Ntfs!_LFS_CLIENT_RECORD *)0xc1140070)                 : 0xc1140070 [Type: _LFS_CLIENT_RECORD *]
[+0x000] OldestLsn        : {135349873} [Type: _LARGE_INTEGER]


第四部分:

1: kd> ?0n135349873
Evaluate expression: 135349873 = 08114671


if (( ClientBlock->OldestLsn.QuadPart != 0 )
&& ( ClientBlock->OldestLsn.QuadPart < OldestLsn->QuadPart )) {        //条件成立

            *OldestLsn = ClientBlock->OldestLsn;
}


1: kd> p
Ntfs!LfsFindOldestClientLsn+0x6e:
f7181c46 890e            mov     dword ptr [esi],ecx
1: kd> r
eax=c1140070 ebx=e13640c0 ecx=08114671 edx=08114671 esi=e13640c0 edi=08114671

1: kd> dd e13640c0
e13640c0  08117464 00000000 00000000 00000000


1: kd> dv
RestartArea = 0xc1140030
ClientArray = 0xc1140070
OldestLsn = 0xe13640c0 {135349873}    0x08114671

1: kd> dd e13640c0
e13640c0  08114671 00000000 00000000 00000000
e13640d0  08117464 00000000 00000000 00000000

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/88376.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/88376.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

「日拱一码」021 机器学习——特征工程

目录 特征选择 过滤法&#xff08;Filter Methods&#xff09; 方差选择法 相关系数法 卡方检验 包裹法&#xff08;Wrapper Methods&#xff09; 递归特征消除&#xff08;RFE&#xff09; 嵌入法&#xff08;Embedded Methods&#xff09; L1正则化&#xff08;Lasso…

k8s:安装 Helm 私有仓库ChartMuseum、helm-push插件并上传、安装Zookeeper

ChartMuseum 是 Kubernetes 生态中用于存储、管理和发布 Helm Charts 的开源系统&#xff0c;主要用于扩展 Helm 包管理器的功能 核心功能 ‌集中存储‌&#xff1a;提供中央化仓库存储Charts&#xff0c;支持版本管理和权限控制。 ‌ ‌跨集群部署‌&#xff1a;支持多集群环境…

C++编程学习(第二天)

1、求a和b两个数之和。#include <iostream> using namespace std;int main() {int a, b, sum; //定义变量a、b、sumcout << "请输入第一个数字a: "; //打印需要显示的字符串cin >> a; // >&…

毫米波雷达守护银发安全:七彩喜跌倒检测仪重构居家养老防线

在老龄化加速与独居老人数量攀升的背景下&#xff0c;跌倒已成为威胁老年人生命安全的“隐形杀手”。七彩喜跌倒检测仪以毫米波雷达技术为核心&#xff0c;通过“非接触式监测智能预警”重塑居家安全防护体系&#xff0c;为银发群体构建起全天候、无感化的数字守护网。技术突破…

面试复盘:节流中第二次触发的事件?答错补课

面试复盘&#xff1a;节流中第二次触发的事件&#xff1f;答错补课 背景描述 今天面试时被问到一个看似基础但暗藏玄机的问题&#xff1a;“节流&#xff08;Throttle&#xff09;函数中&#xff0c;第二次触发的那一帧事件是否会被丢掉&#xff1f;” 我基于对经典节流实现的…

Spark伪分布式集群搭建(Ubuntu系统)

环境准备 系统要求&#xff1a;Ubuntu 20.04/22.04 LTS 软件版本&#xff1a; Hadoop 3.3.5 JDK 8 Spark-3.5.6-bin-hadoop3 硬件要求&#xff1a;至少4GB内存&#xff0c;20GB磁盘空间 以下是基于Ubuntu系统的Spark伪分布式集群搭建全流程。以Spark 3.5.6 Hadoop 3.3.…

【快手】数据挖掘面试题0001:查找连续三天登录的用户

文章大纲一、测试数据构建二、自连接方案三、窗口函数方案一张用户表&#xff0c;uer_id&#xff0c;signin_date&#xff0c;大概是这么几项&#xff0c;查找连续三天登录的用户。 比如说&#xff0c;1,2两天登录不是连续三天&#xff0c;456登录为连续三天登录&#xff0c;56…

简说scp命令

简单介绍 scp的全称是&#xff1a;Secure Copy Protocol&#xff08;安全复制协议&#xff09;&#xff0c;是Linux中用于在网络中安全传输文件的命令行工具。它基于SSH协议&#xff0c;用于在本地服务器和远程服务器之间&#xff0c;或者两台远程服务器之间复制文件或目录。 s…

自动化测试解决方案Parasoft SOAtest无脚本UI测试实践指南

传统UI自动化测试常面临技术门槛高、维护成本大、稳定性差等挑战。尤其在页面频繁变更时&#xff0c;测试脚本的更新和维护会显著降低测试效率。 自动化测试解决方案Parasoft SOAtest通过可视化操作和智能元素定位技术&#xff0c;无需编写代码&#xff0c;让测试人员能够像真…

vscode配置头文件和编译器

在 VS Code 中配置编译器和头文件路径需要修改两个核心文件&#xff1a;c_cpp_properties.json&#xff08;用于智能提示&#xff09;和 tasks.json&#xff08;用于构建&#xff09;。以下是详细步骤&#xff1a; —### 1. 配置智能提示和头文件路径 (c_cpp_properties.json)作…

HTML+JS+CSS制作一个数独游戏

闲来无事&#xff0c;用HTMLJSCSS制作了一个数独游戏消遣。其实主要是自己做题的时候用笔画删除数字太容易出错&#xff0c;所以想搞一个程序稍微辅助一下。通过制作这个程序&#xff0c;反而提高了手工做题的水平&#xff0c;至少学会了记录步数以便于回退。 20250710功能更新…

嵌入式硬件中电容的基本原理与实现详解02

我们今天重点讨论点知识点如下: 1.各种种类的电容优缺点对比讲解 2.电容的标称值介绍 3.电容的单位介绍 4.常见的电压信号有哪些? 5. 电容的耐压值讲解 6.电容的容值有哪些? 7.12pF、15pF 电容常用在什么场合? 8. 振荡电路中使用的电容常常需要使用什么材质的电容? 9.100n…

Python训练打卡DAY46

DAY46&#xff1a;通道注意力&#xff08;SE注意力&#xff09; 恩师浙大疏锦行 知识点&#xff1a; 不同CNN层的特征图&#xff1a;不同通道的特征图什么是注意力&#xff1a;注意力家族&#xff0c;类似于动物园&#xff0c;都是不同的模块&#xff0c;好不好试了才知道。通…

fastadmin_php专项

1.时间的判断,还有就是在php这边如何去拿前端html元素上面的值input($row.borrowtime);// 创建两个 DateTime 对象$row_expecttime new \DateTime(input($row.borrowtime));$par_expecttime new \DateTime( $params[expecttime]); // // 计算两个日期之间的差异 // …

如何在MySQL中选择使用InnoDB还是MyISAM引擎?

在 MySQL 中选择 InnoDB 还是 MyISAM 存储引擎时&#xff0c;需根据应用场景的需求权衡功能、性能和数据完整性。以下是具体的选择指南&#xff1a; 1. 优先考虑事务和外键需求必须使用 InnoDB&#xff1a; 若应用需要 事务支持&#xff08;如金融转账、订单处理&#xff09;或…

邀请函 | 知从科技邀您共赴2025 RISC-V 中国峰会

第五届RISC-V中国峰会将于2025年7月16至19日在上海张江科学会堂隆重举办&#xff0c;本届峰会由上海开放处理器产业创新中心&#xff08;SOPIC&#xff09;主办&#xff0c;RISC-V国际开源实验室&#xff08;RIOS实验室&#xff09;和上海张江高科技园区开发股份有限公司联合主…

企业数字化转型规划和建设方案(管理架构、应用架构、技术架构)PPT

一、战略定位与核心目标以 “技术赋能业务&#xff0c;数据驱动创新” 为核心思路&#xff0c;构建 “三步走” 战略演进路径&#xff0c;实现 IT 从 “基础支撑” 到 “战略引擎” 的升级&#xff1a;IT1.0&#xff08;1-2 年&#xff09;&#xff1a;夯实基础能力定位 “稳健…

基于Uniapp+MySQL+PHP的景区多商户小程序源码系统 带完整的搭建指南

温馨提示&#xff1a;文末有资源获取方式该系统采用 PHP MySQL 的经典开发组合。PHP 作为一种广泛使用的开源脚本语言&#xff0c;具有简单易学、运行速度快、跨平台性强等优点&#xff0c;能够快速开发出功能强大的 Web 应用程序。MySQL 则是一款稳定可靠的关系型数据库管理系…

阿里云和腾讯云RocketMQ 发消息和消费消息客户端JAVA接口

一、RocketMQ 概述RocketMQ 是阿里巴巴开源的一款分布式消息中间件&#xff0c;后捐赠给 Apache 基金会成为顶级项目。它具有低延迟、高并发、高可用、高可靠等特点&#xff0c;广泛应用于订单交易、消息推送、流计算、日志收集等场景。核心特点分布式架构&#xff1a;支持集群…

Vue响应式原理六:Vue3响应式原理

1. 多个对象响应式当前存在的问题&#xff1a;当前实现仅针对某个固定对象&#xff08;obj&#xff09;进行依赖收集&#xff0c;实际开发中需要处理多个不同对象将对象响应式处理逻辑抽取为通用函数&#xff0c;支持任意对象代码如下&#xff1a; // 方案一&#xff1a;Obje…