ExpReleaseFastResourceShared

NTSTATUS __stdcall ExpReleaseFastResourceShared(PVOID BugCheckParameter2){
  INT64 v1; 
  WORK_QUEUE_TYPE v2; 
  void *v3; 
  INT64 v4; 
  unsigned __int8 CurrentIrql; 
  _QWORD *v7; 
  IO_WORKITEM_ROUTINE *v8; 
  __int64 v9; 
  _QWORD *v10; 
  NTSTATUS result; 
  _QWORD *v12; 
  __int64 v13; 
  _QWORD *v14; 
  __int64 v15; 
  _QWORD *v16; 
  __int128 LockHandle; 
  __int64 LockHandle_16; 
  INT64 v19; 
  INT64 v20; 
  INT64 v21; 
  LockHandle_16 = 0i64;
  v21 = 0i64;
  v4 = v1;
  v20 = 0i64;
  LODWORD(v19) = 0;
  LockHandle = 0i64;
  CurrentIrql = KeGetCurrentIrql();
  __writecr8(2ui64);
  if( !*(_BYTE *)(v1 + 18) )
  {
    v9 = *(_QWORD *)v1;
    v10 = *(_QWORD **)(v1 + 8);
    if( *(_QWORD *)(*(_QWORD *)v1 + 8i64) == v1 && *v10 == v1 )
      goto LABEL_5;
    goto LABEL_13;
  }
  v7 = (_QWORD *)(v1 + 40);
  *(_QWORD *)&LockHandle = 0i64;
  v8 = (IO_WORKITEM_ROUTINE *)((char *)BugCheckParameter2 + 96);
  *((_QWORD *)&LockHandle + 1) = (char *)BugCheckParameter2 + 96;
  if( (_QWORD *)*v7 != v7 )
  {
    KxAcquireQueuedSpinLock((PIO_WORKITEM)&LockHandle, v8, v2, v3);
    ExpRotateFastOwnerEntrySublistHead((INT64)BugCheckParameter2, v4, 1);
    KeReleaseInStackQueuedSpinLockFromDpcLevel((_KLOCK_QUEUE_HANDLE *)&LockHandle);
    v9 = *(_QWORD *)v4;
    v10 = *(_QWORD **)(v4 + 8);
    if( *(_QWORD *)(*(_QWORD *)v4 + 8i64) == v4 && *v10 == v4 )
    {
LABEL_5:
      *v10 = v9;
      *(_QWORD *)(v9 + 8) = v10;
      *(_QWORD *)v4 = 0i64;
      *(_QWORD *)(v4 + 8) = 0i64;
      result = CurrentIrql;
      __writecr8(CurrentIrql);
      goto LABEL_6;
    }
LABEL_13:
    __fastfail(3u);
  }
  KxAcquireQueuedSpinLock((PIO_WORKITEM)&LockHandle, v8, v2, v3);
  ExpPrepareToWakeResourceShared((INT64)BugCheckParameter2, &v21, &v20, &v19);
  v12 = (_QWORD *)(v4 + 56);
  v13 = *(_QWORD *)(v4 + 56);
  v14 = *(_QWORD **)(v4 + 64);
  if( *(_QWORD *)(v13 + 8) != v4 + 56 )
    goto LABEL_13;
  if( (_QWORD *)*v14 != v12 )
    goto LABEL_13;
  *v14 = v13;
  *(_QWORD *)(v13 + 8) = v14;
  *v12 = 0i64;
  *(_QWORD *)(v4 + 64) = 0i64;
  KeReleaseInStackQueuedSpinLockFromDpcLevel((_KLOCK_QUEUE_HANDLE *)&LockHandle);
  KeWakeWaitChain((const WCHAR *)&v21, 0i64, 2 * (v20 != 0) + 1);
  *(_BYTE *)(v4 + 18) = 0;
  v15 = *(_QWORD *)v4;
  v16 = *(_QWORD **)(v4 + 8);
  if( *(_QWORD *)(*(_QWORD *)v4 + 8i64) != v4 || *v16 != v4 )
    goto LABEL_13;
  *v16 = v15;
  *(_QWORD *)(v15 + 8) = v16;
  *(_QWORD *)v4 = 0i64;
  *(_QWORD *)(v4 + 8) = 0i64;
  *v7 = 0i64;
  *(_QWORD *)(v4 + 48) = 0i64;
  __writecr8(CurrentIrql);
  result = *(unsigned __int8 *)(v4 + 16);
  if( (_BYTE)result )
    KeAbPostReleaseEx(BugCheckParameter2, (PVOID)*(unsigned __int8 *)(v4 + 16));
LABEL_6:
  *(_BYTE *)(v4 + 17) &= 0xFAu;
  *(_BYTE *)(v4 + 16) = 0;
  *(_QWORD *)(v4 + 24) = 0i64;
  return result;
}

Referenced by:

ExReleaseFastResource
ExReleaseFastResourceShared