nt!MmMapViewInSystemCache函数分析PointerPte的填充

第一部分:

1: kd> kc

00 nt!MmMapViewInSystemCache

01 nt!CcGetVacbMiss

02 nt!CcGetVirtualAddress

03 nt!CcMapData

04 Ntfs!NtfsMapStream

05 Ntfs!NtfsReadBootSector

06 Ntfs!NtfsMountVolume

07 Ntfs!NtfsCommonFileSystemControl

08 Ntfs!NtfsFspDispatch

09 nt!ExpWorkerThread

0a nt!PspSystemThreadStartup

0b nt!KiThreadStartup

1: kd> p

nt!MmMapViewInSystemCache+0x32b:

80aaf01d 8b0e mov ecx,dword ptr [esi]

1: kd> dv

SectionToMap = 0xe127a740

CapturedBase = 0x89988000

SectionOffset = 0xf78d6900 {-9175257283469246464}

CapturedViewSize = 0x00000040

PteOffset = 0

LastProto = 0x00000000

PteContents = struct _MMPTE

OldIrql = 0x00 ''

LastPte = 0x89988000

LastPteOffset = 0x40

Waited = 1

ProtoPte = 0xf78d6900

NumberOfPages = 0x40

if (PointerPte->u.List.NextEntry == MM_EMPTY_PTE_LIST) {

if ((PointerPte + 1)->u.List.NextEntry == (KeReadTbFlushTimeStamp() & MM_FLUSH_COUNTER_MASK)) {

KeFlushEntireTb (TRUE, TRUE);

}

第二部分:

1: kd> p

nt!MmMapViewInSystemCache+0x355:

80aaf047 8b4e04 mov ecx,dword ptr [esi+4]

1: kd> r

eax=00001314 ebx=898ff908 ecx=c10c0000 edx=00000000 esi=c0304200

1: kd> dd c0304200

c0304200 c10c0000 00000000 00000000 00000000

//

// Zero this explicitly now since the number of pages may be only 1.

//

(PointerPte + 1)->u.List.NextEntry = 0;

1: kd> p

nt!MmMapViewInSystemCache+0x36d:

80aaf05f 816604ff0f0000 and dword ptr [esi+4],0FFFh

1: kd> r

eax=00001314 ebx=898ff908 ecx=00000000 edx=00000000 esi=c0304200 edi=00000000

第三部分:

*CapturedBase = MiGetVirtualAddressMappedByPte (PointerPte); c1080000

#define MiGetVirtualAddressMappedByPte(PTE) ((PVOID)((ULONG)(PTE) << 10))

c0304200

1100 0000 0011 0000 0100 0010 0000 0000

11 0000 0100 0010 0000 0000 00 0000 0000

11 00 00 01 00 00 10 00 00 00 00 00 0000 0000

c1080000

1: kd> !pte c1080000

VA c1080000

PDE at C0300C10 PTE at C0304200

contains 0A03F963 contains C10C0000

pfn a03f -G-DA--KWEV not valid

Page has been freed

第四部分:

回顾PointerPte的由来:

PointerPte = MmFirstFreeSystemCache;

//

// Update next free entry.

//

ASSERT (PointerPte->u.Hard.Valid == 0);

MmFirstFreeSystemCache = MmSystemCachePteBase + PointerPte->u.List.NextEntry;

ASSERT (MmFirstFreeSystemCache <= MiGetPteAddress (MmSystemCacheEnd));

1: kd> p

nt!MmMapViewInSystemCache+0x377:

80aaf069 8bc6 mov eax,esi

1: kd> p

nt!MmMapViewInSystemCache+0x379:

80aaf06b c1e00a shl eax,0Ah

1: kd> r

eax=c0304200

1: kd> dv

SectionToMap = 0xe127a740

CapturedBase = 0x89988000

1: kd> dx -r1 ((ntkrnlmp!void * *)0x89988000)

((ntkrnlmp!void * *)0x89988000) : 0x89988000 [Type: void * *]

0xc1080000

1: kd> !pte 0xc1080000

VA c1080000

PDE at C0300C10 PTE at C0304200

contains 0A03F963 contains C10C0000

pfn a03f -G-DA--KWEV not valid

Page has been freed

1: kd> x nt!MmFirstFreeSystemCache

80b23594 nt!MmFirstFreeSystemCache = 0xc0304300

1: kd> dd 0xc0304200 //0xc0304200下一个是0xc0304300

c0304200 c10c0000

304300

0011 0000 0100 0011 0000 0000

0011 0000 0100 0011 0000 00

00 11 00 00 01 00 00 11 00 00 00

c10c0 //正确

1: kd> dd 0xc0304200

c0304200 c10c0000 00000000 00000000 00000000

c0304210 00000000 00000000 00000000 00000000

第五部分:

1: kd> dt subsection 0x898ff8d8+30

nt!SUBSECTION

+0x000 ControlArea : 0x898ff8d8 _CONTROL_AREA

+0x004 u : __unnamed

+0x008 StartingSector : 0

+0x00c NumberOfFullSectors : 0x100

+0x010 SubsectionBase : 0xe1009c00 _MMPTE

+0x014 UnusedPtes : 0

+0x018 PtesInSubsection : 0x100

+0x01c NextSubsection : (null)

PteOffset = 0

ProtoPte = &Subsection->SubsectionBase[PteOffset]; =0xe1009c00

1: kd> dd 0xe1009c00

e1009c00 fcfe94c2 fcfe94c2 fcfe94c2 fcfe94c2

e1009c10 fcfe94c2 fcfe94c2 fcfe94c2 fcfe94c2

e1009c20 fcfe94c2 fcfe94c2 fcfe94c2 fcfe94c2

e1009c30 fcfe94c2 fcfe94c2 fcfe94c2 fcfe94c2

1: kd> p

nt!MmMapViewInSystemCache+0x384:

80aaf076 8d0c88 lea ecx,[eax+ecx*4]

1: kd> r

eax=e1009c00 ebx=898ff908 ecx=00000000 edx=00000000 esi=c0304200 edi=00000000

eip=80aaf076 esp=f78d6910 ebp=f78d6930 iopl=0 nv up ei ng nz na pe nc

cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000286

nt!MmMapViewInSystemCache+0x384:

80aaf076 8d0c88 lea ecx,[eax+ecx*4]

1: kd> p

nt!MmMapViewInSystemCache+0x387:

80aaf079 894d10 mov dword ptr [ebp+10h],ecx

1: kd> r

eax=e1009c00 ebx=898ff908 ecx=e1009c00 edx=00000000 esi=c0304200 edi=00000000

1: kd> dv

SectionToMap = 0xe127a740

ProtoPte = 0xe1009c00 //正确

第六部分:

LastProto = &Subsection->SubsectionBase[Subsection->PtesInSubsection];

+0x018 PtesInSubsection : 0x100

0xe1009c00+0x100*4=

1: kd> ?0xe1009c00+0x100*4

Evaluate expression: -520052736 = e100a000

1: kd> dv

SectionToMap = 0xe127a740

LastProto = 0xe100a000

LastPte = PointerPte + NumberOfPages; eax=c0304300

0xc0304200+0x40*4=

1: kd> ?0xc0304200+0x40*4

Evaluate expression: -1070578944 = c0304300

1: kd> p

nt!MmMapViewInSystemCache+0x396:

80aaf088 8d0486 lea eax,[esi+eax*4]

1: kd> r

eax=00000040 ebx=898ff908 ecx=00000100 edx=00000000 esi=c0304200 edi=00000000

eip=80aaf088 esp=f78d6910 ebp=f78d6930 iopl=0 nv up ei ng nz na pe nc

cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000286

nt!MmMapViewInSystemCache+0x396:

80aaf088 8d0486 lea eax,[esi+eax*4]

1: kd> p

nt!MmMapViewInSystemCache+0x399:

80aaf08b 8d7e08 lea edi,[esi+8]

1: kd> r

eax=c0304300

第七部分:

while (PointerPte < LastPte) {

if (ProtoPte >= LastProto) {

//

// Handle extended subsections.

//

Subsection = Subsection->NextSubsection;

ProtoPte = Subsection->SubsectionBase;

LastProto = &Subsection->SubsectionBase[

Subsection->PtesInSubsection];

}

PteContents.u.Long = MiProtoAddressForKernelPte (ProtoPte);

MI_WRITE_INVALID_PTE (PointerPte, PteContents);

ASSERT (((ULONG_PTR)PointerPte & (MM_COLOR_MASK << PTE_SHIFT)) ==

(((ULONG_PTR)ProtoPte & (MM_COLOR_MASK << PTE_SHIFT))));

PointerPte += 1;

ProtoPte += 1;

}

ProtoPte = &Subsection->SubsectionBase[PteOffset]; =0xe1009c00

#define MiProtoAddressForKernelPte(proto_va) MiProtoAddressForPte(proto_va)

#define MiProtoAddressForPte(proto_va) \

((((((ULONG)proto_va - MmProtopte_Base) >> 1) & (ULONG)0x000000FE) | \

(((((ULONG)proto_va - MmProtopte_Base) << 2) & (ULONG)0xfffff800))) | \

MM_PTE_PROTOTYPE_MASK)

#define MM_PTE_PROTOTYPE_MASK 0x400

#define MmProtopte_Base ((ULONG)MmPagedPoolStart)

1: kd> x nt!MmPagedPoolStart

80b15028 nt!MmPagedPoolStart = 0xe1000000

1: kd> !pte 0xe1009c00

VA e1009c00

PDE at C0300E10 PTE at C0384024

contains 0A1C0963 contains 0A1CD963

pfn a1c0 -G-DA--KWEV pfn a1cd -G-DA--KWEV

9c00

1001 1100 0000 0000
1001 1100 0000 000

1001 110 0 000 0 000

1 111 1 110

1001 1100 0000 0000 00

10 01 11 00 00 00 00 00 00

27000

27400

第八部分:

PteContents.u.Long = MiProtoAddressForKernelPte (ProtoPte); //关键地方1:

1: kd> p

nt!MmMapViewInSystemCache+0x3ee:

80aaf0e0 8b4510 mov eax,dword ptr [ebp+10h]

1: kd> p

nt!MmMapViewInSystemCache+0x3f1:

80aaf0e3 2b052850b180 sub eax,dword ptr [nt!MmPagedPoolStart (80b15028)]

1: kd> r

eax=e1009c00

1: kd> p

nt!MmMapViewInSystemCache+0x411:

80aaf103 894d08 mov dword ptr [ebp+8],ecx

1: kd> r

eax=00027000 ebx=898ff908 ecx=00027400

第九部分:

MI_WRITE_INVALID_PTE (PointerPte, PteContents); //关键地方2:

1: kd> p

nt!MmMapViewInSystemCache+0x506:

80aaf1f8 8906 mov dword ptr [esi],eax

1: kd> r

eax=00027400 ebx=898ff908 ecx=f78d6920 edx=e7f77906 esi=c0304200 edi=80b79030

1: kd> dd 0xc0304200

c0304200 00027400 00000000 00000000 00000000

c0304210 00000000 00000000 00000000 00000000

c0304220 00000000 00000000 00000000 00000000

c0304230 00000000 00000000 00000000 00000000

c0304240 00000000 00000000 00000000 00000000

c0304250 00000000 00000000 00000000 00000000

c0304260 00000000 00000000 00000000 00000000

c0304270 00000000 00000000 00000000 00000000

1: kd> !pte 0xc0304200

VA c1080000

PDE at C0300C10 PTE at C0304200

contains 0A03F963 contains 00027400

pfn a03f -G-DA--KWEV not valid

Proto: E1009C00

第十部分:

1: kd> dd 0xc0304200

c0304200 00027400 00027402

1: kd> !pte 0xc0304204

VA c1081000

PDE at C0300C10 PTE at C0304204

contains 0A03F963 contains 00027402

pfn a03f -G-DA--KWEV not valid

Proto: E1009C04

ProtoPte = 0xe1009c08

第十一部分:

1: kd> dd 0xc0304200

c0304200 00027400 00027402 00027404 00000000

1: kd> dd 0xc0304200

c0304200 00027400 00027402 00027404 00027406

c0304210 00027408 0002740a 0002740c 0002740e

c0304220 00027410 00027412 00027414 00027416

c0304230 00027418 0002741a 0002741c 0002741e

c0304240 00027420 00027422 00027424 00027426

c0304250 00027428 0002742a 0002742c 0002742e

c0304260 00027430 00027432 00027434 00027436

c0304270 00027438 0002743a 0002743c 0002743e

dv

ProtoPte = 0xe1009c80

1: kd> dd 0xc0304200+80

c0304280 00027440 00027442 00027444 00027446

c0304290 00027448 0002744a 0002744c 0002744e

c03042a0 00027450 00027452 00027454 00027456

c03042b0 00027458 0002745a 0002745c 0002745e

c03042c0 00027460 00027462 00027464 00027466

c03042d0 00027468 0002746a 0002746c 0002746e

c03042e0 00027470 00027472 00027474 00027476

c03042f0 00027478 0002747a 0002747c 0002747e

ProtoPte = 0xe1009cfc

1: kd> dd 0xe1009c00

e1009c00 fcfe94c2 fcfe94c2 fcfe94c2 fcfe94c2

e1009c10 fcfe94c2 fcfe94c2 fcfe94c2 fcfe94c2

e1009c20 fcfe94c2 fcfe94c2 fcfe94c2 fcfe94c2

e1009c30 fcfe94c2 fcfe94c2 fcfe94c2 fcfe94c2

e1009c40 fcfe94c2 fcfe94c2 fcfe94c2 fcfe94c2

e1009c50 fcfe94c2 fcfe94c2 fcfe94c2 fcfe94c2

e1009c60 fcfe94c2 fcfe94c2 fcfe94c2 fcfe94c2

e1009c70 fcfe94c2 fcfe94c2 fcfe94c2 fcfe94c2

1: kd> dd 0xe1009c00+80

e1009c80 fcfe94c2 fcfe94c2 fcfe94c2 fcfe94c2

e1009c90 fcfe94c2 fcfe94c2 fcfe94c2 fcfe94c2

e1009ca0 fcfe94c2 fcfe94c2 fcfe94c2 fcfe94c2

e1009cb0 fcfe94c2 fcfe94c2 fcfe94c2 fcfe94c2

e1009cc0 fcfe94c2 fcfe94c2 fcfe94c2 fcfe94c2

e1009cd0 fcfe94c2 fcfe94c2 fcfe94c2 fcfe94c2

e1009ce0 fcfe94c2 fcfe94c2 fcfe94c2 fcfe94c2

e1009cf0 fcfe94c2 fcfe94c2 fcfe94c2 fcfe94c2

1: kd> p

nt!MmMapViewInSystemCache+0x50f:

80aaf201 3b750c cmp esi,dword ptr [ebp+0Ch]

1: kd> r

eax=0002747e ebx=898ff908 ecx=f78d6920 edx=e7f77906 esi=c0304300 edi=80b88f00

eip=80aaf201 esp=f78d6910 ebp=f78d6930 iopl=0 nv up ei ng nz ac pe nc

cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000296

nt!MmMapViewInSystemCache+0x50f:

80aaf201 3b750c cmp esi,dword ptr [ebp+0Ch] ss:0010:f78d693c=c0304300

1: kd> dd f78d6930+c

f78d693c c0304300

相关推荐
sitelist3 天前
nt!MiInitializeSystemCache函数分析之PointerPte->u.List.NextEntry的由来
systemcache·miinitializesys·u.list.nextent·list.nextentry