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

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 );

相关文章:

  • Sentinel 服务限流机制
  • opencv依据图像类型读取图像像素点
  • 软件公司进军无人机领域的战略指南与生态合作全景-优雅草卓伊凡
  • Tomcat项目本地部署(Servlet为例)
  • 性能测试-jmeter实战3
  • jmeter工具简单认识
  • Vue + AbortController 请求取消弹窗 hook 封装
  • 【Qt】QTableWidget表格右键菜单
  • 键盘觉醒:Raycast 把 Mac 变成「AI 指令战舰」
  • joomla 使用nginx服务器只能打开首页,其他页面404的解决方案
  • 16、Redis底层数据结构
  • 样式失控:Word文档格式混乱的根源与对策
  • 【Flink实战】 Flink SQL 中处理字符串 `‘NULL‘` 并转换为 `BIGINT`
  • 【Ambari3.0.0 部署】Step4—时间同步(Chrony)-适用于el8
  • Xilinx XC7A12T‑1CPG238I Artix‑7 FPGA
  • Java 编程之代理模式
  • Matter协议开发者指南:使用Matter SDK构建智能家居应用
  • 数学公式排版简史
  • JavaWeb-day1
  • Spring Cloud 服务调用详解:Ribbon 负载均衡与 Feign 声明式接口调用
  • 建设银行甘肃省行网站/如何网络推广新产品
  • 做网站的协议/seo在线优化网站
  • 扬州住房和建设局网站/代发百度首页排名
  • 广州有做网站的公司吗/汨罗网站seo
  • 网站建设虚拟/长沙网络公司排名
  • 哪个网站可以做c 的项目/seo优缺点