ExAllocateCacheAwarePushLock

_EX_PUSH_LOCK_CACHE_AWARE_LEGACY *__stdcall ExAllocateCacheAwarePushLock(UINT64 Flags){
  char v1; 
  int v2; 
  unsigned int v3; 
  VOID **PoolWithTag; 
  _EX_PUSH_LOCK_CACHE_AWARE_LEGACY *v5; 
  VOID **v6; 
  VOID **v7; 
  _EX_PUSH_LOCK_CACHE_AWARE_LEGACY *v8; 
  __int64 v9; 
  _EX_PUSH_LOCK_CACHE_AWARE_LEGACY *v10; 
  unsigned int v12; 
  unsigned int v13; 
  struct _KPRCB *v14; 
  UINT16 v15; 
  _QWORD *PoolWithTagFromNode; 
  _QWORD *v17; 
  INT64 v18; 
  unsigned int v19; 
  _EX_PUSH_LOCK_CACHE_AWARE_LEGACY *v20; 
  _GROUP_AFFINITY Affinity; 
  _GROUP_AFFINITY PreviousAffinity; 

  v1 = 0;
  v2 = Flags & 1;
  Affinity = 0i64;
  v3 = v2 != 0 ? 512 : 1;
  PreviousAffinity = 0i64;
  PoolWithTag = ExAllocatePoolWithTag(v3, 0x100ui64, 1885563984i64);
  v5 = (_EX_PUSH_LOCK_CACHE_AWARE_LEGACY *)PoolWithTag;
  if( !PoolWithTag )
    return 0i64;
  memset(PoolWithTag, 0i64, 0x100u);
  if( KeNumberNodes == 1 )
  {
    v6 = ExAllocatePoolWithTag(v3, 0x1000ui64, 1818455120i64);
    v7 = v6;
    if( v6 )
    {
      memset(v6, 0i64, 0x1000u);
      v8 = v5;
      v9 = 32i64;
      do
      {
        *v7 = 0i64;
        *((_BYTE *)v7 + 8) = 1;
        v7[2] = v5;
        *(_QWORD *)v8 = v7;
        v7 += 16;
        v8 += 2;
        --v9;
      }
      while( v9 );
      return v5;
    }
    v10 = 0i64;
  }
  else
  {
    v12 = KeNumberProcessors_0;
    v13 = 0;
    v19 = KeNumberProcessors_0;
    v20 = v5;
    while( 1 )
    {
      v14 = v13 >= v12 ? KeGetCurrentPrcb() : KeGetPrcb(v13);
      v15 = v14->ParentNode->Affinity.Reserved[0];
      if( v2 )
      {
        LODWORD(v18) = 0;
        PoolWithTagFromNode = ExpAllocatePoolWithTagFromNode(0x200ui64, 0x80u, 0x6C636C50ui64, v15, v18);
      }
      else
      {
        KeQueryNodeActiveAffinity(v15, &Affinity, 0i64);
        if( v1 )
        {
          KeSetSystemGroupAffinityThread(&Affinity, 0i64);
        }
        else
        {
          KeSetSystemGroupAffinityThread(&Affinity, &PreviousAffinity);
          v1 = 1;
        }
        PoolWithTagFromNode = ExAllocatePoolWithTag(v3, 0x80ui64, 1818455120i64);
      }
      v17 = PoolWithTagFromNode;
      if( !PoolWithTagFromNode )
        break;
      memset(PoolWithTagFromNode, 0i64, 0x80u);
      ++v13;
      v17[2] = v5;
      *(_QWORD *)v20 = v17;
      v20 += 2;
      if( v13 >= 0x20 )
      {
        v10 = v5;
        v5 = 0i64;
        goto LABEL_25;
      }
      v12 = v19;
    }
    v10 = 0i64;
LABEL_25:
    if( v1 )
      KeRevertToUserGroupAffinityThread(&PreviousAffinity);
  }
  if( v5 )
    ExFreeCacheAwarePushLock((ULONG_PTR *)v5);
  return v10;
}

Referenced by:

No references.