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.