ExAcquireCacheAwarePushLockSharedEx

unsigned __int64 *__fastcall ExAcquireCacheAwarePushLockSharedEx(
        ULONG_PTR BugCheckParameter2,
        ULONG_PTR BugCheckParameter1){
  __int64 v2; 
  _ETHREAD *CurrentThread; 
  __int64 v5; 
  char v6; 
  int SessionId; 
  bool v8; 
  UINT64 *v9; 
  char v11; 
  unsigned int v12; 
  v2 = 0i64;
  if( (BugCheckParameter1 & 0xFFFFFFFC) != 0 )
    KeBugCheckEx(0x152u, (unsigned int)BugCheckParameter1, BugCheckParameter2, 0i64, 0i64);
  if( (BugCheckParameter1 & 2) == 0 )
  {
    v12 = 0;
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    --*((_WORD *)CurrentThread + 243);
    if( ++*((_BYTE *)CurrentThread + 794) != 1 )
      KeBugCheckEx(0x192u, (ULONG_PTR)CurrentThread, BugCheckParameter2, KeGetCurrentIrql(), 0i64);
    LOBYTE(v5) = *((_BYTE *)CurrentThread + 792);
    if( !(_BYTE)v5 )
    {
      if( !*((_BYTE *)CurrentThread + 870) )
        goto LABEL_21;
      v11 = *((_BYTE *)CurrentThread + 870);
      *((_BYTE *)CurrentThread + 870) = 0;
      LOBYTE(v5) = *((_BYTE *)CurrentThread + 792) | v11;
    }
    v6 = v5;
    _BitScanForward((unsigned int *)&v5, (unsigned __int8)v5);
    *((_BYTE *)CurrentThread + 792) = v6 & ~(1 << v5);
    v2 = *((_QWORD *)CurrentThread + 100) + 96 * v5;
    if( v2 )
    {
      if( BugCheckParameter2 >= 0xFFFF800000000000ui64
        && *((_BYTE *)&antNameB + ((BugCheckParameter2 >> 39) & 0x1FF) - 256) == 1 )
      {
        SessionId = MmGetSessionIdEx(*((_QWORD *)CurrentThread + 23));
      }
      else
      {
        SessionId = -1;
      }
      *(_DWORD *)(v2 + 40) = SessionId;
      *(_QWORD *)(v2 + 32) = BugCheckParameter2 & 0x7FFFFFFFFFFFFFFCi64;
LABEL_10:
      --*((_BYTE *)CurrentThread + 794);
      KiAbThreadRemoveBoosts((ULONG_PTR)CurrentThread, BugCheckParameter2, &v12);
      v8 = (*((_WORD *)CurrentThread + 243))++ == 0xFFFF;
      if( v8 && *((_ETHREAD **)CurrentThread + 19) != (_ETHREAD *)((char *)CurrentThread + 152) )
        KiCheckForKernelApcDelivery();
      goto LABEL_11;
    }
LABEL_21:
    _interlockedbittestandset((volatile signed __int32 *)CurrentThread + 30, 0x10u);
    goto LABEL_10;
  }
LABEL_11:
  v9 = *(UINT64 **)(BugCheckParameter2 + 8i64 * (*((_DWORD *)KeGetPcr() + 105) & 0x1F));
  if( _InterlockedCompareExchange64((volatile signed __int64 *)v9, 17i64, 0i64) && !ExfTryAcquirePushLockShared(v9) )
    ExfAcquirePushLockSharedEx(v9, (VOID *)v2, (VOID *)BugCheckParameter2);
  if( v2 )
    *(_BYTE *)(v2 + 26) |= 1u;
  return v9;
}

Referenced by:

No references.