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

nt!MiInitializePfn函数分析之nt!MiPfPutPagesInTransition函数的关键一步

第一部分:
VOID
MiInitializePfn (
    IN PFN_NUMBER PageFrameIndex,
    IN PMMPTE PointerPte,
    IN ULONG ModifiedState
    )

1: kd> t
nt!MiInitializePfn:
80a8482e 55              push    ebp
1: kd> kc
 #
00 nt!MiInitializePfn
01 nt!MiPfPutPagesInTransition
02 nt!MmPrefetchPages
03 nt!CcPfPrefetchSections
04 nt!CcPfBootWorker
05 nt!PspSystemThreadStartup
06 nt!KiThreadStartup


1: kd> dv
 PageFrameIndex = 0x7b19b
     PointerPte = 0xe13a70a0
  ModifiedState = 0


1: kd> dd 0xe13a70a0
e13a70a0  f930e4d4

    Pfn1 = MI_PFN_ELEMENT (PageFrameIndex);
    Pfn1->PteAddress = PointerPte;            关键代码1:

1: kd> dd 81000000+0x7b19b*18
81b8a688  00000000 001ec66c 00000000 00003000
81b8a698  0007b15b 03ffffff

1: kd> p
nt!MiInitializePfn+0x46:
80a84874 895e04          mov     dword ptr [esi+4],ebx
1: kd> r
eax=001714d1 ebx=e13a70a0 ecx=81000000 edx=81000000 esi=81b8a688 edi=00000000

    Pfn1->PteAddress = PointerPte;            之后:

1: kd> dd 81000000+0x7b19b*18
81b8a688  00000000 e13a70a0 00000000 00003000
81b8a698  0007b15b 03ffffff

第二部分:

    if (PointerPte->u.Hard.Valid == 1) {

    }
    else {
        Pfn1->OriginalPte = *PointerPte;                    关键代码2:
        ASSERT (!((Pfn1->OriginalPte.u.Soft.Prototype == 0) &&
                    (Pfn1->OriginalPte.u.Soft.Transition == 1)));
    }


1: kd> dd e13a70a0
e13a70a0  f930e4d4

        Pfn1->OriginalPte = *PointerPte;    之后:    
1: kd> dd 81000000+0x7b19b*18
81b8a688  00000000 e13a70a0 00000000 00003000
81b8a698  f930e4d4 03ffffff


第三部分:

    ASSERT (Pfn1->u3.e2.ReferenceCount == 0);
    Pfn1->u3.e2.ReferenceCount += 1;

    Pfn1->u2.ShareCount += 1;
    Pfn1->u3.e1.PageLocation = ActiveAndValid;
    Pfn1->u3.e1.CacheAttribute = MiCached;        关键代码3:

typedef enum _MI_PFN_CACHE_ATTRIBUTE {
    MiNonCached,                    0
    MiCached,                    1
    MiWriteCombined,                2
    MiNotMapped                    3
} MI_PFN_CACHE_ATTRIBUTE, *PMI_PFN_CACHE_ATTRIBUTE;

1: kd> dd 81000000+0x7b19b*18
81b8a688  00000000 e13a70a0 00000000 00003000
81b8a698  f930e4d4 03ffffff

    Pfn1->u3.e1.CacheAttribute = MiCached;之后:

1: kd> dd 81000000+0x7b19b*18
81b8a688  00000000 e13a70a0 00000001 00013000
81b8a698  f930e4d4 03ffffff

第四部分:


#define MI_SET_MODIFIED(_Pfn, _NewValue, _CallerId)             \
            ASSERT ((_Pfn)->u3.e1.Rom == 0);                    \
            MI_SNAP_DIRTY (_Pfn, _NewValue, _CallerId);         \
            if ((_NewValue) != 0) {                             \
                MI_STAMP_MODIFIED (_Pfn, _CallerId);            \
            }                                                   \
            (_Pfn)->u3.e1.Modified = (_NewValue);

#if 0
#define MI_STAMP_MODIFIED(Pfn,id)   (Pfn)->u4.Reserved = (id);
#else
#define MI_STAMP_MODIFIED(Pfn,id)            没有定义
#endif

1: kd> dv
 PageFrameIndex = 0x7b19b
     PointerPte = 0xe13a70a0
  ModifiedState = 0

    if (ModifiedState == 1) {
        MI_SET_MODIFIED (Pfn1, 1, 0xB);
    }
    else {
        MI_SET_MODIFIED (Pfn1, 0, 0x26);        
    }


1: kd> dd 81000000+0x7b19b*18
81b8a688  00000000 e13a70a0 00000001 00011600
81b8a698  f930e4d4 03ffffff

第五部分:

    //
    // Determine the page frame number of the page table page which
    // contains this PTE.
    确定包含此PTE的页表页的页帧号。

    PteFramePointer = MiGetPteAddress(PointerPte);


#define MiGetPteAddress(va) ((PMMPTE)(((((ULONG)(va)) >> 12) << 2) + PTE_BASE))


1: kd> !pte 0xe13a70a0
                 VA e13a70a0
