ExAcquireFastResourceExclusive

NTSTATUS __stdcall ExAcquireFastResourceExclusive(PVOID BugCheckParameter2, PVOID a2){
  char v2; 
  char v3; 
  _BYTE *v6; 
  unsigned __int8 v7; 
  _ETHREAD *CurrentThread; 
  unsigned __int8 CurrentIrql; 
  _ETHREAD *v10; 
  ULONG_PTR v11; 
  ULONG_PTR v12; 
  unsigned __int8 v13; 
  _BYTE *v14; 
  WORK_QUEUE_TYPE v15; 
  void *v16; 
  CHAR v17; 
  PVOID *v18; 
  _QWORD *v19; 
  INT64 v20; 
  NTSTATUS result; 
  PVOID *v22; 
  _QWORD *v23; 
  INT64 v24; 
  INT64 *FastOwnerEntryForThread; 
  PVOID *v26; 
  INT64 *v27; 
  struct _IO_WORKITEM LockHandle; 
  INT64 v29; 
  v3 = v2;
  v6 = 0i64;
  v7 = 2 - (v2 != 0);
  memset(&LockHandle, 0, 72);
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v29 = (INT64)CurrentThread;
  if( (*((_BYTE *)BugCheckParameter2 + 26) & 1) == 0 )
    KeBugCheckEx(0x1C6u, 3ui64, (ULONG_PTR)BugCheckParameter2, 0i64, 0i64);
  CurrentIrql = KeGetCurrentIrql();
  v10 = (_ETHREAD *)KeGetCurrentThread();
  if( CurrentIrql > v7 )
    KeBugCheckEx(0x1C6u, 0i64, CurrentIrql, v7, 0i64);
  if( CurrentIrql >= 2u && (*((_DWORD *)KeGetPcr() + 3243) & 0x10001) != 0 )
    KeBugCheckEx(0x1C6u, 5ui64, 0i64, 0i64, 0i64);
  if( (*((_BYTE *)v10 + 192) & 2) != 0 )
    KeBugCheckEx(0x1C6u, 6ui64, 0i64, 0i64, 0i64);
  if( !CurrentIrql && (*((_DWORD *)v10 + 29) & 0x400) == 0 && !*((_DWORD *)v10 + 121) )
    KeBugCheckEx(0x1C6u, 7ui64, 0i64, 0i64, 0i64);
  v11 = *((_QWORD *)a2 + 4);
  if( (_ETHREAD *)v11 != v10 )
    KeBugCheckEx(0x1C6u, 9ui64, (ULONG_PTR)a2, v11, 0i64);
  v12 = *((_QWORD *)a2 + 3);
  if( v12 )
    KeBugCheckEx(0x1C6u, 2ui64, (ULONG_PTR)a2, v12, 0i64);
  *((_BYTE *)a2 + 17) |= 4u;
  *((_QWORD *)a2 + 3) = BugCheckParameter2;
  v13 = KeGetCurrentIrql();
  __writecr8(2ui64);
  if( *((char *)BugCheckParameter2 + 26) < 0 )
  {
    FastOwnerEntryForThread = ExpFindFastOwnerEntryForThread((INT64)CurrentThread, (INT64)BugCheckParameter2, 0, 0);
    if( FastOwnerEntryForThread )
    {
      v26 = (PVOID *)FastOwnerEntryForThread[6];
      v27 = FastOwnerEntryForThread + 5;
      if( *v26 == v27 )
      {
        *(_QWORD *)a2 = v27;
        v17 = 1;
        *((_QWORD *)a2 + 1) = v26;
        *v26 = a2;
        v27[1] = (INT64)a2;
        goto LABEL_16;
      }
      goto LABEL_41;
    }
  }
  LODWORD(v14) = KeAbPreAcquire(BugCheckParameter2, 0i64, v3 == 0);
  v6 = v14;
  if( v14 )
    *((_BYTE *)a2 + 16) = (2 * ((__int64)&v14[-*(_QWORD *)&v14[-16 * (unsigned __int8)v14[24] + 800]] / 96)) | 1;
  LockHandle.WorkItem.List.Flink = 0i64;
  LockHandle.WorkItem.List.Blink = (_LIST_ENTRY *)((char *)BugCheckParameter2 + 96);
  KxAcquireQueuedSpinLock(&LockHandle, (PIO_WORKITEM_ROUTINE)((char *)BugCheckParameter2 + 96), v15, v16);
  v17 = ExpTryAcquireResourceExclusive((INT64)BugCheckParameter2);
  if( v17 )
  {
    v18 = (PVOID *)*((_QWORD *)BugCheckParameter2 + 7);
    v19 = (char *)a2 + 56;
    if( *v18 == (char *)BugCheckParameter2 + 48 )
    {
      *v19 = (char *)BugCheckParameter2 + 48;
      *((_QWORD *)a2 + 8) = v18;
      *v18 = v19;
      *((_QWORD *)BugCheckParameter2 + 7) = v19;
      KeReleaseInStackQueuedSpinLockFromDpcLevel((_KLOCK_QUEUE_HANDLE *)&LockHandle);
      ExpAddFastOwnerEntryToThreadList(v29, v20, 0, (INT64)a2);
LABEL_16:
      result = v13;
      __writecr8(v13);
      goto LABEL_17;
    }
LABEL_41:
    __fastfail(3u);
  }
  if( !v3 )
  {
    *((_BYTE *)a2 + 17) &= 0xFAu;
    *((_QWORD *)a2 + 3) = 0i64;
    *((_BYTE *)a2 + 16) = 0;
    KeReleaseInStackQueuedSpinLockFromDpcLevel((_KLOCK_QUEUE_HANDLE *)&LockHandle);
    goto LABEL_16;
  }
  if( v6 )
    KeAbPreWait(v6);
  v22 = (PVOID *)*((_QWORD *)BugCheckParameter2 + 7);
  v23 = (char *)a2 + 56;
  if( *v22 != (char *)BugCheckParameter2 + 48 )
    goto LABEL_41;
  *((_QWORD *)a2 + 8) = v22;
  *v23 = (char *)BugCheckParameter2 + 48;
  *v22 = v23;
  *((_QWORD *)BugCheckParameter2 + 7) = v23;
  *((_BYTE *)a2 + 19) = 1;
  ExpPrepareToWaitForResourceExclusive((INT64)BugCheckParameter2, v29, (INT64)&LockHandle.WorkItem.Parameter);
  KeReleaseInStackQueuedSpinLockFromDpcLevel((_KLOCK_QUEUE_HANDLE *)&LockHandle);
  ExpAddFastOwnerEntryToThreadList(v29, v24, 0, (INT64)a2);
  __writecr8(v13);
  ExpWaitForResource((ERESOURCE *)BugCheckParameter2, &LockHandle.WorkItem.Parameter);
  *((_BYTE *)a2 + 19) = 0;
  if( v6 )
    result = KeAbPreAcquire(BugCheckParameter2, v6, 0i64);
  v17 = 1;
LABEL_17:
  if( v6 )
  {
    if( v17 )
      v6[26] |= 1u;
    else
      KeAbPostReleaseEx(BugCheckParameter2, v6);
  }
  LOBYTE(result) = v17;
  return result;
}

Referenced by:

ExpFastResourceLegacyAcquireExclusive