MiHandleBootImage

VOID __stdcall MiHandleBootImage(INT64 a1, INT64 a2, INT64 a3){
  unsigned int v3; 
  UINT64 v4; 
  unsigned int v6; 
  __int64 v7; 
  VOID *v8; 
  __int64 v9; 
  unsigned __int64 v10; 
  INT64 *v11; 
  unsigned int v12; 
  VOID *v13; 
  char v14; 
  int v15; 
  int v16; 
  VOID *v17; 
  _UNICODE_STRING *v18; 
  unsigned int v19; 
  INT64 *v20; 
  UINT64 v21; 
  int v22; 
  _LARGE_INTEGER *v23; 
  INT8 *v24; 
  UINT64 v26; 
  _MI_TB_FLUSH_LIST *TbFlushList; 
  __int64 v28; 

  TbFlushList = (_MI_TB_FLUSH_LIST *)a3;
  v3 = 1;
  v4 = *(_QWORD *)(a2 + 48);
  v6 = ((unsigned int)dword_140C4C9F0 >> 12) + ((dword_140C4C9F0 & 0xFFF) != 0);
  LODWORD(v26) = dword_140C4C98C;
  LODWORD(v7) = RtlImageNtHeader(v4);
  v9 = v7;
  v10 = ((unsigned __int64)*(unsigned int *)(a2 + 64) + 4095) >> 12;
  v11 = (INT64 *)((char *)MmGetPteBase() + ((v4 >> 9) & 0x7FFFFFFFF8i64));
  v12 = v6;
  if( v4 == PsNtosImageBase || (PVOID)v4 == PsHalImageBase )
  {
    if( MI_IS_PHYSICAL_ADDRESS((VOID *)v4) )
    {
      v3 = 3;
      LODWORD(v10) = (v10 + 511) & 0xFFFFFE00;
      v12 = (v6 + 511) & 0xFFFFFE00;
    }
  }
  else
  {
    v12 = v6 + v26;
  }
  if( v12 )
    MiFreeBootDriverPages(v4, (INT64)&v11[(unsigned int)v10], v12, v3, TbFlushList);
  if( v4 != PsNtosImageBase && (PVOID)v4 != PsHalImageBase )
  {
    v13 = 0i64;
    *(_QWORD *)(v9 + 48) = v4;
    if( (*(_DWORD *)(a2 + 104) & 0x800000) == 0 )
    {
      v14 = 4;
      if( (*(_BYTE *)(v9 + 22) & 1) != 0
        || *(_DWORD *)(v9 + 132) <= 5u
        || (v15 = *(_DWORD *)(v9 + 176)) != 0 && (unsigned int)(*(_DWORD *)(v9 + 180) + v15) > *(_DWORD *)(a2 + 64) )
      {
        v14 = 0;
      }
      else
      {
        LOBYTE(v16) = MiImportOptimizationCompatibleWithDriverRelocation(a2);
        if( v16 )
        {
          if( !v6 )
          {
            if( (unsigned int)MiUseLargeDriverPage((_UNICODE_STRING *)(a2 + 88), v17, v8, v18) )
            {
              DbgUnLoadImageSymbolsUnicode((_UNICODE_STRING *)(a2 + 88), (VOID *)v4, 0xFFFFFFFFui64);
              v14 = 6;
              v24 = MiMapSystemImageWithLargePage(0i64, (unsigned int)v10, (UINT8 *)v4);
              v13 = v24;
              if( v24 )
              {
                v14 = 7;
                MiBootImageRelocated((_LOADER_PARAMETER_BLOCK *)a1, a2, (_BYTE *)v4, v24, v9, v10);
                MiFreeBootDriverPages(v4, (INT64)v11, (unsigned int)v10, 0i64, TbFlushList);
                MiReleaseSystemImageVa(v4, (unsigned int)(v10 + v26));
              }
            }
          }
        }
      }
      if( (v14 & 1) == 0 )
      {
        v28 = 0i64;
        v13 = (VOID *)v4;
        v19 = 0;
        v20 = &v11[(unsigned int)v10];
        if( v11 < v20 )
        {
          MiPteInShadowRange((UINT64)&v26);
          do
          {
            LODWORD(v21) = MI_READ_PTE_LOCK_FREE((INT64)v11);
            v26 = v21;
            LOBYTE(v22) = MiIsPfnFromSlabAllocation((INT64)&MmGetPfnDb()[(v21 >> 12) & 0xFFFFFFFFFi64]);
            if( !v22 )
            {
              MiGetBootImagePageProtection(v19, v9, (__int64)v8, &v28);
              LODWORD(v23) = MiAllocateDriverPage();
              if( v23 != (_LARGE_INTEGER *)-1i64 )
                MiTradeBootImagePage(v11, v23);
            }
            ++v11;
            v19 += 4096;
          }
          while( v11 < v20 );
        }
      }
      if( (v14 & 2) != 0
        && (unsigned int)DbgLoadImageSymbolsUnicode((_UNICODE_STRING *)(a2 + 88), v13, (UINT64)v8) == 1 )
      {
        *(_DWORD *)(a2 + 104) |= 0x100000u;
      }
    }
  }
}

Referenced by:

MiReloadBootLoadedDrivers