MiDereferenceSessionFinal

VOID __stdcall MiDereferenceSessionFinal(){
  UINT64 v0; 
  _ETHREAD *CurrentThread; 
  _EPROCESS *Process; 
  __int64 Session; 
  _MI_PARTITION *v4; 
  _MI_PARTITION *v5; 
  __int64 v6; 
  INT64 v7; 
  void *v8; 
  void *v9; 
  UINT64 v10; 
  void(__fastcall *v11)(_QWORD); 
  _ETHREAD *v12; 
  INT64 v13; 
  INT64 v14; 
  INT64 v15; 
  INT64 v16; 
  int v17; 
  _MM_SESSION_SPACE *v18; 
  VOID *v19; 
  _MI_DELETE_VA_INFO DeleteInfo; 
  __int128 v21; 
  __int128 v22; 
  int v23; 

  DeleteInfo = 0i64;
  v21 = 0i64;
  v22 = 0i64;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  Process = CurrentThread->Tcb.ApcState.Process;
  Session = (__int64)Process->Session;
  LODWORD(v4) = MiPartitionIdToPointer(*(_WORD *)(Session + 430), v0);
  v5 = v4;
  MiMarkSessionDeletePending(Session, v6, v7);
  if( *(_QWORD *)(Session + 80) )
  {
    KeSetEvent(*(PRKEVENT *)(Session + 72), 1, 0);
    ObCloseHandle(*(VOID **)(Session + 80), 0);
  }
  v11 = *(void(__fastcall **)(_QWORD))(Session + 680);
  if( (unsigned __int64)v11 > 1 )
    v11(0i64);
  MiSessionUnloadAllImages(v9, v8, v10);
  MiUnlinkSessionWorkingSet((_MM_SESSION_SPACE *)Session);
  v23 = *(_DWORD *)(Session + 8);
  v12 = (_ETHREAD *)KeGetCurrentThread();
  --v12->Tcb.KernelApcDisable;
  ExpWnfDeleteScopeById((_KSPIN_LOCK *)1, &v23, 4u);
  KeLeaveCriticalRegion();
  MiFreeSessionSpaceMap();
  v17 = *(_DWORD *)(Session + 4);
  if( (v17 & 1) != 0 )
  {
    ExCleanupSessionHeapManager(v14, v13, v15, v16);
    *(_DWORD *)(Session + 4) |= 0x100u;
    MiCheckSessionPoolAllocations();
    v17 = *(_DWORD *)(Session + 4);
  }
  if( (v17 & 0x180) == 128 )
    ExCleanupSessionHeapManager(v14, v13, v15, v16);
  --CurrentThread->Tcb.SpecialApcDisable;
  ExAcquirePushLockExclusiveEx(&Lock, 0i64);
  *(_DWORD *)(Session + 4) |= 0x20u;
  if( (_InterlockedExchangeAdd64(&Lock._bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
    ExfTryToWakePushLock(&Lock);
  KeAbPostRelease(&Lock);
  KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
  if( Process->SessionProcessLinks.Flink )
  {
    MiSessionUnlinkProcess(v18, Process);
    Process->SessionProcessLinks.Flink = 0i64;
  }
  MiDeleteSessionAddressSpace((_MM_SESSION_SPACE *)Session, &DeleteInfo);
  MiDetachProcessFromSession(0i64);
  MiReturnCommit(v5, *((_QWORD *)&v21 + 1) - *(_QWORD *)&DeleteInfo.ReducedCommitClonePages);
  MiReturnResident((INT64)v5, *(UINT64 *)&DeleteInfo.ResidentPages);
  MiReturnResident((INT64)v5, *(_QWORD *)(Session + 368));
  v19 = *(VOID **)(Session + 1048);
  if( v19 )
    ObfDereferenceObjectWithTag(v19, 0x73536D4Dui64);
  *(_QWORD *)(Session + 1048) = 0i64;
}

Referenced by:

MiDereferenceSession