ExpSaInitialize

INT64 __fastcall ExpSaInitialize(){
  char v0; 
  INT64 result; 
  unsigned int MaximumProcessorCount; 
  unsigned int v3; 
  unsigned int v4; 
  __int64 v5; 
  struct _KPRCB *CurrentPrcb; 
  UINT64 v7; 
  VOID *PoolWithTagFromNode; 
  __int64 v9; 
  INT64 v10; 
  v0 = 0;
  ExSaPageGroupDescriptorArray = 0i64;
  ExSaPageArrays = 0i64;
  ExSaNonPagedSlotAllocator = 0i64;
  ExSaPagedSlotAllocator = 0i64;
  ExSaPageGroupDescriptorArrayLock = 0i64;
  result = (INT64)ExAllocatePoolWithTag(NonPagedPoolNx, 0x80ui64, 0x61537845ui64);
  ExSaPageGroupDescriptorArray = result;
  if( result )
  {
    memset(result, 0i64);
    MaximumProcessorCount = KeQueryMaximumProcessorCountEx(0xFFFFu);
    result = (INT64)ExAllocatePoolWithTag(NonPagedPoolNx, 8i64 * MaximumProcessorCount, 0x61537845ui64);
    ExSaPageArrays = result;
    if( result )
    {
      memset(result, 0i64);
      v3 = KeNumberProcessors_0;
      v4 = 0;
      if( MaximumProcessorCount )
      {
        v5 = 0i64;
        while( 1 )
        {
          if( v4 >= v3 )
            CurrentPrcb = KeGetCurrentPrcb();
          else
            KeGetPrcb(v4);
          LODWORD(v10) = 0;
          v7 = *(unsigned __int16 *)(*((_QWORD *)CurrentPrcb + 24) + 146i64);
          LODWORD(v7) = v7 | 0x80000000;
          PoolWithTagFromNode = ExpAllocatePoolWithTagFromNode(0x200ui64, 0x80ui64, 0x61537845ui64, v7, v10);
          result = ExSaPageArrays;
          *(_QWORD *)(v5 + ExSaPageArrays) = PoolWithTagFromNode;
          if( !PoolWithTagFromNode )
            break;
          memset((INT64)PoolWithTagFromNode, 0i64);
          KeGetPrcb(v4);
          if( v9 )
            *(_QWORD *)(v9 + 33584) = *(_QWORD *)(v5 + ExSaPageArrays);
          ++v4;
          v5 += 8i64;
          if( v4 >= MaximumProcessorCount )
            goto LABEL_11;
        }
      }
      else
      {
LABEL_11:
        result = (INT64)ExAllocatePoolWithTag(NonPagedPoolNx, 0x48ui64, 0x61537845ui64);
        ExSaNonPagedSlotAllocator = result;
        if( result )
        {
          ExpSaAllocatorInitialize(result, 0);
          result = (INT64)ExAllocatePoolWithTag(PagedPool, 0x48ui64, 0x61537845ui64);
          ExSaPagedSlotAllocator = result;
          if( result )
          {
            result = ExpSaAllocatorInitialize(result, 1);
            v0 = 1;
          }
        }
      }
    }
  }
  LOBYTE(result) = v0;
  return result;
}

Referenced by:

ExpInitSystemPhase1