ExTryAcquirePushLockSharedEx

char __fastcall ExTryAcquirePushLockSharedEx(ULONG_PTR BugCheckParameter2, ULONG_PTR BugCheckParameter1){
  __int64 v2; 
  _ETHREAD *CurrentThread; 
  __int64 v5; 
  char v6; 
  int SessionId; 
  bool v8; 
  char v10; 
  unsigned int v11; 
  v2 = 0i64;
  if( (BugCheckParameter1 & 0xFFFFFFFC) != 0 )
    KeBugCheckEx(0x152u, (unsigned int)BugCheckParameter1, BugCheckParameter2, 0i64, 0i64);
  if( (BugCheckParameter1 & 2) == 0 )
  {
    v11 = 0;
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    --*((_WORD *)CurrentThread + 243);
    if( ++*((_BYTE *)CurrentThread + 794) != 1 )
      goto LABEL_11;
    LOBYTE(v5) = *((_BYTE *)CurrentThread + 792);
    if( !(_BYTE)v5 )
    {
      if( !*((_BYTE *)CurrentThread + 870) )
      {
LABEL_6:
        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_12:
          --*((_BYTE *)CurrentThread + 794);
          KiAbThreadRemoveBoosts((ULONG_PTR)CurrentThread, BugCheckParameter2, &v11);
          v8 = (*((_WORD *)CurrentThread + 243))++ == 0xFFFF;
          if( v8 && *((_ETHREAD **)CurrentThread + 19) != (_ETHREAD *)((char *)CurrentThread + 152) )
            KiCheckForKernelApcDelivery();
          goto LABEL_15;
        }
LABEL_11:
        _interlockedbittestandset((volatile signed __int32 *)CurrentThread + 30, 0x10u);
        goto LABEL_12;
      }
      v10 = *((_BYTE *)CurrentThread + 870);
      *((_BYTE *)CurrentThread + 870) = 0;
      LOBYTE(v5) = *((_BYTE *)CurrentThread + 792) | v10;
    }
    v6 = v5;
    _BitScanForward((unsigned int *)&v5, (unsigned __int8)v5);
    *((_BYTE *)CurrentThread + 792) = v6 & ~(1 << v5);
    v2 = *((_QWORD *)CurrentThread + 100) + 96 * v5;
    goto LABEL_6;
  }
LABEL_15:
  if( !_InterlockedCompareExchange64((volatile signed __int64 *)BugCheckParameter2, 17i64, 0i64)
    || ExfTryAcquirePushLockShared((UINT64 *)BugCheckParameter2) )
  {
    if( v2 )
      *(_BYTE *)(v2 + 26) |= 1u;
    return 1;
  }
  else
  {
    if( v2 )
      KeAbPostReleaseEx((PVOID)BugCheckParameter2, (PVOID)v2);
    return 0;
  }
}

Referenced by:

No references.