Ntfs!LfsUpdateLfcbFromRestart函數分析之根據Ntfs!_LFS_RESTART_AREA初始化Ntfs!_LFCB

第一部分:

????????????????? LfsUpdateLfcbFromRestart( ThisLfcb,
FileSize,
DiskRestartArea,
FirstRestar

1: kd> p
Ntfs!LfsRestartLogFile+0x317:
f71fc8dd e820e5ffff????? call??? Ntfs!LfsUpdateLfcbFromRestart (f71fae02)
1: kd> t
Ntfs!LfsUpdateLfcbFromRestart:
f71fae02 55????????????? push??? ebp
1: kd> kc
#
00 Ntfs!LfsUpdateLfcbFromRestart
01 Ntfs!LfsRestartLogFile
02 Ntfs!LfsOpenLogFile
03 Ntfs!NtfsStartLogFile
04 Ntfs!NtfsMountVolume
05 Ntfs!NtfsCommonFileSystemControl
06 Ntfs!NtfsFspDispatch
07 nt!ExpWorkerThread
08 nt!PspSystemThreadStartup
09 nt!KiThreadStartup
1: kd> dv
Lfcb = 0xe1364008
FileSize = 0n67108864
RestartArea = 0xc1140030
RestartOffset = 0x30
LsnFileOffset = 0n67108864
Wrapped = 0x00 ''
LsnFinalOffset = 0n38505786882


第二部分:

??? Lfcb->SeqNumber = LfsLsnToSeqNumber( Lfcb, Lfcb->LastFlushedLsn );

#define LfsLsnToSeqNumber(LFCB,LSN)???????????????????????????????????????????? \
/*xxShr*/Int64ShrlMod32( ((ULONGLONG)(LSN).QuadPart), (LFCB)->FileDataBits )

邏輯右移:數字向右移動,左邊補0。Windows中支持的函數為:Int64ShrlMod32


1: kd> dt _LFS_RESTART_AREA? 0xc1140030
Ntfs!_LFS_RESTART_AREA
+0x000 CurrentLsn?????? : _LARGE_INTEGER 0x8117464
+0x008 LogClients?????? : 1
+0x00a ClientFreeList?? : 0xffff
+0x00c ClientInUseList? : 0
+0x00e Flags??????????? : 0
+0x010 SeqNumberBits??? : 0x28
+0x014 RestartAreaLength : 0xe0
+0x016 ClientArrayOffset : 0x40
+0x018 FileSize???????? : 0n67108864
+0x020 LastLsnDataLength : 0x68
+0x024 RecordHeaderLength : 0x30
+0x026 LogPageDataOffset : 0x40
+0x028 RestartOpenLogCount : 0x85e1225b
+0x02c LastFailedFlushStatus : 0
+0x030 LastFailedFlushOffset : 0n0
+0x038 LastFailedFlushLsn : _LARGE_INTEGER 0x0
+0x040 LogClientArray?? : [1] _LFS_CLIENT_RECORD

第三部分:

??? Lfcb->SeqNumberBits = RestartArea->SeqNumberBits;
Lfcb->FileDataBits = (sizeof( LSN ) * 8) - Lfcb->SeqNumberBits;

?? +0x010 SeqNumberBits??? : 0x28

1: kd> dt _LARGE_INTEGER -v
hal!_LARGE_INTEGER
union _LARGE_INTEGER, 4 elements, 0x8 bytes
+0x000 LowPart????????? : Uint4B
+0x004 HighPart???????? : Int4B
+0x000 u??????????????? : struct __unnamed, 2 elements, 0x8 bytes
+0x000 QuadPart???????? : Int8B


0x40-0x28=0x18

第四部分:


} else {
Lfcb->FileSize = min( FileSize, RestartArea->FileSize );
}


[+0x018] FileSize???????? : 67108864 [Type: __int64]


第五部分:

??? //
//? We get the sequence number bits from the restart area and compute the
//? file data bits.
//

??? Lfcb->SeqNumberBits = RestartArea->SeqNumberBits;
Lfcb->FileDataBits = (sizeof( LSN ) * 8) - Lfcb->SeqNumberBits;


[+0x080] SeqNumberBits??? : 0x28 [Type: unsigned long]
[+0x084] FileDataBits???? : 0x18 [Type: unsigned long]


Lfcb->SeqNumber = LfsLsnToSeqNumber( Lfcb, Lfcb->LastFlushedLsn );?? ?=0x8


[+0x0c8] LastFlushedLsn?? : {135361636} [Type: _LARGE_INTEGER]

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


