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.