ExAcquireAutoExpandPushLockShared

VOID *__stdcall ExAcquireAutoExpandPushLockShared(_EX_PUSH_LOCK_AUTO_EXPAND *Lock, UINT64 Flags){
  __int64 v2; 
  int v4; 
  _ETHREAD *CurrentThread; 
  __int64 AbOrphanedEntrySummary; 
  char v7; 
  NTSTATUS SessionId; 
  bool v9; 
  unsigned int Value; 
  unsigned __int64 v11; 
  UINT64 a3; 

  v2 = 0i64;
  if( (Flags & 0xFFFFFFFC) != 0 )
    KeBugCheckEx(0x152u, (PVOID)(unsigned int)Flags, Lock, 0i64, 0i64);
  v4 = Flags & 2;
  if( (Flags & 2) == 0 )
  {
    LODWORD(a3) = 0;
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    --CurrentThread->Tcb.SpecialApcDisable;
    if( ++CurrentThread->Tcb.AbAllocationRegionCount != 1 )
      KeBugCheckEx(0x192u, CurrentThread, Lock, (PVOID)KeGetCurrentIrql(), 0i64);
    LOBYTE(AbOrphanedEntrySummary) = CurrentThread->Tcb.AbEntrySummary;
    if( !(_BYTE)AbOrphanedEntrySummary )
    {
      if( !CurrentThread->Tcb.AbOrphanedEntrySummary )
        goto LABEL_25;
      AbOrphanedEntrySummary = CurrentThread->Tcb.AbOrphanedEntrySummary;
      CurrentThread->Tcb.AbOrphanedEntrySummary = 0;
      LOBYTE(AbOrphanedEntrySummary) = CurrentThread->Tcb.AbEntrySummary | AbOrphanedEntrySummary;
    }
    v7 = AbOrphanedEntrySummary;
    _BitScanForward((unsigned int *)&AbOrphanedEntrySummary, (unsigned __int8)AbOrphanedEntrySummary);
    CurrentThread->Tcb.AbEntrySummary = v7 & ~(1 << AbOrphanedEntrySummary);
    v2 = (__int64)&CurrentThread->Tcb.LockEntries[AbOrphanedEntrySummary];
    if( v2 )
    {
      if( (unsigned __int64)Lock >= 0xFFFF800000000000ui64
        && *((_BYTE *)&stru_140C4DB30 + (((unsigned __int64)Lock >> 39) & 0x1FF) + 6872) == 1 )
      {
        SessionId = MmGetSessionIdEx(CurrentThread->Tcb.ApcState.Process);
      }
      else
      {
        SessionId = -1;
      }
      *(_DWORD *)(v2 + 40) = SessionId;
      *(_QWORD *)(v2 + 32) = (unsigned __int64)Lock & 0x7FFFFFFFFFFFFFFCi64;
LABEL_10:
      --CurrentThread->Tcb.AbAllocationRegionCount;
      KiAbThreadRemoveBoosts(&CurrentThread->Tcb, Lock, &a3);
      v9 = CurrentThread->Tcb.SpecialApcDisable++ == -1;
      if( v9
        && ($F25F8C4BA33AF922A5F1AF68CD89DDDF *)CurrentThread->Tcb.ApcState.ApcListHead[0].Flink != &CurrentThread->Tcb.152 )
      {
        KiCheckForKernelApcDelivery();
      }
      goto LABEL_13;
    }
LABEL_25:
    _interlockedbittestandset((volatile signed __int32 *)&CurrentThread->Tcb.116 + 1, 0x10u);
    goto LABEL_10;
  }
LABEL_13:
  Value = Lock->State.Value;
  if( (Value & 1) != 0 )
  {
    v11 = (unsigned __int64)ExpAcquireFannedOutPushLockShared((VOID *)(Value & 0xFFFFFFF8), (VOID *)v2, Lock);
  }
  else
  {
    if( _InterlockedCompareExchange64(&Lock->LocalLock._bf_0, 17i64, 0i64) )
      ExfAcquirePushLockSharedEx(&Lock->LocalLock, (VOID *)v2, Lock);
    v11 = (unsigned __int64)Lock | 1;
  }
  if( !v4 )
    v11 |= 2ui64;
  if( v2 )
    *(_BYTE *)(v2 + 26) |= 1u;
  return(VOID *)v11;
}

Referenced by:

MiLockAwePagesShared
MiLockAweVadsShared