MiFillPerSessionProtos
VOID __stdcall MiFillPerSessionProtos(
_CONTROL_AREA *ControlArea,
_MMPTE *PointerProtoPte,
UINT64 *PageArray,
UINT64 NumberOfPtes){
int v4;
unsigned __int64 v8;
_MI_PARTITION *ControlAreaPartition;
signed __int64 v10;
unsigned int NextPageColor;
UINT64 j;
UINT64 v13;
UINT64 DriverPage;
UINT64 v15;
_MMPFN *v16;
LONGLONG *v17;
NTSTATUS v18;
UINT64 *PteFromCopyList;
int v20;
INT64 v21[2];
UINT64 v22[2];
__int64 v23;
signed __int64 i;
unsigned int ProtectionMask;
unsigned int v27;
__int64 v28;
_QWORD *v29;
LARGE_INTEGER *ThawTimeout;
v4 = NumberOfPtes;
*(_OWORD *)v22 = 0i64;
v23 = 0i64;
*(_OWORD *)v21 = 0i64;
if( !v29 )
{
v8 = (unsigned int)NumberOfPtes * ((v28 != 0) + 2) + 1;
MiCreatePteCopyList(v8, (unsigned int)v8, (__int64)v22);
if( !HIDWORD(v22[0]) )
return;
MiInitializePageColorBase(0i64, 0i64, (INT64)v21);
}
ControlAreaPartition = MiGetControlAreaPartition(ControlArea);
if( v4 )
{
v10 = PointerProtoPte - (_MMPTE *)PageArray;
for( i = v10; ; v10 = i )
{
if( v29 )
{
DriverPage = (UINT64)MiAllocateDriverPage();
}
else
{
NextPageColor = MiGetNextPageColor((INT64)v21);
for( j = NextPageColor; ; j = NextPageColor )
{
DriverPage = MiGetPage(ControlAreaPartition, j, 0i64);
if( DriverPage != -1i64 )
break;
MiWaitForFreePage(ControlAreaPartition, v13);
}
}
v16 = (_MMPFN *)((char *)MmGetPfnDb() + 48 * DriverPage);
MiInitializeProtoPfn(DriverPage, (MMPTE *)((char *)PageArray + v10), ProtectionMask, v15);
if( v29 )
{
v17 = (LONGLONG *)ThawTimeout;
v20 = 0;
v18 = KeCopyPrivilegedPage((LARGE_INTEGER *)DriverPage, ThawTimeout, *PageArray);
if( v18 < 0 )
KeBugCheckEx(0x1Au, 0x5150Aui64, *PageArray, DriverPage, v18);
MiMarkPfnVerified((UINT64)v16, 0);
}
else
{
MiCopyPage(DriverPage, *PageArray, (__int128 *)v22, 72);
if( v28 )
{
PteFromCopyList = MiGetPteFromCopyList(v22, DriverPage, -1i64);
MiRelocateImagePfn(
(ULONG_PTR)ControlArea,
(__int64)(((_QWORD)PteFromCopyList << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16,
v27,
DriverPage,
v28,
v20,
2);
*PteFromCopyList = ZeroPte;
}
MiReturnPfnReferenceCount(v16);
v17 = (LONGLONG *)ThawTimeout;
}
++v27;
++PageArray;
--v4;
if( v29 )
{
*v29 += 4096i64;
*v17 += 4096i64;
}
if( !v4 )
break;
}
}
MiReleasePteCopyList((INT64)v22);
}Referenced by:
MiAllocatePerSessionProtos