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