MiFillPageWithImageExtentContents
INT64 __stdcall MiFillPageWithImageExtentContents(PVOID BugCheckParameter3, INT64 a2){
ULONG_PTR v2;
unsigned int v3;
ULONG_PTR BugCheckParameter4;
ULONG_PTR v6;
unsigned int v8;
UINT64 *v9;
ULONG_PTR v10;
int v11;
int v12;
int v13;
char *v14;
__int64 v15;
UINT64 ValidPte;
UINT64 *v17;
unsigned __int64 v18;
__int64 v19;
INT64 result;
__int64 v21;
__int16 v22;
unsigned __int64 v23;
UINT64 dst;
__int64 v25;
__int64 v26;
unsigned int v27;
unsigned __int8 CurrentIrql;
unsigned int Size;
int v30;
Size = v3;
BugCheckParameter4 = v3;
v22 = v2;
v6 = v2;
v27 = (v2 & 0xFFF) + v3;
v8 = (v27 > 0x1000) + 3;
if( v3 == 4096 )
v8 = (v27 > 0x1000) + 2;
if( v30 )
{
CurrentIrql = 17;
}
else
{
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
}
v26 = v8;
dst = MiAllocateHyperSpace(v8);
v9 = (UINT64 *)((char *)MmGetPteBase() + ((dst >> 9) & 0x7FFFFFFFF8i64));
*v9 = MiMakeValidPte((UINT64)v9, a2, 2684354564i64);
v10 = v6 >> 12;
v11 = 0;
v12 = *(_DWORD *)BugCheckParameter3 - 1;
if( v12 < 0 )
goto LABEL_32;
do
{
v13 = (v11 + v12) >> 1;
v14 = (char *)BugCheckParameter3 + 48 * v13;
v15 = *((unsigned int *)v14 + 8);
if( (unsigned int)v10 >= (unsigned int)v15 )
{
if( (unsigned int)v10 < (int)v15 + *((_DWORD *)v14 + 12) )
break;
v11 = v13 + 1;
}
else
{
if( !v13 )
KeBugCheckEx(0x1Au, 0x13000ui64, v6, (ULONG_PTR)BugCheckParameter3, BugCheckParameter4);
v12 = v13 - 1;
}
}
while( v12 >= v11 );
if( v12 < v11 )
LABEL_32:
KeBugCheckEx(0x1Au, 0x13001ui64, v6, (ULONG_PTR)BugCheckParameter3, BugCheckParameter4);
v23 = *((_QWORD *)v14 + 5) + (unsigned int)v10 - v15;
ValidPte = MiMakeValidPte((UINT64)(v9 + 1), v23, 536870913i64);
v9[1] = ValidPte;
v17 = v9 + 2;
v25 = (_QWORD)MmGetPteBase() << 25;
if( v27 > 0x1000 )
{
if( v23 >= *((_QWORD *)v14 + 5) + *((_QWORD *)v14 + 6) - 1i64 )
{
if( (v14 + 56 - (_BYTE *)BugCheckParameter3 - 8) / 48 == *(_DWORD *)BugCheckParameter3 )
KeBugCheckEx(0x1Au, 0x13002ui64, v6, (ULONG_PTR)BugCheckParameter3, Size);
v18 = *((_QWORD *)v14 + 11) << 12;
}
else
{
v18 = (ValidPte & 0xFFFFFFFFFFFFF000ui64) + 4096;
}
ValidPte ^= (ValidPte ^ v18) & 0xFFFFFFFFF000i64;
*v17 = ValidPte;
v17 = v9 + 3;
}
memmove((UINT8 *)dst, (UINT8 *)((v22 & 0xFFF) + ((((_QWORD)(v9 + 1) << 25) - v25) >> 16)), Size);
if( Size != 4096 )
{
*v17 = ValidPte ^ (ValidPte ^ (qword_140C4EAC0 << 12)) & 0xFFFFFFFFF000i64;
memmove((UINT8 *)(dst + Size), (UINT8 *)((((_QWORD)v17 << 25) - v25) >> 16), 4096 - Size);
}
v19 = v26;
do
{
*v9++ = ZeroPte;
--v19;
}
while( v19 );
result = (INT64)KeGetCurrentPrcb();
v21 = *(_QWORD *)(result + 32760);
if( v21 )
*(_QWORD *)(v21 + 12344) = 0i64;
if( CurrentIrql != 17 )
{
result = CurrentIrql;
__writecr8(CurrentIrql);
}
return result;
}Referenced by:
MiCopyFromDirectMapExtent
MiCopyImageExtentContents