MiUnlockAndDereferenceVad

VOID __stdcall MiUnlockAndDereferenceVad(_MMVAD_SHORT *Vad){
  signed __int32 v2; 
  unsigned int SessionId; 
  _BOOL4 v4; 
  _ETHREAD *CurrentThread; 
  _ETHREAD *v6; 
  int v7; 
  bool v8; 
  __int64 v9; 
  _KLOCK_ENTRY *v10; 
  __int64 v11; 
  unsigned __int8 AbAllocationRegionCount; 
  UINT64 a3; 

  v2 = _InterlockedDecrement(&Vad->ReferenceCount);
  SessionId = -1;
  if( v2 == -1 )
    __fastfail(0xEu);
  v4 = !v2 && (Vad->u.LongFlags & 4) != 0;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  CurrentThread->$84F33738BEE95ACDF5C5BF1C8FDC7C8C::_bf_0 &= ~0x80u;
  if( (_InterlockedExchangeAdd64(&Vad->PushLock._bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
    ExfTryToWakePushLock(&Vad->PushLock);
  LODWORD(a3) = 0;
  v6 = (_ETHREAD *)KeGetCurrentThread();
  if( MiGetSystemRegionType((UINT64)&Vad->PushLock) == 1 )
    SessionId = MmGetSessionIdEx(v6->Tcb.ApcState.Process);
  --v6->Tcb.SpecialApcDisable;
  ++v6->Tcb.AbAllocationRegionCount;
  v7 = ((char)v6->Tcb.AbEntrySummary | (char)v6->Tcb.AbOrphanedEntrySummary) ^ 0x3F;
  AbAllocationRegionCount = v6->Tcb.AbAllocationRegionCount;
  v8 = !_BitScanReverse((unsigned int *)&v9, v7);
  if( v8 )
    goto LABEL_30;
  while( 1 )
  {
    v10 = &v6->Tcb.LockEntries[v9];
    v7 &= ~(1 << v9);
    if( (v10->AcquiredByte & 1) != 0
      && (v10->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 & 1) == 0
      && (v10->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 & 0x7FFFFFFFFFFFFFFCi64) == ((unsigned __int64)&Vad->PushLock & 0x7FFFFFFFFFFFFFFCi64)
      && v10->LockState.SessionId == SessionId )
    {
      v10->AcquiredByte &= ~1u;
      if( v10->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 )
        break;
    }
    v8 = !_BitScanReverse((unsigned int *)&v9, v7);
    if( v8 )
      goto LABEL_30;
  }
  if( !v10 )
  {
LABEL_30:
    if( (*(&v6->Tcb.MiscFlags + 1) & 0x10000) == 0 )
      KeBugCheckEx(0x162u, v6, &Vad->PushLock, (PVOID)SessionId, 0i64);
  }
  else
  {
    v10->CrossThreadReleasableAndBusyByte |= 2u;
    if( v10->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 < 0 )
      KiAbEntryRemoveFromTree(v10);
    LODWORD(a3) = v10->BoostBitmap.AllFields & 0x1FFFF;
    v10->BoostBitmap.AllFields &= 0xFFFE0000;
    v10->ThreadLocalFlags &= ~1u;
    v10->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 = 0i64;
    v11 = v10 - v6->Tcb.LockEntries;
    if( AbAllocationRegionCount == 1 )
      v6->Tcb.AbEntrySummary |= 1 << v11;
    else
      _InterlockedOr8((volatile signed __int8 *)&v6->Tcb.AbOrphanedEntrySummary, 1 << v11);
  }
  --v6->Tcb.AbAllocationRegionCount;
  KiAbThreadRemoveBoosts(&v6->Tcb, &Vad->PushLock, &a3);
  v8 = v6->Tcb.SpecialApcDisable++ == -1;
  if( v8 && ($F25F8C4BA33AF922A5F1AF68CD89DDDF *)v6->Tcb.ApcState.ApcListHead[0].Flink != &v6->Tcb.152 )
    KiCheckForKernelApcDelivery();
  v8 = CurrentThread->Tcb.SpecialApcDisable++ == -1;
  if( v8
    && ($F25F8C4BA33AF922A5F1AF68CD89DDDF *)CurrentThread->Tcb.ApcState.ApcListHead[0].Flink != &CurrentThread->Tcb.152 )
  {
    KiCheckForKernelApcDelivery();
  }
  if( v4 )
    ExFreePoolWithTag(Vad, 0);
}

Referenced by:

MiAllocateFromSubAllocatedRegion
MiCfgInitializeProcess
MiCfgMarkValidEntries
MiCleanVad
MiCreateEnclave
MiDeleteAllHardwareEnclaves
MiDeprioritizeVad
MiFreeToSubAllocatedRegion
MiInitializeEnclave
MiLoadSectionIntoVsmEnclave
MiLockVadRange
MiMapLockedPagesInUserSpace
MiMapViewOfDataSection
MiObtainReferencedSecureVad
MiObtainReferencedVadEx
MiPerformImageHotPatch
MiProbeAndLockPages
MiProbeAndLockPrepare
MiProcessVaRangesInfoClass
MiReserveUserMemory
MiScrubProcessLargePages
MiSetImageHotPatchAllowed
MiUnmapLockedPagesInUserSpace
MiUnmapViewOfSection
MmFreeVirtualMemory
MmProtectVirtualMemory
MmQueryVirtualMemory
MmRotatePhysicalView
MmSecureVirtualMemoryAgainstWrites
MmSecureVirtualMemoryEx
MmSelectVsmEnclaveByAddress
MmSetGraphicsPtes
MmStoreAllocateVirtualMemory
MmUnsecureVirtualMemory
MmUpdateUserShadowStackValue
NtGetWriteWatch
NtLoadEnclaveData
NtResetWriteWatch
NtTerminateEnclave