ExpReleaseFastResourceShared

NTSTATUS __stdcall ExpReleaseFastResourceShared(PVOID BugCheckParameter2){
  __int64 v1; 
  __int64 v2; 
  unsigned __int8 CurrentIrql; 
  _QWORD *v5; 
  UINT64 *v6; 
  __int64 v7; 
  _QWORD *v8; 
  NTSTATUS result; 
  _QWORD *v10; 
  __int64 v11; 
  _QWORD *v12; 
  __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) )
  {
    v7 = *(_QWORD *)v1;
    v8 = *(_QWORD **)(v1 + 8);
    if( *(_QWORD *)(*(_QWORD *)v1 + 8i64) == v1 && *v8 == v1 )
      goto LABEL_5;
    goto LABEL_13;
  }
  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);
    v7 = *(_QWORD *)v2;
    v8 = *(_QWORD **)(v2 + 8);
    if( *(_QWORD *)(*(_QWORD *)v2 + 8i64) == v2 && *v8 == v2 )
    {
LABEL_5:
      *v8 = v7;
      *(_QWORD *)(v7 + 8) = v8;
      *(_QWORD *)v2 = 0i64;
      *(_QWORD *)(v2 + 8) = 0i64;
      result = CurrentIrql;
      __writecr8(CurrentIrql);
      goto LABEL_6;
    }
LABEL_13:
    __fastfail(3u);
  }
  KxAcquireQueuedSpinLock(&LockQueue.LockQueue, v6);
  ExpPrepareToWakeResourceShared((INT64)BugCheckParameter2, &v18, &v17, &v16);
  v10 = (_QWORD *)(v2 + 56);
  v11 = *(_QWORD *)(v2 + 56);
  v12 = *(_QWORD **)(v2 + 64);
  if( *(_QWORD *)(v11 + 8) != v2 + 56 )
    goto LABEL_13;
  if( (_QWORD *)*v12 != v10 )
    goto LABEL_13;
  *v12 = v11;
  *(_QWORD *)(v11 + 8) = v12;
  *v10 = 0i64;
  *(_QWORD *)(v2 + 64) = 0i64;
  KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockQueue);
  KeWakeWaitChain((_KWAIT_CHAIN *)&v18, 0i64, 2 * (unsigned int)(v17 != 0) + 1);
  *(_BYTE *)(v2 + 18) = 0;
  v13 = *(_QWORD *)v2;
  v14 = *(_QWORD **)(v2 + 8);
  if( *(_QWORD *)(*(_QWORD *)v2 + 8i64) != v2 || *v14 != v2 )
    goto LABEL_13;
  *v14 = v13;
  *(_QWORD *)(v13 + 8) = v14;
  *(_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_6:
  *(_BYTE *)(v2 + 17) &= 0xFAu;
  *(_BYTE *)(v2 + 16) = 0;
  *(_QWORD *)(v2 + 24) = 0i64;
  return result;
}

Referenced by:

ExReleaseFastResource
ExReleaseFastResourceShared