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

Ntfs!NtfsWriteLog函数分析之ntfs!NTFS_LOG_RECORD_HEADER结构的一个例子----NTFS源代码分析之七

Ntfs!NtfsWriteLog函数分析之ntfs!NTFS_LOG_RECORD_HEADER结构的一个例子

第一部分:

LSN
NtfsWriteLog (
    IN PIRP_CONTEXT IrpContext,
    IN PSCB Scb,
    IN PBCB Bcb OPTIONAL,
    IN NTFS_LOG_OPERATION RedoOperation,
    IN PVOID RedoBuffer OPTIONAL,
    IN ULONG RedoLength,
    IN NTFS_LOG_OPERATION UndoOperation,
    IN PVOID UndoBuffer OPTIONAL,
    IN ULONG UndoLength,
    IN LONGLONG StreamOffset,
    IN ULONG RecordOffset,
    IN ULONG AttributeOffset,
    IN ULONG StructureSize
    )
{

    PNTFS_LOG_RECORD_HEADER MyHeader;


        //
        //  If there is a Redo buffer, fill in its write entry.
        //

        if (RedoLength != 0) {

            WriteEntries[1].Buffer = RedoBuffer;
            WriteEntries[1].ByteLength = RedoLength;
            UndoIndex = RedoIndex = WriteIndex;
            WriteIndex += 1;
        }

        //
        //  If there is an undo buffer, and it is at a different address than
        //  the redo buffer, then fill in its write entry.
        //

        if ((RedoBuffer != UndoBuffer) && (UndoLength != 0) &&
            (UndoOperation != CompensationLogRecord)) {

            WriteEntries[WriteIndex].Buffer = UndoBuffer;
            WriteEntries[WriteIndex].ByteLength = UndoLength;
            UndoIndex = WriteIndex;
            WriteIndex += 1;
        }

        //
        //  Now fill in the rest of the header.  Assume Redo and Undo buffer is
        //  the same, then fix them up if they are not.
        //

        MyHeader->RedoOperation = (USHORT)RedoOperation;
        MyHeader->UndoOperation = (USHORT)UndoOperation;
        MyHeader->RedoOffset = (USHORT)WriteEntries[0].ByteLength;
        MyHeader->RedoLength = (USHORT)RedoLength;
        MyHeader->UndoOffset = MyHeader->RedoOffset;
        if (RedoBuffer != UndoBuffer) {
            MyHeader->UndoOffset += (USHORT)QuadAlign(MyHeader->RedoLength);
        }
        MyHeader->UndoLength = (USHORT)UndoLength;

        MyHeader->TargetAttribute = (USHORT)Scb->NonpagedScb->OnDiskOatIndex;
        MyHeader->RecordOffset = (USHORT)RecordOffset;
        MyHeader->AttributeOffset = (USHORT)AttributeOffset;
        MyHeader->Reserved = 0;

        MyHeader->TargetVcn = LogVcn;
        MyHeader->ClusterBlockOffset = (USHORT) LogBlocksFromBytesTruncate( ClusterOffset( Vcb, StreamOffset ));

NumberOfWriteEntries = 3
        WriteEntries = 0xf78d66d0

0: kd> dt  Ntfs!_LFS_WRITE_ENTRY  0xf78d66d0
   +0x000 Buffer           : 0xf78d6638 Void
   +0x004 ByteLength       : 0x28
0: kd> dt  Ntfs!_LFS_WRITE_ENTRY  0xf78d66d0+8
   +0x000 Buffer           : 0xe1362ca8 Void
   +0x004 ByteLength       : 0x38
0: kd> dt  Ntfs!_LFS_WRITE_ENTRY  0xf78d66d0+8*2
   +0x000 Buffer           : 0xc14c0390 Void
   +0x004 ByteLength       : 0x38


0: kd>  dt _NTFS_LOG_RECORD_HEADER  0xf78d6638
Ntfs!_NTFS_LOG_RECORD_HEADER
   +0x000 RedoOperation    : 0x14
   +0x002 UndoOperation    : 0x14
   +0x004 RedoOffset       : 0x28
   +0x006 RedoLength       : 0x38
   +0x008 UndoOffset       : 0x60
   +0x00a UndoLength       : 0x38
   +0x00c TargetAttribute  : 0x18
   +0x00e LcnsToFollow     : 1
   +0x010 RecordOffset     : 0
   +0x012 AttributeOffset  : 0x378
   +0x014 ClusterBlockOffset : 0
   +0x016 Reserved         : 0
   +0x018 TargetVcn        : 0n0
   +0x020 LcnsForPage      : [1] 0n5337437


0: kd> dt DUPLICATED_INFORMATION 0xe1362ca8
Ntfs!DUPLICATED_INFORMATION
   +0x000 CreationTime     : 0n133707810243906250
   +0x008 LastModificationTime : 0n133707810243906250
   +0x010 LastChangeTime   : 0n133707810243906250
   +0x018 LastAccessTime   : 0n133707810243906250
   +0x020 AllocatedLength  : 0n0
   +0x028 FileSize         : 0n0
   +0x030 FileAttributes   : 0x20000006
   +0x034 PackedEaSize     : 0
   +0x036 Reserved         : 0
   +0x034 ReparsePointTag  : 0

0: kd> dt DUPLICATED_INFORMATION 0xc14c0390
Ntfs!DUPLICATED_INFORMATION
   +0x000 CreationTime     : 0n133707810243906250
   +0x008 LastModificationTime : 0n133707810243906250
   +0x010 LastChangeTime   : 0n133707810243906250
   +0x018 LastAccessTime   : 0n133707810243906250
   +0x020 AllocatedLength  : 0n0
   +0x028 FileSize         : 0n0
   +0x030 FileAttributes   : 0x20000006
   +0x034 PackedEaSize     : 0
   +0x036 Reserved         : 0
   +0x034 ReparsePointTag  : 0


第二部分:

0: kd> kc
 #
00 Ntfs!LfsWriteLogRecordIntoLogPage
01 Ntfs!LfsWrite
02 Ntfs!NtfsWriteLog
03 Ntfs!NtfsUpdateFileNameInIndex
04 Ntfs!NtfsUpdateDuplicateInfo
05 Ntfs!NtfsInitializeSecurity
06 Ntfs!NtfsInitializeSecurityFile
07 Ntfs!NtfsMountVolume
08 Ntfs!NtfsCommonFileSystemControl
09 Ntfs!NtfsFspDispatch
0a nt!ExpWorkerThread
0b nt!PspSystemThreadStartup
0c nt!KiThreadStartup
0: kd> dv
                Lfcb = 0xe1351768
                 Lch = 0xe1293300
NumberOfWriteEntries = 3
        WriteEntries = 0xf78d66d0

第三部分:


typedef enum _NTFS_LOG_OPERATION {

    Noop =                         0x00, //
    CompensationLogRecord =        0x01, //
    InitializeFileRecordSegment =  0x02, //  FILE_RECORD_SEGMENT_HEADER
    DeallocateFileRecordSegment =  0x03, //
    WriteEndOfFileRecordSegment =  0x04, //  ATTRIBUTE_RECORD_HEADER
    CreateAttribute =              0x05, //  ATTRIBUTE_RECORD_HEADER
    DeleteAttribute =              0x06, //
    UpdateResidentValue =          0x07, //  (value)
    UpdateNonresidentValue =       0x08, //  (value)
    UpdateMappingPairs =           0x09, //  (value = mapping pairs bytes)
    DeleteDirtyClusters =          0x0A, //  array of LCN_RANGE
    SetNewAttributeSizes =         0x0B, //  NEW_ATTRIBUTE_SIZES
    AddIndexEntryRoot =            0x0C, //  INDEX_ENTRY
    DeleteIndexEntryRoot =         0x0D, //  INDEX_ENTRY
    AddIndexEntryAllocation =      0x0E, //  INDEX_ENTRY
    DeleteIndexEntryAllocation =   0x0F, //  INDEX_ENTRY
    WriteEndOfIndexBuffer =        0x10, //  INDEX_ENTRY
    SetIndexEntryVcnRoot =         0x11, //  VCN
    SetIndexEntryVcnAllocation =   0x12, //  VCN
    UpdateFileNameRoot =           0x13, //  DUPLICATED_INFORMATION
    UpdateFileNameAllocation =     0x14, //  DUPLICATED_INFORMATION
    SetBitsInNonresidentBitMap =   0x15, //  BITMAP_RANGE
    ClearBitsInNonresidentBitMap = 0x16, //  BITMAP_RANGE
    HotFix =                       0x17, //
    EndTopLevelAction =            0x18, //
    PrepareTransaction =           0x19, //
    CommitTransaction =            0x1A, //
    ForgetTransaction =            0x1B, //
    OpenNonresidentAttribute =     0x1C, //  OPEN_ATTRIBUTE_ENTRY+ATTRIBUTE_NAME_ENTRY
    OpenAttributeTableDump =       0x1D, //  OPEN_ATTRIBUTE_ENTRY array
    AttributeNamesDump =           0x1E, //  (all attribute names)
    DirtyPageTableDump =           0x1F, //  DIRTY_PAGE_ENTRY array
    TransactionTableDump =         0x20, //  TRANSACTION_ENTRY array
    UpdateRecordDataRoot =         0x21, //  (value)
    UpdateRecordDataAllocation =   0x22  //  (value)

} NTFS_LOG_OPERATION, *PNTFS_LOG_OPERATION;

相关文章:

  • leetcode刷题日记——1.组合总和
  • 【论文解读】DeepSeek-R1
  • 常用存储器介绍
  • 操作系统:分页存储管理方式(精简版、含例题)
  • 无需登录即可使用的Web应用网站
  • MySQL事务与锁中的MVCC 深度解析与面试题讲解
  • C++学习-入门到精通【15】异常处理深入剖析
  • Docker安装MQEX
  • 20250607在荣品的PRO-RK3566开发板的Android13的uboot中使用gpio命令来配置GPIO的状态
  • VBA进度条ProgressForm1
  • 振动力学:多自由度系统
  • 现代C++特性(一):基本数据类型扩展
  • WaytoAGI东京大会开启AI全球化新对话:技术无国界,合作促创新
  • PCB设计教程【大师篇】——STM32开发板电源设计(电压基准、滤波电容)
  • PG 分区表的缺陷
  • 自制操作系统(五、重写引导部分和C语言的使用)
  • c++学习-this指针
  • 【仿生机器人】仿生机器人智能架构:从感知到个性的完整设计
  • 《Progressive Transformers for End-to-End Sign Language Production》复现报告
  • 【LangchainAgent】Agent基本构建与使用
  • 电子商务网站建设(论文/网站搜索引擎优化的基本内容
  • 网站制作国际连锁/宁波网络推广方式
  • h5购物网站模板/世界搜索引擎大全
  • 网站建设需要实现哪些目标/东莞谷歌推广公司
  • 龙岗住房建设局网站/百度一下百度首页登录
  • 做淘宝优惠券怎么有网站/进入百度知道首页