PDE at C0300E10         PTE at C0384E9C
contains 0A1C0963       contains 007D8963
pfn a1c0  -G-DA--KWEV   pfn 7d8   -G-DA--KWEV


1: kd> dd C0384E9C
c0384e9c  007d8963

    PteFramePointer = MiGetPteAddress(PointerPte);    =edi=c0384e9c
    if (PteFramePointer->u.Hard.Valid == 0) {

1: kd> p
nt!MiInitializePfn+0x10d:
80a8493b f60701          test    byte ptr [edi],1
1: kd> r
eax=00011600 ebx=e13a70a0 ecx=81000000 edx=81000000 esi=81b8a688 edi=c0384e9c


第六部分:

#define MI_GET_PAGE_FRAME_FROM_PTE(PTE) ((PTE)->u.Hard.PageFrameNumber)


    PteFramePage = MI_GET_PAGE_FRAME_FROM_PTE (PteFramePointer);    007d8
    ASSERT (PteFramePage != 0);
    Pfn1->u4.PteFrame = PteFramePage;                    关键代码4:
    

1: kd> dd 81000000+0x7b19b*18
81b8a688  00000000 e13a70a0 00000001 00011600
81b8a698  f930e4d4 03ffffff

1: kd> dd 0xe13a70a0
e13a70a0  f930e4d4


1: kd> dd 81000000+0x7b19b*18
81b8a688  00000000 e13a70a0 00000001 00011600
81b8a698  f930e4d4 000007d8                7d8的由来!!!

7d8的由来!!!    

1: kd> !pte 0xe13a70a0
                 VA e13a70a0
PDE at C0300E10         PTE at C0384E9C
contains 0A1C0963       contains 007D8963
pfn a1c0  -G-DA--KWEV   pfn 7d8   -G-DA--KWEV

1: kd> !dc 7d80a0
#  7d80a0 f930e4d4 00000000 0c020002 74536d4d ..0.........MmSt        


e13a70a0和f930e4d4和000007d8三者的密切关系


0xe13a70a0和C0384E9C的一致性:

1: kd> !pte 0xe13a70a0
                 VA e13a70a0
PDE at C0300E10         PTE at C0384E9C
contains 0A1C0963       contains 007D8963
pfn a1c0  -G-DA--KWEV   pfn 7d8   -G-DA--KWEV


1: kd> !pte c0384e9c
                 VA e13a7000
PDE at C0300E10         PTE at C0384E9C
contains 0A1C0963       contains 007D8963
pfn a1c0  -G-DA--KWEV   pfn 7d8   -G-DA--KWEV

第七部分:
    //
    // Increment the share count for the page table page containing
    // this PTE.
    //

    Pfn2 = MI_PFN_ELEMENT (PteFramePage);

    Pfn2->u2.ShareCount += 1;

1: kd> dd 81000000+7d8*18
8100bc40  00000371 c0384e9c 000000c5 00021601
8100bc50  00000080 a000a1c0


1: kd> dd 81000000+7d8*18
8100bc40  00000371 c0384e9c 000000c6 00021601
8100bc50  00000080 a000a1c0


1: kd> !dc 0x7b19b000
#7b19b000 00000000 00000000 00000000 00000000 ................
#7b19b010 00000000 00000000 00000000 00000000 ................
#7b19b020 00000000 00000000 00000000 00000000 ................
#7b19b030 00000000 00000000 00000000 00000000 ................

相关文章:

  • 区块链基本理解
  • 淘宝商品主图标题api接口(附API接口文档)
  • 实验6分类汇总
  • uniapp-商城-61-后台 新增商品(添加商品到数据库)
  • C# DataGrid功能总览
  • 04_决策树
  • 力扣-比特位计数(统计一个数二进制下1的个数)
  • 【部署】读取excel批量导入dify的QA知识库
  • Linux 的 UDP 网络编程 -- 回显服务器,翻译服务器
  • SpringBoot启动流程深入分析
  • 自定义类、元组、字典和结构体对比——AutoCAD C# 开发中建立不同对象之间的联系
  • 【发票提取表格】批量PDF电子发票提取明细保存到Excel表格,批量提取ODF电子发票明细,行程单明细,单据明细保存到表格,使用步骤、详细操作方法和注意事项
  • python 自动化教程
  • Conda 完全指南:从环境管理到工具集成
  • 探索C++对象模型:(拷贝构造、运算符重载)成员函数的深度解读(中篇)
  • PYTHON训练营DAY28
  • 18.自动化生成知识图谱的多维度质量评估方法论
  • R语言数据框(datafram)数据的构建及简单分析
  • SAP学习笔记 - 开发12 - CAP 之 开发准备,添加服务
  • MySQL刷题相关简单语法集合
  • 专利申请全球领先!去年我国卫星导航与位置服务产值超5700亿
  • 刘小涛任江苏省委副书记
  • 王东杰评《国家与学术》︱不“国”不“故”的“国学”
  • 国家卫生健康委通报关于肖某引发舆情事件调查处置进展情况
  • 秘鲁总理辞职
  • 持续8年仍难终了的纠纷:败诉方因拒执罪被立案,胜诉方银行账户遭冻结