ExAcquireFastResourceShared

NTSTATUS __stdcall ExAcquireFastResourceShared(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; 
  INT64 *FastOwnerEntryForThread; 
  _BYTE *v15; 
  WORK_QUEUE_TYPE v16; 
  void *v17; 
  CHAR v18; 
  PVOID *v19; 
  _QWORD *v20; 
  PVOID *v21; 
  __int64 v22; 
  NTSTATUS result; 
  PVOID *v24; 
  _QWORD *v25; 
  INT64 v26; 
  PVOID *v27; 
  INT64 *v28; 
  struct _IO_WORKITEM LockHandle; 
  INT64 v30; 
  v3 = v2;
  v6 = 0i64;
  v7 = 2 - (v2 != 0);
  memset(&LockHandle, 0, 72);
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v30 = (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( *((_DWORD *)BugCheckParameter2 + 16) )
  {
    FastOwnerEntryForThread = ExpFindFastOwnerEntryForThread((INT64)CurrentThread, (INT64)BugCheckParameter2, 0, 0);
    if( FastOwnerEntryForThread )
    {
      v27 = (PVOID *)FastOwnerEntryForThread[6];
      v28 = FastOwnerEntryForThread + 5;
      if( *v27 == v28 )
      {
        *(_QWORD *)a2 = v28;
        v18 = 1;
        *((_QWORD *)a2 + 1) = v27;
        *v27 = a2;
        v28[1] = (INT64)a2;
        goto LABEL_18;
      }
      goto LABEL_42;
    }
  }
  LODWORD(v15) = KeAbPreAcquire(BugCheckParameter2, 0i64, v3 == 0);
  v6 = v15;
  if( v15 )
    *((_BYTE *)a2 + 16) = (2 * ((__int64)&v15[-*(_QWORD *)&v15[-16 * (unsigned __int8)v15[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), v16, v17);
  v18 = ExpTryAcquireResourceShared((INT64)BugCheckParameter2);
  if( v18 )
  {
    v19 = (PVOID *)*((_QWORD *)BugCheckParameter2 + 7);
    v20 = (char *)a2 + 56;
    if( *v19 == (char *)BugCheckParameter2 + 48 )
    {
      *v20 = (char *)BugCheckParameter2 + 48;
      *((_QWORD *)a2 + 8) = v19;
      *v19 = v20;
      *((_QWORD *)BugCheckParameter2 + 7) = v20;
      KeReleaseInStackQueuedSpinLockFromDpcLevel((_KLOCK_QUEUE_HANDLE *)&LockHandle);
      *((_BYTE *)a2 + 18) = 1;
      *((_QWORD *)a2 + 6) = (char *)a2 + 40;
      *((_QWORD *)a2 + 5) = (char *)a2 + 40;
      v21 = (PVOID *)(v30 + 1576);
      v22 = *(_QWORD *)(v30 + 1576);
      if( *(_QWORD *)(v22 + 8) == v30 + 1576 )
      {
        *(_QWORD *)a2 = v22;
        *((_QWORD *)a2 + 1) = v21;
        *(_QWORD *)(v22 + 8) = a2;
        *v21 = a2;
LABEL_18:
        result = v13;
        __writecr8(v13);
        goto LABEL_19;
      }
    }
    goto LABEL_42;
  }
  if( !v3 )
  {
    *((_BYTE *)a2 + 17) &= 0xFAu;
    *((_QWORD *)a2 + 3) = 0i64;
    *((_BYTE *)a2 + 16) = 0;
    KeReleaseInStackQueuedSpinLockFromDpcLevel((_KLOCK_QUEUE_HANDLE *)&LockHandle);
    goto LABEL_18;
  }
  if( v6 )
    KeAbPreWait(v6);
  v24 = (PVOID *)*((_QWORD *)BugCheckParameter2 + 7);
  v25 = (char *)a2 + 56;
  if( *v24 != (char *)BugCheckParameter2 + 48 )
LABEL_42:
    __fastfail(3u);
  *((_QWORD *)a2 + 8) = v24;
  *v25 = (char *)BugCheckParameter2 + 48;
  *v24 = v25;
  *((_QWORD *)BugCheckParameter2 + 7) = v25;
  ExpPrepareToWaitForResourceShared((INT64)BugCheckParameter2, v30, (INT64)&LockHandle.WorkItem.Parameter);
  *((_BYTE *)a2 + 19) = 1;
  KeReleaseInStackQueuedSpinLockFromDpcLevel((_KLOCK_QUEUE_HANDLE *)&LockHandle);
  ExpAddFastOwnerEntryToThreadList(v30, v26, 0, (INT64)a2);
  __writecr8(v13);
  ExpWaitForResource((ERESOURCE *)BugCheckParameter2, &LockHandle.WorkItem.Parameter);
  *((_BYTE *)a2 + 19) = 0;
  if( v6 )
    result = KeAbPreAcquire(BugCheckParameter2, v6, 0i64);
  v18 = 1;
LABEL_19:
  if( v6 )
  {
    if( v18 )
      v6[26] |= 1u;
    else
      KeAbPostReleaseEx(BugCheckParameter2, v6);
  }
  LOBYTE(result) = v18;
  return result;
}

Referenced by:

ExAcquireResourceSharedLite
ExEnterCriticalRegionAndAcquireResourceShared
ExEnterPriorityRegionAndAcquireResourceShared
SeSecurityAttributePresent
SepMandatoryIntegrityCheck