MmCommitSessionMappedView
NTSTATUS __stdcall MmCommitSessionMappedView(VOID *MappedAddress, UINT64 ViewSize){
char *v4;
char *v5;
_ETHREAD *CurrentThread;
_EPROCESS *Process;
_MM_SESSION_SPACE *Session;
VOID *v9;
_MMPTE *PteAddress;
UINT64 v11;
_QWORD *i;
unsigned __int64 v13;
__int64 v14;
_SUBSECTION *v15;
_SUBSECTION *v16;
_SUBSECTION *v17;
UINT64 PtesInSubsection;
_MMPTE *v19;
UINT64 v20;
NTSTATUS v21;
_EX_PUSH_LOCK *v22;
NTSTATUS v23;
_EX_PUSH_LOCK *v25;
NTSTATUS v26;
_EX_PUSH_LOCK *v27;
UINT64 OutPteOffset;
if( MiGetSystemRegionType((UINT64)MappedAddress) != 1 )
return -1073741585;
v4 = (char *)MappedAddress + ViewSize;
if( (char *)MappedAddress + ViewSize <= MappedAddress )
return -1073741584;
v5 = v4 - 1;
if( MiGetSystemRegionType((UINT64)(v4 - 1)) != 1 )
return -1073741584;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
Process = CurrentThread->Tcb.ApcState.Process;
if( (Process->Flags & 0x10000) == 0 )
return -1073741799;
Session = Process->Session;
v9 = (VOID *)((unsigned __int64)MappedAddress & 0xFFFFFFFFFFFFF000ui64);
PteAddress = MiGetPteAddress((VOID *)((unsigned __int64)v5 | 0xFFF));
v11 = PteAddress - MiGetPteAddress(v9) + 1;
--CurrentThread->Tcb.SpecialApcDisable;
ExAcquirePushLockExclusiveEx(*((_EX_PUSH_LOCK **)Session + 25), 0i64);
for( i = (_QWORD *)*((_QWORD *)Session + 26); ; i = (_QWORD *)*i )
{
while( 1 )
{
if( !i )
KeBugCheckEx(0xD7u, v9, (PVOID)2, 0i64, 0i64);
v13 = i[11] & 0xFFFFFFFFFFFFF000ui64;
if( (unsigned __int64)v9 < v13 + i[4] )
break;
i = (_QWORD *)i[1];
}
if( (unsigned __int64)v9 >= v13 )
break;
}
v14 = i[6];
if( *(_QWORD *)(*(_QWORD *)v14 + 64i64) )
{
v25 = (_EX_PUSH_LOCK *)*((_QWORD *)Session + 25);
if( (_InterlockedExchangeAdd64(&v25->_bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(v25);
KeAbPostRelease(v25);
v26 = -1073741791;
goto LABEL_29;
}
v15 = (_SUBSECTION *)(*(_QWORD *)v14 + 128i64);
OutPteOffset = i[3] + (((unsigned __int64)v9 - (i[11] & 0xFFFFFFFFFFFFF000ui64)) >> 12);
v16 = MiLocatePagefileSubsection(v15, &OutPteOffset);
if( !v16 )
{
LABEL_26:
v27 = (_EX_PUSH_LOCK *)*((_QWORD *)Session + 25);
if( (_InterlockedExchangeAdd64(&v27->_bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(v27);
KeAbPostRelease(v27);
v26 = -1073741584;
LABEL_29:
KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
return v26;
}
v17 = v16;
PtesInSubsection = v16->PtesInSubsection;
v19 = &v16->SubsectionBase[OutPteOffset];
v20 = v11 + OutPteOffset;
OutPteOffset = v20;
if( v20 > PtesInSubsection )
{
do
{
v17 = v17->NextSubsection;
v20 -= (unsigned int)PtesInSubsection;
OutPteOffset = v20;
if( !v17 )
goto LABEL_26;
LODWORD(PtesInSubsection) = v17->PtesInSubsection;
}
while( v20 > (unsigned int)PtesInSubsection );
}
v21 = MiChargeSegmentCommit((VOID **)&v16->ControlArea, v19, v11, (UINT64)v16);
v22 = (_EX_PUSH_LOCK *)*((_QWORD *)Session + 25);
v23 = v21;
if( (_InterlockedExchangeAdd64(&v22->_bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(v22);
KeAbPostRelease(v22);
KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
return v23 == 0 ? 0xC000012D : 0;
}Referenced by:
No references.