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