ExTryAcquirePushLockExclusiveEx

CHAR __fastcall ExTryAcquirePushLockExclusiveEx(UINT64 P2, UINT64 P1){
  __int64 v2; 
  _ETHREAD *CurrentThread; 
  bool v5; 
  __int64 v7; 
  char v8; 
  int SessionId; 
  unsigned int v10; 
  v2 = 0i64;
  if( (P1 & 0xFFFFFFFC) != 0 )
    KeBugCheckEx(0x152u, (unsigned int)P1, P2, 0i64, 0i64);
  if( (P1 & 2) == 0 )
  {
    v10 = 0;
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    --*((_WORD *)CurrentThread + 243);
    if( ++*((_BYTE *)CurrentThread + 794) != 1 )
      goto LABEL_4;
    LOBYTE(v7) = *((_BYTE *)CurrentThread + 792);
    if( !(_BYTE)v7 )
    {
      if( !*((_BYTE *)CurrentThread + 870) )
      {
LABEL_14:
        if( v2 )
        {
          if( P2 >= 0xFFFF800000000000ui64 && *((_BYTE *)&antNameB + ((P2 >> 39) & 0x1FF) - 256) == 1 )
            SessionId = MmGetSessionIdEx(*((_QWORD *)CurrentThread + 23));
          else
            SessionId = -1;
          *(_DWORD *)(v2 + 40) = SessionId;
          *(_QWORD *)(v2 + 32) = P2 & 0x7FFFFFFFFFFFFFFCi64;
LABEL_5:
          --*((_BYTE *)CurrentThread + 794);
          KiAbThreadRemoveBoosts((ULONG_PTR)CurrentThread, P2, &v10);
          v5 = (*((_WORD *)CurrentThread + 243))++ == 0xFFFF;
          if( v5 && *((_ETHREAD **)CurrentThread + 19) != (_ETHREAD *)((char *)CurrentThread + 152) )
            KiCheckForKernelApcDelivery();
          goto LABEL_8;
        }
LABEL_4:
        _interlockedbittestandset((volatile signed __int32 *)CurrentThread + 30, 0x10u);
        goto LABEL_5;
      }
      v7 = *((unsigned __int8 *)CurrentThread + 870);
      *((_BYTE *)CurrentThread + 870) = 0;
      LOBYTE(v7) = *((_BYTE *)CurrentThread + 792) | v7;
    }
    v8 = v7;
    _BitScanForward((unsigned int *)&v7, (unsigned __int8)v7);
    *((_BYTE *)CurrentThread + 792) = v8 & ~(1 << v7);
    v2 = *((_QWORD *)CurrentThread + 100) + 96 * v7;
    goto LABEL_14;
  }
LABEL_8:
  if( _interlockedbittestandset64((volatile signed __int32 *)P2, 0i64) )
  {
    if( v2 )
      KeAbPostReleaseEx((PVOID)P2, (PVOID)v2);
    return 0;
  }
  else
  {
    if( v2 )
      *(_BYTE *)(v2 + 26) |= 1u;
    return 1;
  }
}

Referenced by:

No references.