MiChargeSegmentCommit
NTSTATUS __stdcall MiChargeSegmentCommit(
VOID **Subsection,
_MMPTE *StartingPte,
UINT64 QuotaCharge,
UINT64 ChargeAlreadyObtained){
_ETHREAD *CurrentThread;
_MMPTE *v6;
_MI_PARTITION *ControlAreaPartition;
__int64 v8;
__int64 v9;
__int64 *v10;
__int64 v11;
__int64 *v12;
_EX_PUSH_LOCK *v13;
_EX_PUSH_LOCK *v14;
__int64 v15;
UINT64 v16;
VOID **v17;
__int64 v18;
_MMPTE *Pml4eBase;
_MMPTE *PxeUserLimit;
__int64 PteShadow;
UINT64 v22;
__int64 v23;
VOID **v25;
__int64 DemandZeroPte;
__int64 v27;
__int64 v28;
unsigned __int64 v29;
int v30;
__int64 v31;
unsigned int *v32;
_QWORD *v33;
UINT64 NumberOfPages;
_CONTROL_AREA *ControlArea;
_EX_PUSH_LOCK *Lock;
_ETHREAD *v38;
VOID **v39;
NTSTATUS SubsectionCrossPartitionReferences;
_MI_PARTITION *Partition;
__int64 v42;
v39 = Subsection;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v6 = StartingPte;
v38 = CurrentThread;
ControlArea = (_CONTROL_AREA *)*Subsection;
v42 = *(_QWORD *)*Subsection;
ControlAreaPartition = MiGetControlAreaPartition(*Subsection, (_EPROCESS *)StartingPte);
v9 = *(unsigned int *)(v8 + 44);
Partition = ControlAreaPartition;
v10 = (__int64 *)v6;
v33 = (_QWORD *)(v8 + 8);
v11 = *(_QWORD *)(v8 + 8);
--CurrentThread->Tcb.SpecialApcDisable;
v32 = (unsigned int *)(v8 + 44);
v12 = (__int64 *)(v11 + 8 * v9);
v14 = v13 + 5;
Lock = v13 + 5;
ExAcquirePushLockExclusiveEx(v13 + 5, 0i64);
v15 = 0i64;
v16 = 0i64;
SubsectionCrossPartitionReferences = MiGetSubsectionCrossPartitionReferences((INT64)v39);
Pml4eBase = MmGetPml4eBase();
PxeUserLimit = MmGetPxeUserLimit();
while( 1 )
{
PteShadow = *v10;
if( v10 >= (__int64 *)Pml4eBase && v10 <= (__int64 *)PxeUserLimit )
{
PteShadow = MiReadPteShadow((__int64)v10, *v10);
v17 = v39;
}
v22 = v16 + 1;
if( PteShadow )
v22 = v16;
++v18;
++v10;
v16 = v22;
if( v18 == QuotaCharge )
break;
if( v10 == v12 )
{
v17 = (VOID **)v17[2];
v39 = v17;
v10 = (__int64 *)v17[1];
v12 = &v10[*((unsigned int *)v17 + 11)];
}
}
NumberOfPages = v22;
if( !v22 )
{
if( (_InterlockedExchangeAdd64(&v14->_bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(v14);
KeAbPostRelease(v14);
v23 = (__int64)CurrentThread;
LABEL_14:
KiLeaveGuardedRegionUnsafe(v23);
return 1;
}
if( MiChargeCommit(Partition, v22, 0i64) )
{
if( !SubsectionCrossPartitionReferences || MiGetSubsectionCharges((UINT8)v39) >= 0 )
{
v25 = Subsection;
DemandZeroPte = MiMakeDemandZeroPte((*(_BYTE *)(v42 + 14) >> 1) & 0x1F);
v27 = *v33 + 8i64 * *v32;
while( 1 )
{
LODWORD(v28) = MI_READ_PTE_LOCK_FREE((INT64)v6);
if( !v28 )
{
v29 = DemandZeroPte;
LOBYTE(v30) = MiPteInShadowRange((UINT64)v6);
if( v30 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (DemandZeroPte & 1) != 0 )
v29 = DemandZeroPte | 0x8000000000000000ui64;
v6->u.Long = v29;
}
++v15;
++v6;
if( v15 == QuotaCharge )
break;
if( v6 == (_MMPTE *)v27 )
{
v25 = (VOID **)v25[2];
v6 = (_MMPTE *)v25[1];
v27 = (__int64)&v6[*((unsigned int *)v25 + 11)];
}
}
MiUpdateProcessSharedCommit(ControlArea, NumberOfPages);
LODWORD(v31) = MiUpdateControlAreaCommitCount((INT64)ControlArea, NumberOfPages);
if( SubsectionCrossPartitionReferences && !v31 )
MiReturnCrossPartitionSectionCharges((_MI_CROSS_PARTITION_CHARGES *)Partition, 0i64, NumberOfPages);
if( (_InterlockedExchangeAdd64(&Lock->_bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(Lock);
KeAbPostRelease(Lock);
v23 = (__int64)v38;
goto LABEL_14;
}
MiReturnCommit(Partition, v16);
if( (_InterlockedExchangeAdd64(&v14->_bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
goto LABEL_29;
}
else if( (_InterlockedExchangeAdd64(&v14->_bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
{
LABEL_29:
ExfTryToWakePushLock(v14);
}
KeAbPostRelease(v14);
KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
return 0;
}Referenced by:
MiCommitPagefileBackedSection
MiMapViewOfDataSection
MiUpdateCfgSystemWideBitmapWorker
MmCommitSessionMappedView