MiMapHotPatchImageInSystemSpace
VOID __stdcall MiMapHotPatchImageInSystemSpace(){
_QWORD *v0;
_QWORD *v1;
VOID *v2;
__int64 v3;
_MDL *Mdl;
_MDL *v5;
INT64 v6;
UINT64 v7;
unsigned __int64 v8;
unsigned __int64 v9;
_MDL *v10;
__int64 *i;
_MDL **v12;
unsigned int v13;
_MDL **v14;
__int64 v15;
_MDL *v16;
UINT64 v17;
INT64 a5;
INT64 a6;
v1 = v0;
v2 = (VOID *)v0[1];
LODWORD(a6) = 0;
v3 = (v1[2] - (_QWORD)v2) / 4096i64;
Mdl = IoAllocateMdl(v2, (unsigned int)((_DWORD)v3 << 12), 0, 0, 0i64);
v5 = Mdl;
if( Mdl )
{
v6 = (INT64)&Mdl[1];
v7 = (unsigned int)v3;
v8 = (unsigned int)v3;
v9 = 0i64;
v10 = Mdl + 1;
if( &Mdl[1] > (_MDL *)((char *)&Mdl[1] + 8 * (unsigned int)v3) )
v8 = 0i64;
if( v8 )
{
do
{
++v9;
v10->Next = (_MDL *)*(&stru_140C4DB30 + 497);
v10 = (_MDL *)((char *)v10 + 8);
}
while( v9 < v8 );
}
for( i = (__int64 *)v1[7]; i; i = (__int64 *)*i )
{
v12 = &v5[1].Next + (i[4] + *((unsigned int *)i + 11) - v1[1]) / 4096;
v13 = *((_DWORD *)i + 10) >> 12;
if( v13 )
{
v14 = (_MDL **)(i + 6);
v15 = v13;
do
{
v16 = *v14++;
*v12++ = v16;
--v15;
}
while( v15 );
}
}
v17 = (UINT64)MiReservePtes((_MI_SYSTEM_PTE_TYPE *)((char *)&stru_140C4DB30 + 4432), (unsigned int)v3);
if( v17 )
{
LODWORD(a5) = 4;
MiFillSystemPtes(v17, v7, v6, 4ui64, a5, (INT64)&a6);
v5->MdlFlags |= 1u;
v5->MappedSystemVa = (void *)((__int64)((v17 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16);
v1[8] = v5;
v5 = 0i64;
}
if( v5 )
IoFreeMdl(v5);
}
}Referenced by:
MiPrepareToHotPatchImage