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