ExpReleaseDisownedFastResourceExclusive

NTSTATUS __fastcall ExpReleaseDisownedFastResourceExclusive(__int64 a1, __int64 a2){
  unsigned __int8 CurrentIrql; 
  UINT64 v5; 
  __int64 v6; 
  _QWORD *v7; 
  _QWORD *v8; 
  UINT64 *v9; 
  NTSTATUS result; 
  _QWORD *v11; 
  __int64 v12; 
  _QWORD *v13; 
  __int64 v14; 
  _QWORD *v15; 
  _KLOCK_QUEUE_HANDLE v16; 
  _KLOCK_QUEUE_HANDLE LockQueue; 
  INT64 v18; 
  INT64 v19; 
  INT64 v20; 

  v20 = 0i64;
  v19 = 0i64;
  LODWORD(v18) = 0;
  *(_QWORD *)&LockQueue.OldIrql = 0i64;
  memset(&v16, 0, sizeof(v16));
  CurrentIrql = KeGetCurrentIrql();
  __writecr8(2ui64);
  v5 = *(_QWORD *)(a2 + 32);
  LockQueue.LockQueue.Next = 0i64;
  LockQueue.LockQueue.Lock = (unsigned __int64 *volatile)(v5 + 1592);
  KxAcquireQueuedSpinLock(&LockQueue.LockQueue, (UINT64 *)(v5 + 1592));
  if( !*(_BYTE *)(a2 + 18) )
  {
    v6 = *(_QWORD *)a2;
    v7 = *(_QWORD **)(a2 + 8);
    if( *(_QWORD *)(*(_QWORD *)a2 + 8i64) != a2 || *v7 != a2 )
      goto LABEL_4;
    goto LABEL_8;
  }
  v8 = (_QWORD *)(a2 + 40);
  v16.LockQueue.Next = 0i64;
  v9 = (UINT64 *)(a1 + 96);
  v16.LockQueue.Lock = (unsigned __int64 *volatile)(a1 + 96);
  if( (_QWORD *)*v8 != v8 )
  {
    KxAcquireQueuedSpinLock(&v16.LockQueue, v9);
    ExpRotateFastOwnerEntrySublistHead(a1, a2, 1);
    KeReleaseInStackQueuedSpinLockFromDpcLevel(&v16);
    v6 = *(_QWORD *)a2;
    v7 = *(_QWORD **)(a2 + 8);
    if( *(_QWORD *)(*(_QWORD *)a2 + 8i64) == a2 && *v7 == a2 )
    {
LABEL_8:
      *v7 = v6;
      *(_QWORD *)(v6 + 8) = v7;
      *(_QWORD *)a2 = 0i64;
      *(_QWORD *)(a2 + 8) = 0i64;
      KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockQueue);
      result = CurrentIrql;
      __writecr8(CurrentIrql);
      goto LABEL_16;
    }
LABEL_4:
    __fastfail(3u);
  }
  KxAcquireQueuedSpinLock(&v16.LockQueue, v9);
  ExpPrepareToWakeResourceExclusive(a1, &v20, &v19, &v18);
  v11 = (_QWORD *)(a2 + 56);
  v12 = *(_QWORD *)(a2 + 56);
  v13 = *(_QWORD **)(a2 + 64);
  if( *(_QWORD *)(v12 + 8) != a2 + 56 )
    goto LABEL_4;
  if( (_QWORD *)*v13 != v11 )
    goto LABEL_4;
  *v13 = v12;
  *(_QWORD *)(v12 + 8) = v13;
  *v11 = 0i64;
  *(_QWORD *)(a2 + 64) = 0i64;
  KeReleaseInStackQueuedSpinLockFromDpcLevel(&v16);
  *(_BYTE *)(a2 + 18) = 0;
  v14 = *(_QWORD *)a2;
  v15 = *(_QWORD **)(a2 + 8);
  if( *(_QWORD *)(*(_QWORD *)a2 + 8i64) != a2 || *v15 != a2 )
    goto LABEL_4;
  *v15 = v14;
  *(_QWORD *)(v14 + 8) = v15;
  *(_QWORD *)a2 = 0i64;
  *(_QWORD *)(a2 + 8) = 0i64;
  *v8 = 0i64;
  *(_QWORD *)(a2 + 48) = 0i64;
  KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockQueue);
  KeWakeWaitChain((_KWAIT_CHAIN *)&v20, 0i64, 2 * (unsigned int)(v19 != 0) + 1);
  __writecr8(CurrentIrql);
  if( *(_BYTE *)(a2 + 16) )
    KeAbCrossThreadRelease(a1, *(unsigned __int8 *)(a2 + 16), v5);
  result = ObfDereferenceObjectWithTag(*(VOID **)(a2 + 32), 0x746C6644ui64);
LABEL_16:
  *(_BYTE *)(a2 + 17) &= 0xFAu;
  *(_BYTE *)(a2 + 16) = 0;
  *(_QWORD *)(a2 + 24) = 0i64;
  return result;
}

Referenced by:

ExReleaseDisownedFastResource
ExReleaseDisownedFastResourceExclusive
ExReleaseDisownedFastResourceShared