HalpDmaForceAllocation
_HALP_DMA_TRANSLATION_ENTRY *__stdcall HalpDmaForceAllocation(
_ADAPTER_OBJECT *ChildAdapter,
_HALP_DMA_TRANSLATION_BUFFER *TranslationBufferHead,
_HALP_DMA_TRANSLATION_BUFFER_POSITION *CrashDumpHint,
UINT64 PageCount,
INT64 ContiguousAllocation,
UINT64 *PagesAllocated){
_HALP_DMA_TRANSLATION_BUFFER *Buffer;
int v7;
_HALP_DMA_TRANSLATION_ENTRY *v8;
int v9;
unsigned int v10;
_HALP_DMA_TRANSLATION_ENTRY *result;
unsigned int Offset;
char i;
__int64 v14;
unsigned int EntryCount;
__int64 j;
int v17;
_HALP_DMA_TRANSLATION_ENTRY *v18;
Buffer = CrashDumpHint->Buffer;
v7 = PageCount;
if( !CrashDumpHint->Buffer )
{
if( CrashDumpHint->Offset == -1 )
{
v8 = 0i64;
v9 = 0;
v10 = 0;
goto LABEL_4;
}
CrashDumpHint->Offset = 0;
Buffer = TranslationBufferHead;
CrashDumpHint->Buffer = TranslationBufferHead;
}
Offset = CrashDumpHint->Offset;
v10 = 0;
for( i = 1; ; i = 0 )
{
v14 = 0i64;
v8 = 0i64;
v9 = 0;
while( Buffer )
{
EntryCount = Buffer->EntryCount;
v10 = Offset;
for( j = (__int64)&Buffer->Entries[Offset]; v10 < EntryCount; ++v10 )
{
if( (*(_QWORD *)(j + 48) & 0xFFFFFFFFFFFFF000ui64) != 0 )
{
if( v8 )
*(_QWORD *)(v14 + 8) = j;
else
v8 = (_HALP_DMA_TRANSLATION_ENTRY *)j;
++v9;
v14 = j;
if( v9 == v7 )
goto LABEL_4;
}
else
{
v17 = 0;
if( !(_BYTE)ContiguousAllocation )
v17 = v9;
v9 = v17;
v18 = 0i64;
if( !(_BYTE)ContiguousAllocation )
v18 = v8;
v8 = v18;
}
j += 72i64;
}
Buffer = Buffer->Next;
Offset = 0;
}
if( !(_BYTE)ContiguousAllocation )
break;
if( !i || CrashDumpHint->Buffer == TranslationBufferHead && !CrashDumpHint->Offset )
{
CrashDumpHint->Offset = 0;
result = 0i64;
CrashDumpHint->Buffer = TranslationBufferHead;
return result;
}
Offset = 0;
Buffer = TranslationBufferHead;
}
LABEL_4:
CrashDumpHint->Buffer = Buffer;
CrashDumpHint->Offset = v10;
if( Buffer )
goto LABEL_7;
if( !(_BYTE)ContiguousAllocation )
{
CrashDumpHint->Offset = -1;
LABEL_7:
if( !(_BYTE)ContiguousAllocation )
*(_DWORD *)PagesAllocated = v9;
}
return v8;
}Referenced by:
HalpDmaAllocateMapRegistersAtHighLevel