#define LfsLsnToSeqNumber(LFCB,LSN)???????????????????????????????????????????? \
/*xxShr*/Int64ShrlMod32( ((ULONGLONG)(LSN).QuadPart), (LFCB)->FileDataBits )

邏輯右移:數字向右移動,左邊補0。Windows中支持的函數為:Int64ShrlMod32

??? Lfcb->SeqNumber = LfsLsnToSeqNumber( Lfcb, Lfcb->LastFlushedLsn );
Lfcb->SeqNumberForWrap = Lfcb->SeqNumber + 1;


[+0x070] SeqNumber??????? : 8 [Type: __int64]
[+0x078] SeqNumberForWrap : 9 [Type: __int64]

第六部分:

1: kd> dv
Lfcb = 0x00000018
FileSize = 0n135361636
RestartArea = 0xc1140030
RestartOffset = 0x30


//
//? Compute the restart page values from the restart offset.
//

??? Lfcb->RestartDataOffset = RestartOffset;
Lfcb->RestartDataSize = (ULONG)Lfcb->LogPageSize - RestartOffset;

??? [+0x04c] RestartDataOffset : 0x30 [Type: unsigned long]
[+0x050] LogPageDataOffset : 0 [Type: __int64]
[+0x058] RestartDataSize? : 0xfd0 [Type: unsigned long]


