ExpReleaseFastResourceExclusive

NTSTATUS __stdcall ExpReleaseFastResourceExclusive(PVOID BugCheckParameter2){
  __int64 v1; 
  __int64 v2; 
  unsigned __int8 CurrentIrql; 
  _QWORD *v5; 
  UINT64 *v6; 
  _QWORD *v7; 
  __int64 v8; 
  _QWORD *v9; 
  __int64 v10; 
  _QWORD *v11; 
  NTSTATUS result; 
  __int64 v13; 
  _QWORD *v14; 
  _KLOCK_QUEUE_HANDLE LockQueue; 
  INT64 v16; 
  INT64 v17; 
  INT64 v18; 

  v18 = 0i64;
  v2 = v1;
  v17 = 0i64;
  LODWORD(v16) = 0;
  memset(&LockQueue, 0, sizeof(LockQueue));
  CurrentIrql = KeGetCurrentIrql();
  __writecr8(2ui64);
  if( !*(_BYTE *)(v1 + 18) )
  {
    v13 = *(_QWORD *)v1;
    v14 = *(_QWORD **)(v1 + 8);
    if( *(_QWORD *)(*(_QWORD *)v1 + 8i64) == v1 && *v14 == v1 )
      goto LABEL_12;
    goto LABEL_15;
  }
  v5 = (_QWORD *)(v1 + 40);
  LockQueue.LockQueue.Next = 0i64;
  v6 = (UINT64 *)((char *)BugCheckParameter2 + 96);
  LockQueue.LockQueue.Lock = (unsigned __int64 *volatile)((char *)BugCheckParameter2 + 96);
  if( (_QWORD *)*v5 != v5 )
  {
    KxAcquireQueuedSpinLock(&LockQueue.LockQueue, v6);
    ExpRotateFastOwnerEntrySublistHead((__int64)BugCheckParameter2, v2, 1);
    KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockQueue);
    v13 = *(_QWORD *)v2;
    v14 = *(_QWORD **)(v2 + 8);
    if( *(_QWORD *)(*(_QWORD *)v2 + 8i64) == v2 && *v14 == v2 )
    {
LABEL_12:
      *v14 = v13;
      *(_QWORD *)(v13 + 8) = v14;
      *(_QWORD *)v2 = 0i64;
      *(_QWORD *)(v2 + 8) = 0i64;
      result = CurrentIrql;
      __writecr8(CurrentIrql);
      goto LABEL_9;
    }
LABEL_15:
    __fastfail(3u);
  }
  KxAcquireQueuedSpinLock(&LockQueue.LockQueue, v6);
  ExpPrepareToWakeResourceExclusive((INT64)BugCheckParameter2, &v18, &v17, &v16);
  v7 = (_QWORD *)(v2 + 56);
  v8 = *(_QWORD *)(v2 + 56);
  v9 = *(_QWORD **)(v2 + 64);
  if( *(_QWORD *)(v8 + 8) != v2 + 56 )
    goto LABEL_15;
  if( (_QWORD *)*v9 != v7 )
    goto LABEL_15;
  *v9 = v8;
  *(_QWORD *)(v8 + 8) = v9;
  *v7 = 0i64;
  *(_QWORD *)(v2 + 64) = 0i64;
  KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockQueue);
  KeWakeWaitChain((_KWAIT_CHAIN *)&v18, 0i64, 2 * (unsigned int)(v17 != 0) + 1);
  *(_BYTE *)(v2 + 18) = 0;
  v10 = *(_QWORD *)v2;
  v11 = *(_QWORD **)(v2 + 8);
  if( *(_QWORD *)(*(_QWORD *)v2 + 8i64) != v2 || *v11 != v2 )
    goto LABEL_15;
  *v11 = v10;
  *(_QWORD *)(v10 + 8) = v11;
  *(_QWORD *)v2 = 0i64;
  *(_QWORD *)(v2 + 8) = 0i64;
  *v5 = 0i64;
  *(_QWORD *)(v2 + 48) = 0i64;
  __writecr8(CurrentIrql);
  result = *(unsigned __int8 *)(v2 + 16);
  if( (_BYTE)result )
    KeAbPostReleaseEx(BugCheckParameter2, (VOID *)*(unsigned __int8 *)(v2 + 16));
LABEL_9:
  *(_BYTE *)(v2 + 17) &= 0xFAu;
  *(_BYTE *)(v2 + 16) = 0;
  *(_QWORD *)(v2 + 24) = 0i64;
  return result;
}

Referenced by:

ExReleaseFastResource
ExReleaseFastResourceExclusive
ExReleaseFastResourceShared