MmDeleteProcessAddressSpace

VOID __stdcall MmDeleteProcessAddressSpace(_EPROCESS *Process){
  _MMSUPPORT_FULL *p_Vm; 
  void *NumberOfLockedPages; 
  char *LockedPagesList; 
  _MMSUPPORT_SHARED *SharedVm; 
  __int64 v6; 
  __int64 v7; 
  UINT64 v8; 
  _EPROCESS *v9; 
  _MI_PARTITION *ProcessPartition; 
  _MMWSL_INSTANCE *VmWorkingSetList; 
  VOID *LockedEntries; 
  _MM_PAGE_ACCESS_INFO_HEADER *AccessLog; 
  void *CommitReleaseContext; 
  _MM_SESSION_SPACE *Session; 
  void *MmHotPatchContext; 
  PVOID *v17; 
  PVOID *v18; 
  PVOID *i; 
  char *j; 
  _QWORD *v21; 
  void *v22; 

  p_Vm = &Process->Vm;
  MiUnlinkWorkingSet(&Process->Vm.Instance, 0i64);
  NumberOfLockedPages = (void *)Process->NumberOfLockedPages;
  LockedPagesList = (char *)Process->LockedPagesList;
  if( NumberOfLockedPages )
  {
    if( LockedPagesList && *((_QWORD *)LockedPagesList + 2) && *((_DWORD *)LockedPagesList + 8) == 1 )
    {
      v17 = *(PVOID **)LockedPagesList;
      v18 = 0i64;
      while( v17 )
      {
        v18 = v17;
        v17 = (PVOID *)*v17;
      }
      if( !v18 )
      {
        for( i = (PVOID *)*((_QWORD *)LockedPagesList + 1); i; i = (PVOID *)*i )
          v18 = i;
      }
      KeBugCheckEx(0xCBu, v18, 0i64, v18[3], (PVOID)Process->NumberOfLockedPages);
    }
    KeBugCheckEx(0x76u, 0i64, Process, NumberOfLockedPages, Process->LockedPagesList);
  }
  if( LockedPagesList )
  {
    for( j = (char *)Process->LockedPagesList; ; j = LockedPagesList + 8 )
    {
      while( 1 )
      {
        v21 = *(_QWORD **)j;
        if( !*(_QWORD *)j )
          break;
        do
        {
          v22 = v21;
          v21 = (_QWORD *)*v21;
        }
        while( v21 );
        if( !v22 )
          break;
        ExFreePoolWithTag(v22, 0);
      }
      if( j != LockedPagesList )
        break;
    }
    ExFreePoolWithTag(LockedPagesList, 0);
  }
  SharedVm = MiGetSharedVm(&p_Vm->Instance);
  LODWORD(v6) = MiDeleteFinalPageTables(Process);
  v7 = v6;
  PsReturnProcessQuota(Process, v8);
  ProcessPartition = MiGetProcessPartition(Process, v9);
  MiReturnResident((INT64)ProcessPartition, 4ui64);
  VmWorkingSetList = Process->Vm.Instance.VmWorkingSetList;
  if( VmWorkingSetList )
  {
    LockedEntries = (VOID *)VmWorkingSetList[9].LockedEntries;
    if( LockedEntries )
      MiDeleteAweInfo((ULONG_PTR)Process, LockedEntries);
    ExCleanupAutoExpandPushLock((_EX_PUSH_LOCK_AUTO_EXPAND *)&VmWorkingSetList[10].NextPteToAge);
  }
  AccessLog = (_MM_PAGE_ACCESS_INFO_HEADER *)SharedVm->AccessLog;
  if( AccessLog )
  {
    MiEmptyPageAccessLog(AccessLog);
    SharedVm->AccessLog = 0i64;
  }
  CommitReleaseContext = SharedVm->CommitReleaseContext;
  if( CommitReleaseContext )
  {
    ExFreePoolWithTag(CommitReleaseContext, 0);
    SharedVm->CommitReleaseContext = 0i64;
  }
  if( (Process->Flags2 & 0x10) != 0 )
    PspChangeJobMemoryUsageByProcess(2ui64, -4i64, Process, 0i64);
  MiReturnCommit(ProcessPartition, 4 - v7);
  MiDeletePxeSharedLocks((INT64)p_Vm);
  MiDeleteWorkingSetList((INT64)p_Vm);
  Session = Process->Session;
  if( Session )
    MiReleaseProcessReferenceToSessionDataPage(Session);
  MmHotPatchContext = Process->MmHotPatchContext;
  if( MmHotPatchContext )
    ExFreePoolWithTag(MmHotPatchContext, 0);
  MiContractPagingFiles(ProcessPartition);
}

Referenced by:

No references.