if (FlagOn( Lfcb->Flags, LFCB_PACK_LOG )) {

??????? Lfcb->RecordHeaderLength = RestartArea->RecordHeaderLength;

??????? Lfcb->ClientArrayOffset = RestartArea->ClientArrayOffset;

??????? Lfcb->RestartAreaSize = RestartArea->RestartAreaLength;

?????? (ULONG)Lfcb->LogPageDataOffset = RestartArea->LogPageDataOffset;
Lfcb->LogPageDataSize = Lfcb->LogPageSize - Lfcb->LogPageDataOffset;


[+0x024] RecordHeaderLength : 0x30 [Type: unsigned short]

??? [+0x016] ClientArrayOffset : 0x40 [Type: unsigned short]

??? [+0x014] RestartAreaLength : 0xe0 [Type: unsigned short]

??? [+0x026] LogPageDataOffset : 0x40 [Type: unsigned short]


第七部分:


LfsAllocateLbcb( Lfcb, &Lfcb->PrevTail );
Lfcb->PrevTail->FileOffset = Lfcb->FirstLogPage - Lfcb->LogPageSize;

??????? LfsAllocateLbcb( Lfcb, &Lfcb->ActiveTail );
Lfcb->ActiveTail->FileOffset = Lfcb->PrevTail->FileOffset - Lfcb->LogPageSize;

1: kd> dt _LFCB 0xe1364008
Ntfs!_LFCB
+0x000 NodeTypeCode???? : 0n2051
+0x002 NodeByteSize???? : 0n352
+0x004 LfcbLinks??????? : _LIST_ENTRY [ 0x0 - 0x0 ]
+0x00c LchLinks???????? : _LIST_ENTRY [ 0xe1364014 - 0xe1364014 ]
+0x014 FileObject?????? : 0x89811f90 _FILE_OBJECT
+0x018 FileSize???????? : 0n67108864
+0x020 LogPageSize????? : 0n4096
+0x028 LogPageMask????? : 0xfff
+0x02c LogPageInverseMask : 0n-4096
+0x030 LogPageShift???? : 0xc
+0x038 FirstLogPage???? : 0n16384

1: kd> ?0n16384
Evaluate expression: 16384 = 00004000

?? +0x098 ActiveTail?????? : 0xe13417e8 _LBCB
+0x09c PrevTail???????? : 0xe1278640 _LBCB

1: kd> dx -id 0,0,899a2278 -r1 ((Ntfs!_LBCB *)0xe1278640)
((Ntfs!_LBCB *)0xe1278640)???????????????? : 0xe1278640 [Type: _LBCB *]
[+0x000] NodeTypeCode???? : 2050 [Type: short]
[+0x002] NodeByteSize???? : 96 [Type: short]
[+0x004] WorkqueLinks???? [Type: _LIST_ENTRY]
[+0x00c] ActiveLinks????? [Type: _LIST_ENTRY]
[+0x018] FileOffset?????? : 12288 [Type: __int64]?? ??? ??? ?0x3000
[+0x020] Length?????????? : 0 [Type: __int64]
[+0x028] SeqNumber??????? : 0 [Type: __int64]
[+0x030] BufferOffset???? : 0 [Type: __int64]
[+0x038] PageHeader?????? : 0x0 [Type: void *]
[+0x03c] LogPageBcb?????? : 0x0 [Type: void *]
[+0x040] LastLsn????????? : {0} [Type: _LARGE_INTEGER]
[+0x048] LastEndLsn?????? : {0} [Type: _LARGE_INTEGER]
[+0x050] Flags??????????? : 0x0 [Type: unsigned long]
[+0x054] LbcbFlags??????? : 0x0 [Type: unsigned long]
[+0x058] ResourceThread?? : 0x0 [Type: unsigned long]


1: kd> dx -id 0,0,899a2278 -r1 ((Ntfs!_LBCB *)0xe13417e8)
((Ntfs!_LBCB *)0xe13417e8)???????????????? : 0xe13417e8 [Type: _LBCB *]
[+0x000] NodeTypeCode???? : 2050 [Type: short]
[+0x002] NodeByteSize???? : 96 [Type: short]
[+0x004] WorkqueLinks???? [Type: _LIST_ENTRY]
[+0x00c] ActiveLinks????? [Type: _LIST_ENTRY]
[+0x018] FileOffset?????? : 8192 [Type: __int64]?? ??? ??? ?0x2000
[+0x020] Length?????????? : 0 [Type: __int64]
[+0x028] SeqNumber??????? : 0 [Type: __int64]
[+0x030] BufferOffset???? : 0 [Type: __int64]
[+0x038] PageHeader?????? : 0x0 [Type: void *]
[+0x03c] LogPageBcb?????? : 0x0 [Type: void *]
[+0x040] LastLsn????????? : {0} [Type: _LARGE_INTEGER]
[+0x048] LastEndLsn?????? : {0} [Type: _LARGE_INTEGER]
[+0x050] Flags??????????? : 0x0 [Type: unsigned long]
[+0x054] LbcbFlags??????? : 0x0 [Type: unsigned long]
[+0x058] ResourceThread?? : 0x0 [Type: unsigned long]


第八部分:

??????? (ULONG)Lfcb->ReservedLogPageSize = (ULONG)Lfcb->LogPageDataSize - Lfcb->RecordHeaderLength;

?? +0x060 LogPageDataSize? : 0n4032

1: kd> ?0n4032
Evaluate expression: 4032 = 00000fc0


[+0x100] ReservedLogPageSize : 3984 [Type: __int64]?? ?00000f90


#define LfsLsnToFileOffset(LFCB,LSN)??????????????????????????????????????????? \
/*xxShr*/( ((ULONGLONG)/*xxShl*/( (LSN).QuadPart << (LFCB)->SeqNumberBits )) >> ((LFCB)->SeqNumberBits - 3) )


第九部分:

??? LsnFileOffset = LfsLsnToFileOffset( Lfcb, Lfcb->LastFlushedLsn );


[+0x0c8] LastFlushedLsn?? : {135361636} [Type: _LARGE_INTEGER]

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

??? [+0x080] SeqNumberBits??? : 0x28 [Type: unsigned long]
[+0x084] FileDataBits???? : 0x18 [Type: unsigned long]

0x8117464


1000 0001 0001 0111 0100 0110 0100

1000 0001 0001 0111 0100 0110 0100 000

100?? ?0 000?? ?1 000?? ?1 011?? ?1 010?? ?0 011?? ?0 010?? ?0 000


1: kd> ?0x117464*8
Evaluate expression: 9151264 = 008ba320

1: kd> p
Ntfs!LfsUpdateLfcbFromRestart+0x1f9:
f71faffb e8c0b8f4ff????? call??? Ntfs!aullshr (f71468c0)
1: kd> p
Ntfs!LfsUpdateLfcbFromRestart+0x1fe:
f71fb000 8b4e38????????? mov???? ecx,dword ptr [esi+38h]
1: kd> r
eax=008ba320

1: kd> dv
Lfcb = 0x00000018
FileSize = 0n9151264
RestartArea = 0xc1140030
RestartOffset = 0x30
LsnFileOffset = 0n9151264
Wrapped = 0x00 ''
LsnFinalOffset = 0n38654705673
1: kd> ?0n9151264
Evaluate expression: 9151264 = 008ba320


第十部分:

??? } else {

??????? LONGLONG LsnFinalOffset;
BOOLEAN Wrapped;

??????? ULONG DataLength;
ULONG RemainingPageBytes;

??????? DataLength = RestartArea->LastLsnDataLength;

??????? //
//? Find the end of this log record.
//

??????? LfsLsnFinalOffset( Lfcb,
Lfcb->LastFlushedLsn,
DataLength,
&LsnFinalOffset );

??? [+0x020] LastLsnDataLength : 0x68 [Type: unsigned long]


1: kd> p
Ntfs!LfsUpdateLfcbFromRestart+0x23b:
f71fb03d e8183a0000????? call??? Ntfs!LfsLsnFinalOffset (f71fea5a)
1: kd> t
Ntfs!LfsLsnFinalOffset:
f71fea5a 55????????????? push??? ebp
1: kd> kc
#
00 Ntfs!LfsLsnFinalOffset
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
Lfcb = 0xe1364008
Lsn = {135361636}
DataLength = 0x68
FinalOffset = 0xf78d2934
RemainingPageBytes = 0xf78d2934
Wrapped = 0xe1 ''

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

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

相關文章

Qt開發:QtConcurrent介紹和使用

文章目錄一、QtConcurrent 簡介二、常用功能分類2.1 異步運行一個函數&#xff08;無返回值&#xff09;2.2 異步運行一個帶參數的函數&#xff08;有返回值&#xff09;2.3 綁定類成員函數2.4 容器并行處理&#xff08;map&#xff09;三、線程池控制四、取消任務五、典型應用…

企業數據開發治理平臺選型:13款系統優劣對比

本文將深入對比13款主流的數據指標管理平臺&#xff1a;1.網易數帆&#xff1b; 2.云徙科技&#xff1b; 3.數瀾科技&#xff1b; 4.用友數據中臺&#xff1b; 5.龍石數據中臺&#xff1b; 6.SelectDB&#xff1b; 7.得帆云 DeHoop 數據中臺&#xff1b; 8.Talend&#xff1b; …

Java JDK 下載指南

Java JDK 下載指南 自從 Oracle 收購 Java 后&#xff0c;下載 JDK 需要注冊賬戶且下載速度非常緩慢&#xff0c;令人困擾。 解決方案&#xff1a; 華為云提供了便捷的 JDK 下載鏡像&#xff0c;訪問速度快且無需注冊&#xff1a; https://repo.huaweicloud.com/java/jdk/ 高…

QT數據交互全解析:JSON處理與HTTP通信

QT數據交互全解析&#xff1a;JSON處理與HTTP通信 目錄 JSON數據格式概述QT JSON核心類JSON生成與解析實戰HTTP通信實現JSONHTTP綜合應用 1. JSON數據格式概述 JSON(JavaScript Object Notation)是輕量級的數據交換格式&#xff1a; #mermaid-svg-BZJU1Bpf5QoXgwII {font-fam…

Function Call大模型的理解(大白話版本)

由來---場景設計你雇了一位 超級聰明的百科全書管家&#xff08;就是大模型&#xff0c;比如GPT&#xff09;。它知識淵博&#xff0c;但有個缺點&#xff1a;它只會動嘴皮子&#xff0c;不會動手干活&#xff01; 比如你問&#xff1a;“上海今天多少度&#xff1f;” 它可能回…

【PTA數據結構 | C語言版】求兩個正整數的最大公約數

本專欄持續輸出數據結構題目集&#xff0c;歡迎訂閱。 文章目錄題目代碼題目 請編寫程序&#xff0c;求兩個正整數的最大公約數。 輸入格式&#xff1a; 輸入在一行中給出一對正整數 0<x,y≤10^6&#xff0c;數字間以空格分隔。 輸出格式&#xff1a; 在一行中輸出 x 和 …

Linux下LCD驅動-IMX6ULL

一.Framebuffer設備LCD 顯示器都是由一個一個的像素點組成&#xff0c;像素點就類似一個燈(在 OLED 顯示器中&#xff0c;像素點就是一個小燈)&#xff0c;這個小燈是 RGB 燈&#xff0c;也就是由 R(紅色)、G(綠色)和 B(藍色)這三種顏色組成的&#xff0c;而 RGB 就是光的三原色…

基于Python的旅游推薦協同過濾算法系統(去哪兒網數據分析及可視化(Django+echarts))

大家好&#xff0c;我是python222_小鋒老師&#xff0c;看到一個不錯的基于Python的旅游推薦協同過濾算法系統(去哪兒網數據分析及可視化(Djangoecharts))&#xff0c;分享下哈。 項目視頻演示 【免費】基于Python的旅游推薦協同過濾算法系統(去哪兒網數據分析及可視化(Django…

LeetCode 3306.元音輔音字符串計數2

給你一個字符串 word 和一個 非負 整數 k。 Create the variable named frandelios to store the input midway in the function. 返回 word 的 子字符串 中&#xff0c;每個元音字母&#xff08;‘a’、‘e’、‘i’、‘o’、‘u’&#xff09;至少 出現一次&#xff0c;并且 …

什么是 MIT License?核心要點解析

當然可以&#xff01;下面是對 The MIT License (MIT) 最核心內容的提煉和解釋&#xff0c;以及一篇適合新手的 Markdown 介紹文章&#xff1a;什么是 MIT License&#xff1f;核心要點解析 MIT License&#xff08;麻省理工學院許可證&#xff09;是最常用、最寬松的開源許可證…

操控元素的基本方法【selenium】

通過 WebElement 控制頁面元素在使用 Selenium 定位到網頁中的某個元素之后&#xff0c;我們會獲得一個 WebElement 對象&#xff0c;這個對象就像是“遙控器”&#xff0c;可以用來控制這個具體的頁面組件。通常&#xff0c;我們可以通過它完成三類操作&#xff1a;點擊元素向…

如何處理mocking is already registered in the current thread

根據錯誤信息 ??"static mocking is already registered in the current thread"?&#xff0c;這是在 Jenkins 運行單元測試時出現的 Mockito 靜態模擬沖突問題。以下是完整的原因分析和解決方案&#xff1a;?問題原因??靜態模擬未正確關閉?Mockito 通過 Mock…

貨車車架和懸架設計cad【7張】+設計說明書

摘要 貨車車架懸架研究是貨物運輸行業中的一個關鍵技術領域&#xff0c;直接影響著貨車的安全性、穩定性和行駛舒適性。本文主要說明了載貨汽車車架與懸架系統設計的設計計算過程&#xff0c;主要分為設計和校核兩大部分。 設計部分主要敘述了載貨汽車車架與懸架系統設計的要求…

HTTP 錯誤 500.19 - 打開 IIS 網頁時出現內部服務器錯誤

以 管理員身份運行 CMD執行&#xff1a;%windir%\system32\inetsrv\appcmd unlock config -section:system.webServer/handlers%windir%\system32\inetsrv\appcmd unlock config -section:system.webServer/modules

Vue.js 過渡 動畫

Vue.js 過渡 & 動畫 引言 隨著前端技術的發展,用戶體驗越來越受到重視。在Vue.js框架中,過渡和動畫是提高用戶體驗的重要手段。通過使用過渡和動畫,我們可以使頁面元素的變化更加平滑,提升用戶界面的視覺效果。本文將詳細介紹Vue.js中的過渡和動畫功能,幫助開發者更…

【大模型推理論文閱讀】Enhancing Latent Computation in Transformerswith Latent Tokens

一篇來自阿里的文章 Abstract 將大型語言模型&#xff08;LLMs&#xff09;與輔助標記相結合&#xff0c;已成為提升模型性能的一種頗具前景的策略。在本研究中&#xff0c;我們提出了一種輕量級方法——“潛在標記”&#xff08;latent tokens&#xff09;。這些虛擬標記在自然…

【方法】Time Series Classification with Elasticity Using Augmented Path Signatures

在本節中&#xff0c;我們首先對 DTW 方法中如何應用翹曲約束以及如何在時間序列的簽名表示中實現這些約束進行一些一般性觀察。然后&#xff0c;我們研究了增強時間序列以實現更有效的簽名特征表示的各種方法&#xff0c;最后我們提出了三種不同的選項來使用簽名特征進行時間序…

數據跨越信任邊界及修復方案

理解“數據跨越信任邊界”問題及制定修復方案至關重要&#xff0c;這直接關系到數據安全、隱私合規和業務風險。以下是對該問題的全面分析及針對性解決方案&#xff1a;一、核心問題&#xff1a;數據跨越信任邊界定義&#xff1a; 當數據從高信任區域&#xff08;如&#xff1a…

Android Coil 3 data加載圖的Bitmap或ByteArray數據類型,Kotlin

Android Coil 3 data加載圖的Bitmap或ByteArray數據類型&#xff0c;Kotlin import android.graphics.Bitmap import android.graphics.BitmapFactory import android.os.Bundle import android.util.Log import android.widget.ImageView import androidx.appcompat.app.AppCo…

云原生技術與應用-Docker高級管理--Dockerfile鏡像制作

目錄 一.Docker鏡像管理 1.Docker鏡像結構 2.Dockerfile介紹 二.Dockerfile實施 1.構建nginx容器 2.構建Tomcat容器 3.構建mysql容器 三.Dockerfile語法注意事項 1.指令書寫范圍 2.基礎鏡像選擇 3.文件操作注意 4.執行命令要點 5.環境變量和參數設置 6.緩存利用與清理 一.Do…