HalpDmaAllocateMappingResources

INT64 __fastcall HalpDmaAllocateMappingResources(){
  unsigned int MaximumProcessorCount; 
  __int64 v1; 
  unsigned int v2; 
  __int64 v3; 
  __int64 v4; 
  __int64 v5; 
  __int64 v6; 
  __int64 v7; 
  __int64 v8; 
  _QWORD *v9; 
  _QWORD *v10; 
  UINT64 v11; 
  __int64 v12; 
  unsigned int v13; 
  __int64 v14; 
  __int64 ReservedMapping; 
  __int64 v16; 
  __int64 v18; 
  __int64 v19; 
  __int64 v20; 
  __int64 v21; 
  __int64 v22; 
  __int64 v23; 
  NTSTATUS ReservedMappingArray; 
  __int64 v25; 
  MaximumProcessorCount = KeQueryMaximumProcessorCountEx(0xFFFFu);
  v1 = 8i64 * MaximumProcessorCount;
  v2 = MaximumProcessorCount;
  v3 = MaximumProcessorCount;
  qword_140C53C60 = HalpMmAllocCtxAlloc(v4, v1);
  if( !qword_140C53C60 )
    return 3221225626i64;
  v6 = HalpMmAllocCtxAlloc(v5, 4144 * v3);
  v8 = v6;
  if( !v6 )
  {
    v18 = qword_140C53C60;
LABEL_14:
    HalpMmAllocCtxFree(v7, v18);
    return 3221225626i64;
  }
  if( v2 )
  {
    v9 = (_QWORD *)qword_140C53C60;
    v7 = v6 + 32;
    do
    {
      *(_QWORD *)v7 = 0i64;
      v10 = (_QWORD *)(v7 - 32);
      *(_DWORD *)(v7 + 12) = 0;
      *v10 = 0i64;
      *(_DWORD *)(v7 - 24) = 131128;
      *(_DWORD *)(v7 + 8) = 4096;
      v7 += 4144i64;
      *v9++ = v10;
      --v3;
    }
    while( v3 );
  }
  *(_QWORD *)qword_140CF2310 = 0i64;
  v11 = 4i64;
  if( v2 <= 4 )
  {
    qword_140C53C68 = HalpMmAllocCtxAlloc(v7, v1);
    if( qword_140C53C68 )
    {
      v13 = 0;
      if( !v2 )
      {
LABEL_12:
        byte_140C53C58 = 1;
        return 0i64;
      }
      v14 = 0i64;
      while( 1 )
      {
        ReservedMapping = HalpDmaAllocateReservedMapping(v12);
        v16 = qword_140C53C68;
        *(_QWORD *)(v14 + qword_140C53C68) = ReservedMapping;
        if( !ReservedMapping )
          break;
        ++v13;
        v14 += 8i64;
        if( v13 >= v2 )
          goto LABEL_12;
      }
      if( v13 )
      {
        v19 = 0i64;
        v20 = v13;
        do
        {
          v21 = *(_QWORD *)(v19 + v16);
          MmFreeMappingAddress(*(PVOID *)(v21 + 16), 0x206C6148u);
          HalpMmAllocCtxFree(v22, v21);
          v16 = qword_140C53C68;
          v19 += 8i64;
          --v20;
        }
        while( v20 );
      }
      HalpMmAllocCtxFree(v12, v16);
      v11 = v2;
      goto LABEL_21;
    }
    HalpMmAllocCtxFree(v12, qword_140C53C60);
    v18 = v8;
    goto LABEL_14;
  }
LABEL_21:
  ReservedMappingArray = HalpDmaAllocateReservedMappingArray(v2, v11);
  if( ReservedMappingArray < 0 )
  {
    HalpMmAllocCtxFree(v23, qword_140C53C60);
    HalpMmAllocCtxFree(v25, v8);
  }
  return(unsigned int)ReservedMappingArray;
}

Referenced by:

HalpDmaInit