HalpIommuAllocateDmaDomain
NTSTATUS __stdcall HalpIommuAllocateDmaDomain(INT64 a1, CHAR a2, INT64 *a3){
int PageTableType;
unsigned int v6;
UINT8 *v7;
_HALP_ALLOC_CONTEXT *v8;
INT64 *v9;
bool v10;
signed __int32 v12;
INT64 v13;
INT64 v14;
signed __int32 v15;
int v16;
INT64 v17;
LODWORD(v17) = 0;
PageTableType = 0;
v6 = a1;
v7 = HalpMmAllocCtxAlloc((_HALP_ALLOC_CONTEXT *)a1, 0x30ui64);
v9 = (INT64 *)v7;
if( !v7 )
return -1073741670;
v10 = byte_140C49B2C == 0;
*(_OWORD *)v7 = 0i64;
*((_OWORD *)v7 + 1) = 0i64;
*((_OWORD *)v7 + 2) = 0i64;
v7[44] = a2;
if( !v10 )
{
if( a2 )
{
if( !byte_140C49B2E )
goto LABEL_13;
}
else if( !byte_140C49B2D )
{
goto LABEL_13;
}
v12 = _InterlockedIncrement(&HalpIommuDomainId);
*((_DWORD *)v7 + 8) = v12;
v16 = 0;
v7[40] = a2 == 0;
v15 = v12;
LOBYTE(v16) = a2 == 0;
PageTableType = ((__int64(__fastcall *)(signed __int32 *))qword_140C4A2B0)(&v15);
goto LABEL_6;
}
if( !a2 )
{
LABEL_13:
PageTableType = -1073741637;
goto LABEL_16;
}
if( v6 > 1 )
{
PageTableType = HalpIommuGetPageTableType(&v17);
if( PageTableType < 0 )
goto LABEL_16;
PageTableType = HalpIommuCreateDmarPageTable(
(unsigned int)v17,
HIDWORD(qword_140C49BE8),
(unsigned int)qword_140C49BE8,
v13,
v14,
0i64,
v9 + 3);
if( PageTableType < 0 )
goto LABEL_16;
}
v9[1] = (INT64)v9;
*v9 = (INT64)v9;
v9[2] = 0i64;
LABEL_6:
*((_DWORD *)v9 + 9) = v6;
*a3 = (INT64)v9;
if( PageTableType < 0 )
LABEL_16:
HalpMmAllocCtxFree(v8, v9);
return PageTableType;
}Referenced by:
HalpIommuInitializeDmar
IommuDomainCreate