IvtInitializeIdentityMappings
INT64 __fastcall IvtInitializeIdentityMappings(INT64 a1){
int v2;
unsigned int v3;
LARGE_INTEGER v4;
PVOID v5;
unsigned int v6;
__int64 v7;
__int64 v8;
LARGE_INTEGER v9;
LARGE_INTEGER v10;
UINT64 *v11;
UINT64 *v12;
__int64 v13;
__int64 v14;
__int64 v15;
__int64 v16;
v2 = *(_DWORD *)(a1 + 208);
v3 = (*(_QWORD *)(a1 + 176) & 0x800000000i64) != 0 ? 30 : 21;
v4.QuadPart = ((__int64(__fastcall *)(__int64, __int64))IvtPhysicalMemoryApi)(-1i64, 1i64);
*(LARGE_INTEGER *)(a1 + 272) = v4;
if( !v4.QuadPart )
return 3221225473i64;
v5 = HalMapIoSpace(v4, 0x1000ui64, MmCached);
*(_QWORD *)(a1 + 280) = v5;
memset((INT64)v5, 0i64);
if( (v2 != 0 ? 48 : 39) - v3 > 9 )
{
v6 = 0;
v7 = 0i64;
while( 1 )
{
v8 = *(_QWORD *)(a1 + 280);
v9.QuadPart = ((__int64(__fastcall *)(__int64, __int64))IvtPhysicalMemoryApi)(-1i64, 1i64);
v10 = v9;
if( !v9.QuadPart )
return 3221225473i64;
v11 = (UINT64 *)HalMapIoSpace(v9, 0x1000ui64, MmCached);
v12 = v11;
if( !v11 )
return 3221225473i64;
memset((INT64)v11, 0i64);
IvtInitializeLargePagePte(v12, (unsigned __int64)v6 << ((unsigned __int8)v3 + 9), v3);
v13 = 1i64;
v14 = 2i64;
do
{
v15 = v13++;
v16 = *(_QWORD *)(v7 + v8) | v15;
*(_QWORD *)(v7 + v8) = v16;
--v14;
}
while( v14 );
*(_QWORD *)(v7 + v8) = v16 ^ (v10.QuadPart ^ v16) & 0xFFFFFFFFFF000i64;
if( (*(_BYTE *)(a1 + 184) & 1) == 0 )
KeInvalidateRangeAllCachesNoIpi(v12, 0x1000ui64);
++v6;
v7 += 8i64;
if( v6 >= 0x200 )
goto LABEL_13;
}
}
IvtInitializeLargePagePte(*(UINT64 **)(a1 + 280), 0i64, v3);
LABEL_13:
if( (*(_BYTE *)(a1 + 184) & 1) == 0 )
KeInvalidateRangeAllCachesNoIpi(*(PVOID *)(a1 + 280), 0x1000ui64);
return 0i64;
}Referenced by:
IvtInitializeIommu