MiCountSystemImageCommitment
NTSTATUS __stdcall MiCountSystemImageCommitment(_KLDR_DATA_TABLE_ENTRY *DataTableEntry){
UINT64 DllBase;
_SECTION *SectionPointer;
_CONTROL_AREA *v4;
char *v5;
INT64 v6;
VOID *v7;
INT64 v8;
INT16 v9;
_MMSUPPORT_INSTANCE *SessionVm;
int v11;
_MMSUPPORT_INSTANCE *v12;
__int64 v13;
_MMSUPPORT_SHARED *SharedVm;
UINT8 v15;
_CONTROL_AREA *v16;
INT64 v17;
int v18;
unsigned __int64 v19;
unsigned int v20;
_MMPTE *PteBase;
INT64 v22;
_UNICODE_STRING *v23;
UINT8 v24;
_UNICODE_STRING *v25;
int v26;
__int64 v27;
__int64 v28;
__int64 v29;
__int64 v30;
UINT8 v32;
_CONTROL_AREA *v33;
_MMSUPPORT_INSTANCE *v34;
INT64 v35;
if( (HIDWORD(DataTableEntry[1].GpValue) & 0x12) != 0 )
return(unsigned __int64)DataTableEntry->SizeOfImage >> 12;
DllBase = (UINT64)DataTableEntry->DllBase;
if( MI_IS_PHYSICAL_ADDRESS((VOID *)DllBase) )
return(unsigned __int64)DataTableEntry->SizeOfImage >> 12;
SectionPointer = (_SECTION *)DataTableEntry->SectionPointer;
if( !SectionPointer )
return(unsigned __int64)DataTableEntry->SizeOfImage >> 12;
v4 = MiSectionControlArea(SectionPointer);
if( !*(_QWORD *)&v4[1].gap8[8] )
{
return(unsigned __int64)DataTableEntry->SizeOfImage >> 12;
}
else
{
v5 = (char *)MmGetPteBase() + ((DllBase >> 9) & 0x7FFFFFFFF8i64);
v6 = (INT64)v5;
if( MiGetSystemRegionType(DllBase) == 1 )
SessionVm = MiGetSessionVm(v8, (INT64)v7, v9);
else
SessionVm = MiGetAnyMultiplexedVm(MiWorkingSetTypeSystemViews, v7);
v34 = SessionVm;
v11 = v4->u.LongFlags & 0x800;
v12 = SessionVm;
v13 = 0i64;
v35 = (INT64)MiFreePrivateFixupEntryForSystemImage((VOID *)DllBase, 0i64);
SharedVm = MiGetSharedVm(v12);
v15 = ExAcquireSpinLockExclusive((INT64 *)&SharedVm->WorkingSetLock);
SharedVm->GoodCitizenWaiting = 0;
v16 = v4 + 1;
v32 = v15;
v33 = v4 + 1;
if( v4 != (_CONTROL_AREA *)-128i64 )
{
v17 = v35;
while( 1 )
{
v18 = HIDWORD(v16->NumberOfUserReferences) & 0x3FFFFFFF;
v19 = (unsigned int)(HIDWORD(v16->NumberOfMappedViews) - v18);
if( (v16->NumberOfPfnReferences & 0x3E) >= 8 )
{
v6 += 8i64 * (unsigned int)(HIDWORD(v16->NumberOfMappedViews) - v18);
LABEL_12:
v13 += v19;
goto LABEL_36;
}
if( MiGetSubsectionDriverProtos((_SUBSECTION *)v16) )
{
v6 += 8 * v19;
goto LABEL_12;
}
v20 = 0;
if( !v19 )
goto LABEL_36;
PteBase = MmGetPteBase();
do
{
if( v17 && _bittest(*(const signed __int32 **)(*(_QWORD *)(v17 + 40) + 8i64), (v6 - (__int64)v5) >> 3) )
{
LABEL_19:
++v13;
goto LABEL_34;
}
LODWORD(v22) = MI_READ_PTE_LOCK_FREE(v6);
v35 = v22;
if( v22 )
{
if( v11 )
goto LABEL_19;
if( (v22 & 1) != 0 )
{
MI_READ_PTE_LOCK_FREE((INT64)&v35);
if( (MiGetWsleContents(0xFFFFFFFFFi64, ((v6 << 25) - ((_QWORD)PteBase << 25)) >> 16) & 0xF) == 9 )
goto LABEL_19;
LOBYTE(v26) = MI_PFN_IS_PROTO(v25, v23, v24, &v25->Length);
if( !v26 || (*(_QWORD *)(v27 + 40) & 0x1000000000i64) == 0 && *(__int64 *)(v27 + 8) > 0 )
goto LABEL_19;
v28 = v13 + 1;
if( (*(_DWORD *)(v27 + 16) & 0x400i64) != 0 )
v28 = v13;
v13 = v28;
}
else
{
v29 = v13 + 1;
if( (v22 & 0x400) != 0 && !MI_PROTO_FORMAT_COMBINED((_MMPTE)v22) )
v29 = v13;
v13 = v29;
}
}
LABEL_34:
++v20;
v6 += 8i64;
}
while( v20 < v19 );
v16 = v33;
LABEL_36:
v16 = *(_CONTROL_AREA **)&v16->gap8[8];
v33 = v16;
if( !v16 )
{
v12 = v34;
v15 = v32;
break;
}
}
}
MiUnlockWorkingSetExclusive(v12, v15);
LODWORD(v30) = v13;
}
return v30;
}Referenced by:
MiSessionUpdateImageCharges