ExDeleteResourceLite

NTSTATUS __fastcall ExDeleteResourceLite(UINT64 a1){
  UINT8 CurrentIrql; 
  signed __int32 v3; 
  __int64 v4; 
  _QWORD *v5; 
  unsigned __int64 v6; 
  int *v7; 
  int v9; 
  unsigned int v10; 
  int *i; 
  _ETHREAD *v12; 
  bool v13; 
  signed __int32 v14; 
  int v15; 
  UINT64 SpinCount; 

  if( (*(_BYTE *)(a1 + 26) & 1) != 0 )
    KeBugCheckEx(0x1C6u, (PVOID)0xE, (PVOID)a1, 0i64, 0i64);
  __incgsdword(0x8660u);
  CurrentIrql = KeGetCurrentIrql();
  __writecr8(2ui64);
  LODWORD(SpinCount) = 0;
  if( _interlockedbittestandset((volatile signed __int32 *)&ExpResourceSpinLock, 0x1Fu) )
    LODWORD(SpinCount) = ExpWaitForSpinLockExclusiveAndAcquire(&ExpResourceSpinLock, CurrentIrql);
  v3 = ExpResourceSpinLock;
  while( (v3 & 0xBFFFFFFF) != 0x80000000 )
  {
    if( (v3 & 0x40000000) == 0 )
    {
      v14 = _InterlockedCompareExchange((volatile signed __int32 *)&ExpResourceSpinLock, v3 | 0x40000000, v3);
      v13 = v3 == v14;
      v3 = v14;
      if( !v13 )
        continue;
    }
    KeYieldProcessorEx(&SpinCount);
    v3 = ExpResourceSpinLock;
  }
  v4 = *(_QWORD *)a1;
  v5 = *(_QWORD **)(a1 + 8);
  if( *(_QWORD *)(*(_QWORD *)a1 + 8i64) != a1 || *v5 != a1 )
    __fastfail(3u);
  *v5 = v4;
  *(_QWORD *)(v4 + 8) = v5;
  LODWORD(ExpResourceSpinLock) = 0;
  __writecr8(CurrentIrql);
  *(_QWORD *)a1 = 0i64;
  *(_QWORD *)(a1 + 8) = 0i64;
  v6 = *(_QWORD *)(a1 + 48);
  if( (*(_DWORD *)(a1 + 56) & 2) != 0 )
  {
    v6 &= 0xFFFFFFFFFFFFFFFCui64;
  }
  else if( (v6 & 3) != 0 )
  {
    goto LABEL_10;
  }
  if( v6 )
  {
    if( ExpResourceEnforcesOwnershipTransfer(a1)
      && (*(_DWORD *)(a1 + 56) & 2) == 0
      && (struct _KTHREAD *)v6 != KeGetCurrentThread() )
    {
      KeBugCheckEx(0x16Eu, (PVOID)a1, KeGetCurrentThread(), (PVOID)v6, (PVOID)1);
    }
    v9 = *(_DWORD *)(a1 + 56);
    if( (v9 & 1) != 0 )
    {
      PsBoostThreadIoEx((_ETHREAD *)v6, 1u, 0, 0i64);
      v9 = *(_DWORD *)(a1 + 56);
    }
    if( (v9 & 4) != 0 )
    {
      PsBoostThreadIoQoS((_ETHREAD *)v6, 1ui64);
      v9 = *(_DWORD *)(a1 + 56);
    }
    if( (v9 & 2) != 0 )
      ObDereferenceObjectDeferDeleteWithTag(v6, 1953261124i64);
  }
LABEL_10:
  v7 = *(int **)(a1 + 16);
  if( v7 )
  {
    v10 = 1;
    for( i = v7 + 2; v10 < v7[2]; ++v10 )
    {
      i += 4;
      v12 = ExpOwnerEntryToThread((_OWNER_ENTRY *)(i - 2));
      if( v12 )
      {
        if( ExpResourceEnforcesOwnershipTransfer(a1) && (*i & 2) == 0 && v12 != (_ETHREAD *)KeGetCurrentThread() )
          KeBugCheckEx(0x16Eu, (PVOID)a1, KeGetCurrentThread(), v12, (PVOID)2);
        v15 = *i;
        if( (*i & 1) != 0 )
        {
          PsBoostThreadIoEx(v12, 1u, 0, 0i64);
          v15 = *i;
        }
        if( (v15 & 4) != 0 )
        {
          PsBoostThreadIoQoS(v12, 1ui64);
          v15 = *i;
        }
        if( (v15 & 2) != 0 )
          ObDereferenceObjectDeferDeleteWithTag((UINT64)v12, 1953261124i64);
      }
      v7 = *(int **)(a1 + 16);
    }
    ExFreeHeapPool(v7);
  }
  return 0;
}

Referenced by:

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