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