HalpAllocateMapRegisters
NTSTATUS __stdcall HalpAllocateMapRegisters(
_ADAPTER_OBJECT *ChildAdapter,
UINT64 NumberOfMapRegisters,
UINT64 BaseAddressCount,
_MAP_REGISTER_ENTRY *MapRegisterArray){
_MAP_REGISTER_ENTRY *v4;
_HALP_DMA_MASTER_ADAPTER_OBJECT *MasterAdapter;
ULONG v6;
unsigned int v7;
unsigned int MapRegistersPerChannel;
unsigned int v11;
_MAP_REGISTER_ENTRY *v12;
_HALP_DMA_TRANSLATION_ENTRY *MapRegisters;
UINT64 v14;
_HALP_DMA_TRANSLATION_ENTRY *v15;
__int64 v16;
v4 = MapRegisterArray;
MasterAdapter = ChildAdapter->MasterAdapter;
v6 = NumberOfMapRegisters;
v7 = BaseAddressCount;
if( ChildAdapter->RequestLine != -1 )
return -1073741808;
if( (_DWORD)BaseAddressCount * (_DWORD)NumberOfMapRegisters && ChildAdapter->NeedsMapRegisters )
{
if( (unsigned int)(BaseAddressCount * NumberOfMapRegisters) > 0x800 )
return -1073741670;
MapRegistersPerChannel = ChildAdapter->MapRegistersPerChannel;
if( !MapRegistersPerChannel )
return -1073741670;
if( (unsigned int)NumberOfMapRegisters > MapRegistersPerChannel )
return -1073741811;
v11 = 0;
if( (_DWORD)BaseAddressCount )
{
v12 = MapRegisterArray;
do
{
MapRegisters = HalpDmaAllocateMapRegisters(ChildAdapter, v6);
v12->MapRegister = MapRegisters;
if( !MapRegisters )
{
v14 = (v6 + 16) << 12;
if( ChildAdapter->ScatterGather )
HalpDmaGrowScatterMapBuffers(&MasterAdapter->AdapterObject, v14);
else
HalpDmaGrowContiguousMapBuffers(&MasterAdapter->AdapterObject, v14);
v15 = HalpDmaAllocateMapRegisters(ChildAdapter, v6);
v12->MapRegister = v15;
if( !v15 )
break;
}
++v11;
++v12;
}
while( v11 < v7 );
}
if( v11 != v7 )
{
while( v11 )
IoFreeMapRegisters(&ChildAdapter->AdapterObject.DmaHeader, v4[--v11].MapRegister, v6);
return -1073741670;
}
}
else if( (_DWORD)BaseAddressCount )
{
v16 = (unsigned int)BaseAddressCount;
do
{
v4->MapRegister = 0i64;
++v4;
--v16;
}
while( v16 );
}
return 0;
}Referenced by:
No references.