MiFillPageWithImageExtentContents
_KPRCB *__stdcall MiFillPageWithImageExtentContents(
ULONG_PTR BugCheckParameter3,
INT64 a2,
ULONG_PTR BugCheckParameter2,
ULONG_PTR BugCheckParameter4,
INT64 a5){
void *v5;
_DWORD *v6;
unsigned __int64 v7;
unsigned int v9;
char *v10;
__int64 v11;
__int64 v12;
int v13;
__int64 v14;
unsigned __int64 v15;
int v16;
int v17;
int v18;
_DWORD *v19;
__int64 v20;
unsigned __int64 *v21;
unsigned __int64 v22;
unsigned __int64 v23;
unsigned __int64 v24;
int v25;
__int64 v26;
UINT64 v27;
const VOID *v28;
unsigned __int64 v29;
unsigned __int64 v30;
int v31;
__int64 v32;
int v33;
__int64 v34;
unsigned __int64 Long;
int v36;
_KPRCB *result;
_QWORD *MmInternal;
__int16 v39;
unsigned __int64 v40;
unsigned __int64 HyperSpace;
__int64 v42;
__int64 v43;
ULONG_PTR v44;
unsigned __int8 CurrentIrql;
v5 = (void *)BugCheckParameter4;
v39 = BugCheckParameter2;
v6 = *(_DWORD **)&BugCheckParameter3;
v7 = *(_QWORD *)&BugCheckParameter2;
v44 = (BugCheckParameter2 & 0xFFF) + BugCheckParameter4;
v9 = (v44 > 0x1000) + 3;
if( BugCheckParameter4 == 4096 )
v9 = (v44 > 0x1000) + 2;
if( (_DWORD)a5 )
{
CurrentIrql = 17;
}
else
{
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
}
v43 = v9;
HyperSpace = (unsigned __int64)MiAllocateHyperSpace();
v10 = (char *)MmGetPteBase() + ((HyperSpace >> 9) & 0x7FFFFFFFF8i64);
LODWORD(v11) = MiMakeValidPte((_XSTATE_CONFIGURATION *)v10, a2, 2684354564i64);
v12 = v11;
LOBYTE(v13) = MiPteInShadowRange((UINT64)v10);
if( v13 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v12 & 1) != 0 )
v12 |= v14;
*(_QWORD *)v10 = v12;
v15 = v7 >> 12;
v16 = 0;
v17 = *v6 - 1;
if( v17 < 0 )
goto LABEL_52;
do
{
v18 = (v16 + v17) >> 1;
v19 = &v6[12 * v18];
v20 = (unsigned int)v19[8];
if( (unsigned int)v15 >= (unsigned int)v20 )
{
if( (unsigned int)v15 < (int)v20 + v19[12] )
break;
v16 = v18 + 1;
}
else
{
if( !v18 )
KeBugCheckEx(0x1Au, (PVOID)0x13000, (PVOID)v7, v6, v5);
v17 = v18 - 1;
}
}
while( v17 >= v16 );
if( v17 < v16 )
LABEL_52:
KeBugCheckEx(0x1Au, (PVOID)0x13001, (PVOID)v7, v6, v5);
v21 = (unsigned __int64 *)(v10 + 8);
v40 = *((_QWORD *)v19 + 5) + (unsigned int)v15 - v20;
LODWORD(v22) = MiMakeValidPte((_XSTATE_CONFIGURATION *)(v10 + 8), v40, 536870913i64);
v23 = v22;
v24 = v22;
LOBYTE(v25) = MiPteInShadowRange((UINT64)(v10 + 8));
if( v25 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v23 & 1) != 0 )
v24 |= 0x8000000000000000ui64;
*v21 = v24;
v26 = (_QWORD)v21 << 25;
v27 = (UINT64)(v10 + 16);
v42 = (_QWORD)MmGetPteBase() << 25;
v28 = (const VOID *)((v39 & 0xFFF) + ((v26 - v42) >> 16));
if( v44 > 0x1000 )
{
if( v40 >= *((_QWORD *)v19 + 5) + *((_QWORD *)v19 + 6) - 1i64 )
{
if( ((char *)(v19 + 14) - (char *)v6 - 8) / 48 == *v6 )
KeBugCheckEx(0x1Au, (PVOID)0x13002, (PVOID)v7, v6, (PVOID)BugCheckParameter4);
v29 = *((_QWORD *)v19 + 11) << 12;
}
else
{
v29 = (v23 & 0xFFFFFFFFFFFFF000ui64) + 4096;
}
v23 ^= (v23 ^ v29) & 0xFFFFFFFFF000i64;
v30 = v23;
LOBYTE(v31) = MiPteInShadowRange(v27);
if( v31 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v23 & 1) != 0 )
v30 = v23 | 0x8000000000000000ui64;
*(_QWORD *)v27 = v30;
v27 = (UINT64)(v10 + 24);
}
memmove((VOID *)HyperSpace, v28, BugCheckParameter4);
if( BugCheckParameter4 != 4096 )
{
v32 = v23 ^ (v23 ^ (*(&stru_140C4DB30 + 498) << 12)) & 0xFFFFFFFFF000i64;
LOBYTE(v33) = MiPteInShadowRange(v27);
if( v33 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v32 & 1) != 0 )
v32 |= 0x8000000000000000ui64;
*(_QWORD *)v27 = v32;
memmove(
(VOID *)(HyperSpace + BugCheckParameter4),
(const VOID *)((__int64)((v27 << 25) - v42) >> 16),
4096 - BugCheckParameter4);
}
v34 = v43;
do
{
Long = ZeroPte.u.Long;
LOBYTE(v36) = MiPteInShadowRange((UINT64)v10);
if( v36 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (ZeroPte.u.Long & 1) != 0 )
Long = ZeroPte.u.Long | 0x8000000000000000ui64;
*(_QWORD *)v10 = Long;
v10 += 8;
--v34;
}
while( v34 );
result = KeGetCurrentPrcb();
MmInternal = result->MmInternal;
if( MmInternal )
MmInternal[1543] = 0i64;
if( CurrentIrql != 17 )
{
result = (_KPRCB *)CurrentIrql;
__writecr8(CurrentIrql);
}
return result;
}Referenced by:
MiCopyFromDirectMapExtent
MiCopyImageExtentContents