PspIumAllocateSecurePool

INT64 __fastcall PspIumAllocateSecurePool(INT64 a1){
  bool v1; 
  __int64 v3; 
  __int64 v4; 
  unsigned __int64 v5; 
  __int64 v6; 
  struct _MDL *PoolWithTag; 
  __int64 v8; 
  UINT8 *MappedSystemVa; 
  __int64 v10; 
  PMDL v11; 
  UINT64 v12; 
  __int16 MdlFlags; 
  unsigned int SecurePoolMemory; 
  __int64 v15; 
  PMDL *v17; 
  PMDL v18; 
  struct _MDL v19; 
  __int64 v20; 
  PMDL MemoryDescriptorList[2]; 
  __int64 v22[3]; 
  v1 = (*(_DWORD *)(a1 + 40) & 0x2000) == 0;
  memset(&v19, 0, sizeof(v19));
  v20 = 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);
        v22[v4] = v5;
        if( (unsigned int)v6 < 2 )
        {
          PoolWithTag = (struct _MDL *)ExAllocatePoolWithTag(
                                         NonPagedPoolNx,
                                         8 * (v5 & 0xFFFFFFFFFFFFFi64) + 48,
                                         0x6C644Dui64);
          MemoryDescriptorList[v6] = PoolWithTag;
          if( !PoolWithTag )
          {
            SecurePoolMemory = -1073741670;
            goto LABEL_21;
          }
          PoolWithTag->Next = 0i64;
          PoolWithTag->StartVa = 0i64;
          PoolWithTag->ByteOffset = 0;
          PoolWithTag->ByteCount = 0;
          *(_DWORD *)&PoolWithTag->Size = 131120;
        }
        v6 = (unsigned int)(v6 + 1);
      }
      while( (_DWORD)v4 );
      v8 = 0i64;
      MappedSystemVa = (UINT8 *)(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 * v22[v8];
        v11->ByteCount = LODWORD(v22[v8]) << 12;
        memmove((UINT8 *)&v11[1], MappedSystemVa, v12);
        MdlFlags = v11->MdlFlags;
        if( (MdlFlags & 5) == 0 )
        {
          MmMapLockedPagesSpecifyCache(v11, 0, MmCached, 0i64, 0, 0x40000010u);
          MdlFlags = v11->MdlFlags;
        }
        if( (MdlFlags & 1) == 0 )
          break;
        MappedSystemVa = (UINT8 *)v11->MappedSystemVa;
        v8 = (unsigned int)(v8 + 1);
        if( (unsigned int)v8 >= *(_DWORD *)(a1 + 44) )
          goto LABEL_20;
      }
    }
    else
    {
      v19.StartVa = 0i64;
      v19.ByteOffset = 0;
      v15 = *(_QWORD *)(a1 + 64);
      *(_DWORD *)&v19.Size = 131128;
      v19.ByteCount = 4096;
      v20 = v15;
      MmMapLockedPagesSpecifyCache(&v19, 0, MmCached, 0i64, 0, 0x40000010u);
      if( (v19.MdlFlags & 1) != 0 )
        goto LABEL_20;
    }
    return 3221225626i64;
  }
LABEL_20:
  SecurePoolMemory = MmAllocateSecurePoolMemory(*(PVOID *)(a1 + 24), *(PVOID *)(a1 + 32));
LABEL_21:
  if( (v19.MdlFlags & 1) != 0 )
    MmUnmapLockedPages(v19.MappedSystemVa, &v19);
  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