HalpIommuConstructReservedPageTable
NTSTATUS __stdcall HalpIommuConstructReservedPageTable(INT64 a1, _LARGE_INTEGER *a2, UINT64 a3){
unsigned int v3;
int PageTableType;
INT64 v7;
_LARGE_INTEGER *v8;
__int64 i;
_LARGE_INTEGER v10;
_LARGE_INTEGER v11;
INT64 v12;
INT64 v14;
INT64 v15;
LODWORD(v15) = 0;
v3 = a3;
if( byte_140C49B2C || !a2[3].anonymous_0.LowPart )
return -1073741811;
PageTableType = HalpIommuGetPageTableType(&v15);
if( PageTableType >= 0 )
{
v8 = a2 + 1;
PageTableType = HalpIommuCreateDmarPageTable((unsigned int)v15, v3, v3, v7, v14, a1, (INT64 *)&a2[1]);
if( PageTableType >= 0 )
{
PageTableType = HalpIommuGetDmarptRootAddress(v8->QuadPart, v3, a2 + 2);
if( PageTableType >= 0 )
{
for( i = 0i64; (unsigned int)i < a2[3].anonymous_0.LowPart; i = (unsigned int)(i + 1) )
{
if( !LOBYTE(a2[3 * i + 6].anonymous_0.LowPart) )
{
if( (a2[3 * i + 4].anonymous_0.LowPart & 0xFFF) != 0 )
return -1073741811;
v10 = a2[3 * i + 5];
v11 = a2[3 * i + 4];
if( v10.QuadPart <= v11.QuadPart )
return -1073741811;
v12 = v10.QuadPart - v11.QuadPart + 1;
if( (v12 & 0xFFF) != 0 )
return -1073741811;
PageTableType = HalpIommuMapLogicalRange(a1, v8->QuadPart, 3ui64, a2[3 * i + 4].QuadPart, v12, v11.QuadPart);
if( PageTableType < 0 )
return PageTableType;
}
}
}
}
}
return PageTableType;
}Referenced by:
HalpIommuConstructReservedPageTables