Ntfs!LfsGetLbcb函数分析之Ntfs!LfsPrepareLfcbForLogRecord
第一部分:
PLBCB
LfsGetLbcb (
IN PLFCB Lfcb
)
{
//
// Pin the desired record page.
//
LfsPreparePinWriteData( Lfcb,
Lfcb->NextLogPage,
(ULONG)Lfcb->LogPageSize,
FlagOn( Lfcb->Flags, LFCB_REUSE_TAIL ),
&PageHeader,
&PageHeaderBcb );
//
// Now allocate an Lbcb.
//
LfsAllocateLbcb( Lfcb, &Lbcb );
//
// Now initialize the rest of the Lbcb fields.
//
Lbcb->FileOffset = Lfcb->NextLogPage;
Lbcb->SeqNumber = Lfcb->SeqNumber;
Lbcb->BufferOffset = Lfcb->LogPageDataOffset;
//
// Store the next page in the Lfcb.
//
LfsNextLogPageOffset( Lfcb,
Lfcb->NextLogPage,
&Lfcb->NextLogPage,
&WrappedOrUsaError );
Lbcb->Length = Lfcb->LogPageSize;
Lbcb->PageHeader = PageHeader;
Lbcb->LogPageBcb = PageHeaderBcb;
1: kd> dt _lbcb 0xe1368a94-c
Ntfs!_LBCB
+0x000 NodeTypeCode : 0n2050
+0x002 NodeByteSize : 0n96
+0x004 WorkqueLinks : _LIST_ENTRY [ 0xe13517f0 - 0xe1357ea4 ]
+0x00c ActiveLinks : _LIST_ENTRY [ 0xe13517f8 - 0xe13517f8 ]
+0x018 FileOffset : 0n7884800
+0x020 Length : 0n4096
+0x028 SeqNumber : 0n8
+0x030 BufferOffset : 0n2256
+0x038 PageHeader : 0xc2c45000 Void
+0x03c LogPageBcb : 0x894c6658 Void
+0x040 LastLsn : _LARGE_INTEGER 0x80f0b0f
+0x048 LastEndLsn : _LARGE_INTEGER 0x80f0b0f
+0x050 Flags : 1
+0x054 LbcbFlags : 6
+0x058 ResourceThread : 0x8999c023
1: kd> dx -id 0,0,899a2278 -r1 ((Ntfs!_LFCB *)0xe1351768)
((Ntfs!_LFCB *)0xe1351768) : 0xe1351768 [Type: _LFCB *]
[+0x000] NodeTypeCode : 2051 [Type: short]
[+0x002] NodeByteSize : 352 [Type: short]
[+0x004] LfcbLinks [Type: _LIST_ENTRY]
[+0x00c] LchLinks [Type: _LIST_ENTRY]
[+0x014] FileObject : 0x89469688 [Type: _FILE_OBJECT *]
[+0x018] FileSize : 67108864 [Type: __int64]
[+0x020] LogPageSize : 4096 [Type: __int64]
[+0x028] LogPageMask : 0xfff [Type: unsigned long]
[+0x02c] LogPageInverseMask : -4096 [Type: long]
[+0x030] LogPageShift : 0xc [Type: unsigned long]
[+0x038] FirstLogPage : 16384 [Type: __int64]
[+0x040] NextLogPage : 7888896 [Type: __int64]
1: kd> ?0n7888896
Evaluate expression: 7888896 = 00786000
1: kd> ?0n67108864
Evaluate expression: 67108864 = 04000000
F:\srv03rtm>grep "LfsGetLbcb" -rn F:\srv03rtm\base\fs |grep -v "inary"
F:\srv03rtm\base\fs/lfs/lbcbsup.c:31:#pragma alloc_text(PAGE, LfsGetLbcb)
F:\srv03rtm\base\fs/lfs/lbcbsup.c:194:LfsGetLbcb (
F:\srv03rtm\base\fs/lfs/lbcbsup.c:223: DebugTrace( +1, Dbg, "LfsGetLbcb: Entered\n", 0 );
F:\srv03rtm\base\fs/lfs/lbcbsup.c:374: DebugUnwind( LfsGetLbcb );
F:\srv03rtm\base\fs/lfs/lbcbsup.c:399: DebugTrace( -1, Dbg, "LfsGetLbcb: Exit\n", 0 );
F:\srv03rtm\base\fs/lfs/lfsprocs.h:176:LfsGetLbcb (
F:\srv03rtm\base\fs/lfs/logrcsup.c:552: ThisLbcb = LfsGetLbcb( Lfcb );
F:\srv03rtm\base\fs/ntfs/mp/ntfs.prf:138:LfsGetLbcb@4
第二部分:
VOID
LfsPrepareLfcbForLogRecord (
IN OUT PLFCB Lfcb,
IN ULONG RemainingLogBytes
)
{
while (TRUE) {
//
// If the Lbcb link we have is the head of the list, we will need another
// Lbcb.
//
if (LbcbLinks == &Lfcb->LbcbActive) {
ThisLbcb = LfsGetLbcb( Lfcb );
} else {
ThisLbcb = CONTAINING_RECORD( LbcbLinks,
LBCB,
ActiveLinks );
}
第三部分:
BOOLEAN
LfsWriteLogRecordIntoLogPage (
IN PLFCB Lfcb,
IN PLCH Lch,
IN ULONG NumberOfWriteEntries,
IN PLFS_WRITE_ENTRY WriteEntries,
IN LFS_RECORD_TYPE RecordType,
IN TRANSACTION_ID *TransactionId OPTIONAL,
IN LSN ClientUndoNextLsn OPTIONAL,
IN LSN ClientPreviousLsn OPTIONAL,
IN LONG UndoRequirement,
IN BOOLEAN ForceToDisk,
OUT PLSN Lsn
)
{
//
// We update the Lfcb so that we can start putting the log record into
// the top of the Lbcb active list.
//
LfsPrepareLfcbForLogRecord( Lfcb,
RemainingLogBytes + Lfcb->RecordHeaderLength );
ThisLbcb = CONTAINING_RECORD( Lfcb->LbcbActive.Flink,
LBCB,
ActiveLinks );