ExpReleaseDisownedFastResourceExclusive

INT64 __stdcall ExpReleaseDisownedFastResourceExclusive(UINT64 *a1, INT64 a2){
  WORK_QUEUE_TYPE v2; 
  void *v3; 
  unsigned __int8 CurrentIrql; 
  UINT64 v7; 
  WORK_QUEUE_TYPE v8; 
  void *v9; 
  __int64 v10; 
  _QWORD *v11; 
  _QWORD *v12; 
  IO_WORKITEM_ROUTINE *v13; 
  INT64 result; 
  _QWORD *v15; 
  __int64 v16; 
  _QWORD *v17; 
  __int64 v18; 
  _QWORD *v19; 
  struct _KLOCK_QUEUE_HANDLE LockHandle; 
  struct _KLOCK_QUEUE_HANDLE v21; 
  INT64 v22; 
  INT64 v23; 
  INT64 v24; 
  v24 = 0i64;
  v23 = 0i64;
  LODWORD(v22) = 0;
  *(_QWORD *)&v21.OldIrql = 0i64;
  memset(&LockHandle, 0, sizeof(LockHandle));
  CurrentIrql = KeGetCurrentIrql();
  __writecr8(2ui64);
  v7 = *(_QWORD *)(a2 + 32);
  v21.LockQueue.Next = 0i64;
  v21.LockQueue.Lock = (unsigned __int64 *volatile)(v7 + 1592);
  KxAcquireQueuedSpinLock((PIO_WORKITEM)&v21, (PIO_WORKITEM_ROUTINE)(v7 + 1592), v2, v3);
  if( !*(_BYTE *)(a2 + 18) )
  {
    v10 = *(_QWORD *)a2;
    v11 = *(_QWORD **)(a2 + 8);
    if( *(_QWORD *)(*(_QWORD *)a2 + 8i64) != a2 || *v11 != a2 )
      goto LABEL_4;
    goto LABEL_8;
  }
  v12 = (_QWORD *)(a2 + 40);
  LockHandle.LockQueue.Next = 0i64;
  v13 = (IO_WORKITEM_ROUTINE *)(a1 + 12);
  LockHandle.LockQueue.Lock = a1 + 12;
  if( (_QWORD *)*v12 != v12 )
  {
    KxAcquireQueuedSpinLock((PIO_WORKITEM)&LockHandle, v13, v8, v9);
    ExpRotateFastOwnerEntrySublistHead((INT64)a1, a2, 1);
    KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
    v10 = *(_QWORD *)a2;
    v11 = *(_QWORD **)(a2 + 8);
    if( *(_QWORD *)(*(_QWORD *)a2 + 8i64) == a2 && *v11 == a2 )
    {
LABEL_8:
      *v11 = v10;
      *(_QWORD *)(v10 + 8) = v11;
      *(_QWORD *)a2 = 0i64;
      *(_QWORD *)(a2 + 8) = 0i64;
      KeReleaseInStackQueuedSpinLockFromDpcLevel(&v21);
      result = CurrentIrql;
      __writecr8(CurrentIrql);
      goto LABEL_16;
    }
LABEL_4:
    __fastfail(3u);
  }
  KxAcquireQueuedSpinLock((PIO_WORKITEM)&LockHandle, v13, v8, v9);
  ExpPrepareToWakeResourceExclusive((INT64)a1, &v24, &v23, &v22);
  v15 = (_QWORD *)(a2 + 56);
  v16 = *(_QWORD *)(a2 + 56);
  v17 = *(_QWORD **)(a2 + 64);
  if( *(_QWORD *)(v16 + 8) != a2 + 56 )
    goto LABEL_4;
  if( (_QWORD *)*v17 != v15 )
    goto LABEL_4;
  *v17 = v16;
  *(_QWORD *)(v16 + 8) = v17;
  *v15 = 0i64;
  *(_QWORD *)(a2 + 64) = 0i64;
  KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
  *(_BYTE *)(a2 + 18) = 0;
  v18 = *(_QWORD *)a2;
  v19 = *(_QWORD **)(a2 + 8);
  if( *(_QWORD *)(*(_QWORD *)a2 + 8i64) != a2 || *v19 != a2 )
    goto LABEL_4;
  *v19 = v18;
  *(_QWORD *)(v18 + 8) = v19;
  *(_QWORD *)a2 = 0i64;
  *(_QWORD *)(a2 + 8) = 0i64;
  *v12 = 0i64;
  *(_QWORD *)(a2 + 48) = 0i64;
  KeReleaseInStackQueuedSpinLockFromDpcLevel(&v21);
  KeWakeWaitChain((const WCHAR *)&v24, 0i64, 2 * (v23 != 0) + 1);
  __writecr8(CurrentIrql);
  if( *(_BYTE *)(a2 + 16) )
    KeAbCrossThreadRelease((INT64)a1, *(unsigned __int8 *)(a2 + 16), v7);
  LODWORD(result) = ObfDereferenceObjectWithTag(*(PVOID *)(a2 + 32), 0x746C6644ui64);
LABEL_16:
  *(_BYTE *)(a2 + 17) &= 0xFAu;
  *(_BYTE *)(a2 + 16) = 0;
  *(_QWORD *)(a2 + 24) = 0i64;
  return result;
}

Referenced by:

ExReleaseDisownedFastResource
ExReleaseDisownedFastResourceExclusive
ExReleaseDisownedFastResourceShared