HalpDmaAllocateLocalScatterPool
NTSTATUS __stdcall HalpDmaAllocateLocalScatterPool(_ADAPTER_OBJECT *ChildAdapter, UINT64 NumberOfMapRegisters){
unsigned int v2;
_HALP_DMA_TRANSLATION_ENTRY *v4;
_MDL *v5;
_HALP_ALLOC_CONTEXT *v6;
_MDL *Mdl;
unsigned int v8;
UINT8 *v9;
_HALP_ALLOC_CONTEXT *v10;
VOID *v11;
UINT8 *v12;
UINT8 *v13;
_HALP_ALLOC_CONTEXT *v14;
_HALP_DMA_TRANSLATION_ENTRY *v15;
_ADAPTER_OBJECT *v16;
unsigned int v17;
_HALP_DMA_TRANSLATION_ENTRY *v18;
__int64 v19;
int v20;
_HALP_DMA_TRANSLATION_ENTRY *v21;
unsigned int v22;
_HALP_DMA_TRANSLATION_ENTRY *v23;
__int64 v24;
int v25;
NTSTATUS result;
VOID *VirtualAddress;
UINT64 PagesAllocated;
VirtualAddress = 0i64;
LODWORD(PagesAllocated) = 0;
v2 = NumberOfMapRegisters;
v4 = 0i64;
v5 = HalpDmaAllocateScatterMemory((_LARGE_INTEGER *)ChildAdapter, (VOID **)NumberOfMapRegisters, &VirtualAddress);
Mdl = v5;
if( v5 )
{
v8 = v5->ByteCount >> 12;
v9 = HalpMmAllocCtxAlloc(v6, 0x18ui64);
v11 = VirtualAddress;
v12 = v9;
if( v9 )
{
v13 = HalpMmAllocCtxAlloc(v10, 72i64 * v8);
v4 = (_HALP_DMA_TRANSLATION_ENTRY *)v13;
if( v13 )
{
*(_QWORD *)v12 = 0i64;
*((_DWORD *)v12 + 3) = 0;
memset(v13, 0i64, 72 * v8);
*((_DWORD *)v12 + 2) = v8;
*((_QWORD *)v12 + 2) = v4;
ChildAdapter->AdapterObject.ScatterTranslationEnd.Offset = 0;
ChildAdapter->AdapterObject.ScatterTranslations = (_HALP_DMA_TRANSLATION_BUFFER *)v12;
ChildAdapter->AdapterObject.ScatterTranslationEnd.Buffer = (_HALP_DMA_TRANSLATION_BUFFER *)v12;
v4 = HalpDmaCommitScatterMapBuffers(&ChildAdapter->AdapterObject, v11, 0i64, 0i64, Mdl);
if( v4 )
{
ChildAdapter->AllocationHandle = Mdl;
ChildAdapter->VirtualAddress = v11;
goto LABEL_11;
}
HalpMmAllocCtxFree(v6, ChildAdapter->AdapterObject.ScatterTranslations->Entries);
}
HalpMmAllocCtxFree(v14, v12);
}
if( v11 )
MmUnmapLockedPages(v11, Mdl);
MmFreePagesFromMdl(Mdl);
ExFreePoolWithTag(Mdl, 0);
ChildAdapter->AdapterObject.ScatterTranslations = 0i64;
}
v8 = 0;
LABEL_11:
if( v8 != v2 )
{
v15 = HalpDmaAllocateScatterPagesFromScatterPool(
(_ADAPTER_OBJECT *)v6,
&ChildAdapter->MasterAdapter->AdapterObject,
v2 - v8,
0,
1u,
&PagesAllocated);
if( v15 )
{
v17 = PagesAllocated;
v18 = v15;
if( (_DWORD)PagesAllocated )
{
v19 = (unsigned int)PagesAllocated;
do
{
v18->u.VirtualAddress = (void *)((unsigned __int64)v18->u.VirtualAddress & 0xFFFFFFFFFFFFFFF3ui64 | 8);
v18 = v18->Next;
--v19;
}
while( v19 );
}
v4 = HalpDmaPrependTranslations(v15, (_HALP_DMA_TRANSLATION_ENTRY *)v17);
v8 += v20;
}
if( v8 != v2 )
{
v21 = HalpDmaAllocateScatterPagesFromContiguousPool(
v16,
&ChildAdapter->MasterAdapter->AdapterObject,
v2 - v8,
0,
1u,
&PagesAllocated);
if( v21 )
{
v22 = PagesAllocated;
v23 = v21;
if( (_DWORD)PagesAllocated )
{
v24 = (unsigned int)PagesAllocated;
do
{
v23->u.VirtualAddress = (void *)((unsigned __int64)v23->u.VirtualAddress & 0xFFFFFFFFFFFFFFF3ui64 | 8);
v23 = v23->Next;
--v24;
}
while( v24 );
}
v4 = HalpDmaPrependTranslations(v21, (_HALP_DMA_TRANSLATION_ENTRY *)v22);
v8 += v25;
}
if( !v8 )
return -1073741670;
}
}
ChildAdapter->MapRegistersPerChannel = v2;
result = 0;
ChildAdapter->AdapterObject.ScatterBufferListHead = v4;
ChildAdapter->AdapterObject.NumberOfFreeScatterBuffers = v8;
return result;
}Referenced by:
HalpDmaAllocateChildAdapterV2
HalpDmaAllocateChildAdapterV3