HalpBlkAddVirtualMapping

INT64 __fastcall HalpBlkAddVirtualMapping(INT64 PageTablePage, INT64 a2, UINT64 a3, INT64 a4, INT64 a5){
  unsigned int v5; 
  int v6; 
  char v10; 
  int i; 
  UINT64 v12; 
  __int64 v13; 
  __int64 v14; 
  UINT64 v15; 
  UINT64 v16; 
  __int64 v17; 
  __int64 v18; 
  __int64 v19; 
  __int64 v20; 
  __int64 v21; 
  v5 = 0;
  v6 = a4;
  v10 = 39;
  for( i = 4; ; --i )
  {
    v12 = HalpRemapVirtualAddress64(HalpBlkPageTableVaWindow, PageTablePage, 0);
    v15 = v12;
    if( !v12 )
      return(unsigned int)-1073741801;
    v16 = (a3 >> v10) & 0x1FF;
    if( i == (_DWORD)v13 )
      break;
    v17 = *(_QWORD *)(v12 + 8 * v16);
    if( ((unsigned __int8)v17 & (unsigned __int8)v13) != 0 )
    {
      PageTablePage = v14 & v17;
    }
    else
    {
      PageTablePage = HalpBlkAllocatePageTablePage(0);
      if( !PageTablePage )
        return(unsigned int)-1073741801;
      v18 = 0i64;
      v19 = 1i64;
      v20 = 2i64;
      do
      {
        v18 |= v19++;
        --v20;
      }
      while( v20 );
      *(_QWORD *)(v15 + 8 * v16) = v18 ^ (PageTablePage ^ v18) & 0xFFFFFFFFF000i64;
    }
    v10 -= 9;
  }
  if( (_DWORD)a5 == 4 || (v21 = v13, (_DWORD)a5 == 64) )
    v21 = 3i64;
  if( (((_DWORD)a5 - 32) & 0xFFFFFFDF) != 0 )
    v21 |= 0x8000000000000000ui64;
  if( v6 != (_DWORD)v13 )
    v21 |= 0x18ui64;
  *(_QWORD *)(v12 + 8 * v16) = v21 | v14 & a2;
  return v5;
}

Referenced by:

HalpBlkAllocateAndShadowMemory
HalpBlkAllocateShadowCode
HalpBlkShadowApic
HalpBlkShadowStartupBlock