HalpDmaAllocateMapRegistersAtHighLevel
_HALP_DMA_TRANSLATION_ENTRY *__stdcall HalpDmaAllocateMapRegistersAtHighLevel(
_HALP_DMA_TRANSLATION_ENTRY *ChildAdapter,
UINT64 *MapRegisterCount){
char v2;
char v3;
unsigned int v4;
_HALP_DMA_ADAPTER_OBJECT *Next;
int v8;
_HALP_DMA_TRANSLATION_ENTRY *v9;
bool v10;
_HALP_DMA_TRANSLATION_ENTRY *result;
_HALP_DMA_TRANSLATION_ENTRY *v12;
_HALP_DMA_TRANSLATION_ENTRY *v13;
_ADAPTER_OBJECT *v14;
UINT64 v15;
_HALP_DMA_TRANSLATION_ENTRY *v16;
_HALP_DMA_TRANSLATION_ENTRY *v17;
_HALP_DMA_TRANSLATION_BUFFER_POSITION *p_LogicalMappedLength;
_ADAPTER_OBJECT *p_ScatterHint;
_HALP_DMA_TRANSLATION_ENTRY *v20;
_ADAPTER_OBJECT *v21;
_HALP_DMA_TRANSLATION_ENTRY *v22;
_HALP_DMA_TRANSLATION_ENTRY *v23;
struct {_HALP_DMA_TRANSLATION_BUFFER_POSITION ContiguousHint;_HALP_DMA_TRANSLATION_BUFFER_POSITION ScatterHint;} *p_CrashDump;
_HALP_DMA_TRANSLATION_ENTRY *v25;
INT64 ContiguousAllocation;
INT64 ContiguousAllocationa;
UINT64 v28;
UINT64 PagesAllocated;
v2 = BYTE2(ChildAdapter[6].PhysicalAddress);
v3 = 0;
v4 = *(_DWORD *)MapRegisterCount;
Next = (_HALP_DMA_ADAPTER_OBJECT *)ChildAdapter[2].Next;
LODWORD(v28) = 0;
v8 = 0;
LODWORD(PagesAllocated) = 0;
v9 = 0i64;
if( v2 )
{
if( ChildAdapter[1].LogicalMappedLength )
goto LABEL_32;
v10 = LODWORD(ChildAdapter[1].NextLogicalAddress) == 0;
}
else
{
if( *(_QWORD *)&ChildAdapter[1].MappedLength )
goto LABEL_32;
v10 = LODWORD(ChildAdapter[1].LogicalAddress) == 0;
}
if( v10 )
{
if( !BYTE1(ChildAdapter[4].u.VirtualAddress) )
{
if( v2 )
{
result = HalpDmaAllocateScatterPagesFromScatterPoolAtHighLevel(
(_ADAPTER_OBJECT *)ChildAdapter,
(_HALP_DMA_ADAPTER_OBJECT *)ChildAdapter,
v4,
&PagesAllocated);
v8 = PagesAllocated;
v9 = result;
if( (_DWORD)PagesAllocated == v4 )
return result;
}
else
{
LODWORD(result) = HalpDmaAllocateContiguousPagesFromContiguousPoolAtHighLevel((INT64)ChildAdapter);
v9 = result;
if( result )
return result;
}
}
if( BYTE2(ChildAdapter[6].PhysicalAddress) )
{
v12 = HalpDmaAllocateScatterPagesFromScatterPoolAtHighLevel((_ADAPTER_OBJECT *)ChildAdapter, Next, v4 - v8, &v28);
if( v12 )
{
v13 = HalpDmaPrependTranslations(v12, (_HALP_DMA_TRANSLATION_ENTRY *)(unsigned int)v28);
v8 += v28;
v9 = v13;
LODWORD(PagesAllocated) = v8;
}
if( v8 == v4 )
return v9;
if( HalpDmaGetAdapterVersion((_ADAPTER_OBJECT *)ChildAdapter) == 2 )
v16 = HalpDmaAllocateScatterPagesFromContiguousPoolAtHighLevelV2(v14, Next, v15, &v28);
else
v16 = HalpDmaAllocateScatterPagesFromContiguousPoolAtHighLevelV3(v14, Next, v15, &v28);
if( v16 )
{
v17 = HalpDmaPrependTranslations(v16, (_HALP_DMA_TRANSLATION_ENTRY *)(unsigned int)v28);
v8 += v28;
v9 = v17;
LODWORD(PagesAllocated) = v8;
}
if( v8 == v4 )
return v9;
}
else
{
LODWORD(result) = HalpDmaAllocateContiguousPagesFromContiguousPoolAtHighLevel((INT64)ChildAdapter);
v9 = result;
if( result )
return result;
}
if( byte_140C4A108 )
{
if( BYTE2(ChildAdapter[6].PhysicalAddress) )
{
*(_DWORD *)MapRegisterCount = PagesAllocated;
}
else if( !v9 )
{
*(_DWORD *)MapRegisterCount = 0;
}
return v9;
}
v8 = PagesAllocated;
}
LABEL_32:
if( BYTE2(ChildAdapter[6].PhysicalAddress) )
{
p_LogicalMappedLength = (_HALP_DMA_TRANSLATION_BUFFER_POSITION *)&ChildAdapter[1].LogicalMappedLength;
p_ScatterHint = (_ADAPTER_OBJECT *)&Next->CrashDump.ScatterHint;
while( 1 )
{
if( BYTE1(ChildAdapter[4].u.VirtualAddress) )
{
v9 = 0i64;
}
else
{
LOBYTE(ContiguousAllocation) = 0;
result = HalpDmaForceAllocation(
(_ADAPTER_OBJECT *)&PagesAllocated,
(_HALP_DMA_TRANSLATION_BUFFER *)ChildAdapter->u.VirtualAddress,
p_LogicalMappedLength,
v4,
ContiguousAllocation,
&PagesAllocated);
v8 = PagesAllocated;
v9 = result;
if( (_DWORD)PagesAllocated == v4 )
return result;
p_ScatterHint = (_ADAPTER_OBJECT *)&Next->CrashDump.ScatterHint;
}
LOBYTE(ContiguousAllocation) = 0;
v20 = HalpDmaForceAllocation(
p_ScatterHint,
Next->ScatterTranslations,
(_HALP_DMA_TRANSLATION_BUFFER_POSITION *)p_ScatterHint,
v4 - v8,
ContiguousAllocation,
&v28);
if( v20 )
{
v22 = HalpDmaPrependTranslations(v20, (_HALP_DMA_TRANSLATION_ENTRY *)(unsigned int)v28);
v8 += v28;
v9 = v22;
LODWORD(PagesAllocated) = v8;
}
if( v8 == v4 )
return v9;
LOBYTE(ContiguousAllocationa) = 0;
v23 = HalpDmaForceAllocation(
v21,
Next->ContiguousTranslations,
&Next->CrashDump.ContiguousHint,
v4 - v8,
ContiguousAllocationa,
&v28);
if( v23 )
{
v25 = HalpDmaPrependTranslations(v23, (_HALP_DMA_TRANSLATION_ENTRY *)(unsigned int)v28);
v8 += v28;
p_CrashDump = &Next->CrashDump;
LODWORD(PagesAllocated) = v8;
v9 = v25;
}
if( v8 == v4 )
return v9;
if( v3 )
goto LABEL_50;
LODWORD(ChildAdapter[1].NextLogicalAddress) = 0;
p_LogicalMappedLength = (_HALP_DMA_TRANSLATION_BUFFER_POSITION *)&ChildAdapter[1].LogicalMappedLength;
ChildAdapter[1].LogicalMappedLength = 0i64;
p_ScatterHint = (_ADAPTER_OBJECT *)&Next->CrashDump.ScatterHint;
Next->CrashDump.ScatterHint.Buffer = 0i64;
v3 = 1;
Next->CrashDump.ScatterHint.Offset = 0;
p_CrashDump->ContiguousHint.Buffer = 0i64;
Next->CrashDump.ContiguousHint.Offset = 0;
}
}
if( BYTE1(ChildAdapter[4].u.VirtualAddress)
|| (LOBYTE(ContiguousAllocation) = 1,
(result = HalpDmaForceAllocation(
(_ADAPTER_OBJECT *)ChildAdapter,
(_HALP_DMA_TRANSLATION_BUFFER *)ChildAdapter->NextLogicalAddress,
(_HALP_DMA_TRANSLATION_BUFFER_POSITION *)&ChildAdapter[1].MappedLength,
v4,
ContiguousAllocation,
0i64)) == 0i64) )
{
LOBYTE(ContiguousAllocation) = 1;
result = HalpDmaForceAllocation(
(_ADAPTER_OBJECT *)ChildAdapter,
Next->ContiguousTranslations,
&Next->CrashDump.ContiguousHint,
v4,
ContiguousAllocation,
0i64);
if( !result )
{
LABEL_50:
*(_DWORD *)MapRegisterCount = 0;
return 0i64;
}
}
return result;
}Referenced by:
HalAllocateCrashDumpRegisters
HalDmaAllocateCrashDumpRegistersEx