PspIumAllocateSecurePool
NTSTATUS __stdcall PspIumAllocateSecurePool(INT64 a1){
bool v1;
__int64 v3;
__int64 v4;
unsigned __int64 v5;
__int64 v6;
VOID **PoolWithTag;
__int64 v8;
const VOID *MappedSystemVa;
__int64 v10;
_MDL *v11;
size_t v12;
__int16 MdlFlags;
NTSTATUS SecurePoolMemory;
__int64 v15;
_MDL **v17;
_MDL *v18;
UINT64 v19;
UINT64 Priority;
_MDL v21;
__int64 v22;
_MDL *MemoryDescriptorList[2];
__int64 v24[3];
v1 = (*(_DWORD *)(a1 + 40) & 0x2000) == 0;
memset(&v21, 0, sizeof(v21));
v22 = 0i64;
v3 = 2i64;
*(_OWORD *)MemoryDescriptorList = 0i64;
if( v1 )
{
LODWORD(v4) = *(_DWORD *)(a1 + 44);
if( (_DWORD)v4 )
{
v5 = *(_QWORD *)(a1 + 32) >> 12;
v6 = 0i64;
do
{
v4 = (unsigned int)(v4 - 1);
v5 = (((8 * v5) & 0xFFF) != 0) + ((8 * v5) >> 12);
v24[v4] = v5;
if( (unsigned int)v6 < 2 )
{
PoolWithTag = ExAllocatePoolWithTag(0x200ui64, 8 * (v5 & 0xFFFFFFFFFFFFFi64) + 48, 7103565i64);
MemoryDescriptorList[v6] = (_MDL *)PoolWithTag;
if( !PoolWithTag )
{
SecurePoolMemory = -1073741670;
goto LABEL_21;
}
*PoolWithTag = 0i64;
PoolWithTag[4] = 0i64;
*((_DWORD *)PoolWithTag + 11) = 0;
*((_DWORD *)PoolWithTag + 10) = 0;
*((_DWORD *)PoolWithTag + 2) = 131120;
}
v6 = (unsigned int)(v6 + 1);
}
while( (_DWORD)v4 );
v8 = 0i64;
MappedSystemVa = (const VOID *)(a1 + 64);
if( !*(_DWORD *)(a1 + 44) )
goto LABEL_20;
while( 1 )
{
LODWORD(v6) = v6 - 1;
v10 = v6 & 1;
v11 = MemoryDescriptorList[v10];
if( (v11->MdlFlags & 1) != 0 )
MmUnmapLockedPages(v11->MappedSystemVa, MemoryDescriptorList[v10]);
v12 = 8 * v24[v8];
v11->ByteCount = LODWORD(v24[v8]) << 12;
memmove(&v11[1], MappedSystemVa, v12);
MdlFlags = v11->MdlFlags;
if( (MdlFlags & 5) == 0 )
{
LODWORD(Priority) = 1073741840;
LODWORD(v19) = 0;
MmMapLockedPagesSpecifyCache(v11, 0, MmCached, 0i64, v19, Priority);
MdlFlags = v11->MdlFlags;
}
if( (MdlFlags & 1) == 0 )
break;
MappedSystemVa = v11->MappedSystemVa;
v8 = (unsigned int)(v8 + 1);
if( (unsigned int)v8 >= *(_DWORD *)(a1 + 44) )
goto LABEL_20;
}
}
else
{
v21.StartVa = 0i64;
v21.ByteOffset = 0;
v15 = *(_QWORD *)(a1 + 64);
LODWORD(Priority) = 1073741840;
LODWORD(v19) = 0;
*(_DWORD *)&v21.Size = 131128;
v21.ByteCount = 4096;
v22 = v15;
MmMapLockedPagesSpecifyCache(&v21, 0, MmCached, 0i64, v19, Priority);
if( (v21.MdlFlags & 1) != 0 )
goto LABEL_20;
}
return -1073741670;
}
LABEL_20:
SecurePoolMemory = MmAllocateSecurePoolMemory(*(PVOID *)(a1 + 24), *(PVOID *)(a1 + 32));
LABEL_21:
if( (v21.MdlFlags & 1) != 0 )
MmUnmapLockedPages(v21.MappedSystemVa, &v21);
v17 = MemoryDescriptorList;
do
{
v18 = *v17;
if( *v17 )
{
if( (v18->MdlFlags & 1) != 0 )
MmUnmapLockedPages(v18->MappedSystemVa, *v17);
ExFreePoolWithTag(v18, 0);
}
++v17;
--v3;
}
while( v3 );
return SecurePoolMemory;
}Referenced by:
PsDispatchIumService