MiMapHotPatchImageInSystemSpace

INT64 __fastcall MiMapHotPatchImageInSystemSpace(_QWORD *a1){
  void *v2; 
  __int64 v3; 
  PMDL Mdl; 
  _MDL *v5; 
  unsigned int v6; 
  INT64 v7; 
  UINT64 v8; 
  unsigned __int64 v9; 
  unsigned __int64 v10; 
  struct _MDL *v11; 
  __int64 *i; 
  _MDL **v13; 
  unsigned int v14; 
  _MDL **v15; 
  __int64 v16; 
  _MDL *v17; 
  INT64 v18; 
  INT64 a5; 
  INT64 a6; 
  v2 = (void *)a1[1];
  LODWORD(a6) = 0;
  v3 = (a1[2] - (_QWORD)v2) / 4096i64;
  Mdl = IoAllocateMdl(v2, (_DWORD)v3 << 12, 0, 0, 0i64);
  v5 = Mdl;
  if( Mdl )
  {
    v7 = (INT64)&Mdl[1];
    v8 = (unsigned int)v3;
    v9 = (unsigned int)v3;
    v10 = 0i64;
    v11 = Mdl + 1;
    if( &Mdl[1] > (struct _MDL *)((char *)&Mdl[1] + 8 * (unsigned int)v3) )
      v9 = 0i64;
    if( v9 )
    {
      do
      {
        ++v10;
        v11->Next = (_MDL *)qword_140C4EAB8;
        v11 = (struct _MDL *)((char *)v11 + 8);
      }
      while( v10 < v9 );
    }
    for( i = (__int64 *)a1[7]; i; i = (__int64 *)*i )
    {
      v13 = &v5[1].Next + (i[4] + *((unsigned int *)i + 11) - a1[1]) / 4096;
      v14 = *((_DWORD *)i + 10) >> 12;
      if( v14 )
      {
        v15 = (_MDL **)(i + 6);
        v16 = v14;
        do
        {
          v17 = *v15++;
          *v13++ = v17;
          --v16;
        }
        while( v16 );
      }
    }
    v18 = MiReservePtes((INT64)&qword_140C4EC80, (unsigned int)v3);
    if( v18 )
    {
      LODWORD(a5) = 4;
      MiFillSystemPtes(v18, v8, v7, 4ui64, a5, (INT64)&a6);
      v5->MdlFlags |= 1u;
      v5->MappedSystemVa = (void *)(((v18 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16);
      v6 = 0;
      a1[8] = v5;
      v5 = 0i64;
    }
    else
    {
      v6 = -1073741670;
    }
    if( v5 )
      IoFreeMdl(v5);
  }
  else
  {
    return(unsigned int)-1073741670;
  }
  return v6;
}

Referenced by:

MiPrepareToHotPatchImage