ExDeleteResourceLite

INT64 __fastcall ExDeleteResourceLite(INT64 a1, UINT64 *a2, UINT64 a3, INT64 a4, VOID *UniqueOwnerId){
  unsigned __int8 CurrentIrql; 
  signed __int32 v7; 
  __int64 v8; 
  _QWORD *v9; 
  ULONG_PTR v10; 
  __int64 *v11; 
  int v13; 
  unsigned int v14; 
  __int64 *i; 
  _ETHREAD *v16; 
  bool v17; 
  signed __int32 v18; 
  int v19; 
  UINT64 SpinCount; 
  if( (*(_BYTE *)(a1 + 26) & 1) != 0 )
    KeBugCheckEx(0x1C6u, 0xEui64, a1, 0i64, 0i64);
  __incgsdword(0x8660u);
  CurrentIrql = KeGetCurrentIrql();
  __writecr8(2ui64);
  LODWORD(SpinCount) = 0;
  if( _interlockedbittestandset(&ExpResourceSpinLock, 0x1Fu) )
    LODWORD(SpinCount) = ExpWaitForSpinLockExclusiveAndAcquire(
                           (RTL_BITMAP *)&ExpResourceSpinLock,
                           CurrentIrql,
                           (UINT64 *)a3);
  v7 = ExpResourceSpinLock;
  while( (v7 & 0xBFFFFFFF) != 0x80000000 )
  {
    if( (v7 & 0x40000000) == 0 )
    {
      v18 = _InterlockedCompareExchange(&ExpResourceSpinLock, v7 | 0x40000000, v7);
      v17 = v7 == v18;
      v7 = v18;
      if( !v17 )
        continue;
    }
    KeYieldProcessorEx(&SpinCount);
    v7 = ExpResourceSpinLock;
  }
  v8 = *(_QWORD *)a1;
  v9 = *(_QWORD **)(a1 + 8);
  if( *(_QWORD *)(*(_QWORD *)a1 + 8i64) != a1 || *v9 != a1 )
    __fastfail(3u);
  *v9 = v8;
  *(_QWORD *)(v8 + 8) = v9;
  ExpResourceSpinLock = 0;
  __writecr8(CurrentIrql);
  *(_QWORD *)a1 = 0i64;
  *(_QWORD *)(a1 + 8) = 0i64;
  v10 = *(_QWORD *)(a1 + 48);
  if( (*(_DWORD *)(a1 + 56) & 2) != 0 )
  {
    v10 &= 0xFFFFFFFFFFFFFFFCui64;
  }
  else if( (v10 & 3) != 0 )
  {
    goto LABEL_10;
  }
  if( v10 )
  {
    if( ExpResourceEnforcesOwnershipTransfer(a1)
      && (*(_DWORD *)(a1 + 56) & 2) == 0
      && (struct _KTHREAD *)v10 != KeGetCurrentThread() )
    {
      KeBugCheckEx(0x16Eu, a1, (ULONG_PTR)KeGetCurrentThread(), v10, 1ui64);
    }
    v13 = *(_DWORD *)(a1 + 56);
    if( (v13 & 1) != 0 )
    {
      PsBoostThreadIoEx(v10, 1, 0, 0i64);
      v13 = *(_DWORD *)(a1 + 56);
    }
    if( (v13 & 4) != 0 )
    {
      PsBoostThreadIoQoS(v10, 1);
      v13 = *(_DWORD *)(a1 + 56);
    }
    if( (v13 & 2) != 0 )
      ObDereferenceObjectDeferDeleteWithTag((PVOID)v10, 0x746C6644ui64);
  }
LABEL_10:
  v11 = *(__int64 **)(a1 + 16);
  if( v11 )
  {
    v14 = 1;
    for( i = v11 + 1; v14 < *((_DWORD *)v11 + 2); ++v14 )
    {
      i += 2;
      v16 = (_ETHREAD *)ExpOwnerEntryToThread(i - 1);
      if( v16 )
      {
        if( ExpResourceEnforcesOwnershipTransfer(a1)
          && (*(_DWORD *)i & 2) == 0
          && v16 != (_ETHREAD *)KeGetCurrentThread() )
        {
          KeBugCheckEx(0x16Eu, a1, (ULONG_PTR)KeGetCurrentThread(), (ULONG_PTR)v16, 2ui64);
        }
        v19 = *(_DWORD *)i;
        if( (*(_DWORD *)i & 1) != 0 )
        {
          PsBoostThreadIoEx((__int64)v16, 1, 0, 0i64);
          v19 = *(_DWORD *)i;
        }
        if( (v19 & 4) != 0 )
        {
          PsBoostThreadIoQoS((__int64)v16, 1);
          v19 = *(_DWORD *)i;
        }
        if( (v19 & 2) != 0 )
          ObDereferenceObjectDeferDeleteWithTag(v16, 0x746C6644ui64);
      }
      v11 = *(__int64 **)(a1 + 16);
    }
    ExFreeHeapPool(v11);
  }
  return 0i64;
}

Referenced by:

CcDeallocateBcb
CmpInitCmRM
DrvDbCreateDatabaseNode
DrvDbDestroyDatabaseNode
DrvDbOpenContext
MUIInitializeResourceLock
PiDrvDbDestroyNode
PnpCtxCloseMachine
PspJobDelete
RtlCreateHeap
RtlDestroyHeap
SepTokenDeleteMethod
TtmpDeleteQueue