第一部分:
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 ''