MmCommitSessionMappedView
NTSTATUS __stdcall MmCommitSessionMappedView(PVOID MappedAddress, UINT64 ViewSize){
char *v4;
char *v5;
_ETHREAD *CurrentThread;
__int64 v7;
__int64 v8;
void *v9;
MMPTE *PteAddress;
__int64 v11;
_QWORD *i;
unsigned __int64 v13;
__int64 v14;
unsigned int *v15;
unsigned int *v16;
unsigned int *v17;
unsigned __int64 v18;
__int64 *v19;
unsigned __int64 v20;
int v21;
volatile INT64 *v22;
int v23;
volatile INT64 *v25;
NTSTATUS v26;
volatile INT64 *v27;
unsigned __int64 v28;
if( (unsigned int)MiGetSystemRegionType((UINT64)MappedAddress) != 1 )
return -1073741585;
v4 = (char *)MappedAddress + ViewSize;
if( (char *)MappedAddress + ViewSize <= MappedAddress )
return -1073741584;
v5 = v4 - 1;
if( (unsigned int)MiGetSystemRegionType((UINT64)(v4 - 1)) != 1 )
return -1073741584;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v7 = *((_QWORD *)CurrentThread + 23);
if( (*(_DWORD *)(v7 + 1124) & 0x10000) == 0 )
return -1073741799;
v8 = *(_QWORD *)(v7 + 1368);
v9 = (void *)((unsigned __int64)MappedAddress & 0xFFFFFFFFFFFFF000ui64);
PteAddress = MiGetPteAddress((PVOID)((unsigned __int64)v5 | 0xFFF));
v11 = ((PteAddress - MiGetPteAddress(v9)) >> 3) + 1;
--*((_WORD *)CurrentThread + 243);
ExAcquirePushLockExclusiveEx(*(_QWORD *)(v8 + 200), 0i64);
for( i = *(_QWORD **)(v8 + 208); ; i = (_QWORD *)*i )
{
while( 1 )
{
if( !i )
KeBugCheckEx(0xD7u, (ULONG_PTR)v9, 2ui64, 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 = *(volatile INT64 **)(v8 + 200);
if( (_InterlockedExchangeAdd64(v25, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(v25);
KeAbPostRelease((PVOID)v25);
v26 = -1073741791;
goto LABEL_29;
}
v15 = (unsigned int *)(*(_QWORD *)v14 + 128i64);
v28 = i[3] + (((unsigned __int64)v9 - (i[11] & 0xFFFFFFFFFFFFF000ui64)) >> 12);
v16 = MiLocatePagefileSubsection(v15, &v28);
if( !v16 )
{
LABEL_26:
v27 = *(volatile INT64 **)(v8 + 200);
if( (_InterlockedExchangeAdd64(v27, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(v27);
KeAbPostRelease((PVOID)v27);
v26 = -1073741584;
LABEL_29:
KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
return v26;
}
v17 = v16;
v18 = v16[11];
v19 = (__int64 *)(*((_QWORD *)v16 + 1) + 8 * v28);
v20 = v11 + v28;
v28 = v20;
if( v20 > v18 )
{
do
{
v17 = (unsigned int *)*((_QWORD *)v17 + 2);
v20 -= (unsigned int)v18;
v28 = v20;
if( !v17 )
goto LABEL_26;
LODWORD(v18) = v17[11];
}
while( v20 > (unsigned int)v18 );
}
v21 = MiChargeSegmentCommit((__int64 *)v16, v19, v11);
v22 = *(volatile INT64 **)(v8 + 200);
v23 = v21;
if( (_InterlockedExchangeAdd64(v22, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(v22);
KeAbPostRelease((PVOID)v22);
KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
return v23 == 0 ? 0xC000012D : 0;
}Referenced by:
No references.