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