HalpDmaAllocateContiguousMemory

NTSTATUS __stdcall HalpDmaAllocateContiguousMemory(
        _HALP_DMA_ADAPTER_OBJECT *Adapter,
        UINT64 PagesToAllocate,
        VOID **VirtualAddressOut,
        UINT64 *PhysicalAddressOut,
        _MDL **MdlOut){
  _LARGE_INTEGER MaximumPhysicalAddress; 
  char v6; 
  _HALP_DMA_ADAPTER_OBJECT *v7; 
  UINT64 v8; 
  unsigned int v9; 
  _LARGE_INTEGER v10; 
  char i; 
  _LARGE_INTEGER v12; 
  VOID *ContiguousNodeMemory; 
  VOID *v14; 
  UINT64 v15; 
  UINT64 Protect; 
  UINT64 PreferredNode; 

  MaximumPhysicalAddress = Adapter->MaximumPhysicalAddress;
  v6 = 0;
  v7 = Adapter;
  v8 = (unsigned __int64)(unsigned int)PagesToAllocate << 12;
  v9 = PagesToAllocate;
  while( 2 )
  {
    if( v6 || v7->DmaCanCross64K || v9 > 0x10 )
      v10.QuadPart = 0i64;
    else
      v10.QuadPart = 0x10000i64;
    for( i = 0; ; i = 1 )
    {
      v12.QuadPart = 0i64;
      if( !i && MaximumPhysicalAddress.anonymous_0.LowPart == -1 )
        v12.QuadPart = 0x1000000i64;
      LODWORD(PreferredNode) = 0x80000000;
      LODWORD(Protect) = 4;
      ContiguousNodeMemory = MmAllocateContiguousNodeMemory(
                               v8,
                               v12,
                               MaximumPhysicalAddress,
                               v10,
                               Protect,
                               PreferredNode);
      v14 = ContiguousNodeMemory;
      if( ContiguousNodeMemory )
      {
        LODWORD(v15) = MmGetPhysicalAddress((UINT64)ContiguousNodeMemory);
        *VirtualAddressOut = v14;
        *PhysicalAddressOut = v15;
        goto LABEL_20;
      }
      if( i || !v12.QuadPart )
        break;
    }
    if( !v6 && v10.QuadPart )
    {
      v7 = Adapter;
      v6 = 1;
      continue;
    }
    break;
  }
  v9 = 0;
LABEL_20:
  *MdlOut = 0i64;
  return v9;
}

Referenced by:

HalpDmaAllocateLocalContiguousPool
HalpDmaAllocateMapRegisters
HalpDmaGrowContiguousMapBuffers