ExTryToConvertFastResourceSharedToExclusive

CHAR __fastcall ExTryToConvertFastResourceSharedToExclusive(INT64 BugCheckParameter2, INT64 a2){
  unsigned __int8 CurrentIrql; 
  _ETHREAD *CurrentThread; 
  _ETHREAD *v6; 
  char v7; 
  unsigned __int8 v8; 
  CHAR v9; 
  _KLOCK_QUEUE_HANDLE LockQueue; 

  *(_QWORD *)&LockQueue.OldIrql = 0i64;
  if( (*(_BYTE *)(BugCheckParameter2 + 26) & 1) == 0 )
    KeBugCheckEx(0x1C6u, (PVOID)3, (PVOID)BugCheckParameter2, 0i64, 0i64);
  CurrentIrql = KeGetCurrentIrql();
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  if( CurrentIrql > 1u )
    KeBugCheckEx(0x1C6u, 0i64, (PVOID)CurrentIrql, (PVOID)1, 0i64);
  if( !CurrentIrql && (CurrentThread->Tcb._bf_0 & 0x400) == 0 && !CurrentThread->Tcb.WaitBlock[3].SpareLong )
    KeBugCheckEx(0x1C6u, (PVOID)7, 0i64, 0i64, 0i64);
  v6 = *(_ETHREAD **)(a2 + 32);
  if( v6 != CurrentThread )
    KeBugCheckEx(0x1C6u, (PVOID)9, (PVOID)a2, v6, 0i64);
  if( *(_QWORD *)(a2 + 24) != BugCheckParameter2 )
    KeBugCheckEx(0x1C6u, (PVOID)8, (PVOID)BugCheckParameter2, (PVOID)a2, *(PVOID *)(a2 + 24));
  v7 = *(_BYTE *)(a2 + 17);
  if( (v7 & 1) != 0 )
    KeBugCheckEx(0x1C6u, (PVOID)0xA, (PVOID)a2, 0i64, 0i64);
  if( (v7 & 4) != 0 )
    KeBugCheckEx(0x1C6u, (PVOID)0xB, (PVOID)a2, (PVOID)((unsigned __int64)(v7 & 4) << 14), 0i64);
  if( !*(_BYTE *)(a2 + 18) || *(_QWORD *)(a2 + 40) != a2 + 40 )
    KeBugCheckEx(0x1C6u, (PVOID)0x13, (PVOID)BugCheckParameter2, 0i64, 0i64);
  v8 = KeGetCurrentIrql();
  __writecr8(2ui64);
  LockQueue.LockQueue.Next = 0i64;
  LockQueue.LockQueue.Lock = (unsigned __int64 *volatile)(BugCheckParameter2 + 96);
  KxAcquireQueuedSpinLock(&LockQueue.LockQueue, (UINT64 *)(BugCheckParameter2 + 96));
  v9 = ExpTryUpgradeResource(BugCheckParameter2);
  KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockQueue);
  if( v9 )
    *(_BYTE *)(a2 + 17) |= 4u;
  __writecr8(v8);
  return v9;
}

Referenced by:

No references.