MiCheckPteReserve
VOID __stdcall MiCheckPteReserve(_MMPTE *PointerPte, ULONG_PTR NumberOfPtes){
void *BugCheckParameter4;
__int64 v3;
__int64 v4;
unsigned __int64 v5;
unsigned __int64 v6;
unsigned __int64 v7;
unsigned __int64 v8;
unsigned __int64 v9;
unsigned __int64 v10;
volatile signed __int32 *v11;
int v12;
unsigned __int64 v13;
unsigned __int64 v14;
volatile signed __int32 *v15;
int v16;
unsigned __int64 v17;
BugCheckParameter4 = *(void **)&NumberOfPtes;
v3 = (_QWORD)MmGetPteBase() << 25;
v4 = (((_QWORD)PointerPte << 25) - v3) >> 16;
if( !*(_QWORD *)&NumberOfPtes )
KeBugCheckEx(0xDAu, (PVOID)0x200, (PVOID)((((_QWORD)PointerPte << 25) - v3) >> 16), 0i64, 0i64);
v5 = 2i64 * (unsigned int)(((__int64)PointerPte - *(&stru_140C4DB30 + 556)) >> 3);
v6 = v5;
LOBYTE(v7) = 2;
v8 = v5 + 2 * (*(_QWORD *)&NumberOfPtes - 1i64);
if( v5 < v8 )
{
do
{
if( !_bittest64(*(&stru_140C4DB30 + 414), v6) )
KeBugCheckEx(
0xDAu,
(PVOID)0x201,
(PVOID)v4,
(PVOID)(v4 + (((v6 - v5) << 11) & 0xFFFFFFFFFFFFF000ui64)),
BugCheckParameter4);
v9 = v6 & 0x1F;
LOBYTE(v10) = 1;
v11 = (volatile signed __int32 *)(*(&stru_140C4DB30 + 414) + 4 * (v6 >> 5));
if( v9 + 1 > 0x20 )
{
if( (v6 & 0x1F) != 0 )
{
_InterlockedAnd(v11++, ~(((1 << (32 - (v6 & 0x1F))) - 1) << v9));
v10 = 1i64 - (32 - (unsigned int)(v6 & 0x1F));
if( v10 >= 0x20 )
{
v13 = v10 >> 5;
v10 += -32i64 * (v10 >> 5);
do
{
*v11++ = 0;
--v13;
}
while( v13 );
}
if( !v10 )
goto LABEL_14;
}
v12 = -1 << v10;
}
else
{
v12 = ~(1 << v9);
}
_InterlockedAnd(v11, v12);
LABEL_14:
v6 += 2i64;
}
while( v6 < v8 );
}
v14 = v6 & 0x1F;
v15 = (volatile signed __int32 *)(*(&stru_140C4DB30 + 414) + 4 * (v6 >> 5));
if( v14 + 2 > 0x20 )
{
if( (v6 & 0x1F) == 0 )
goto LABEL_23;
v16 = v6 & 0x1F;
_InterlockedAnd(v15++, ~(((1 << (32 - v16)) - 1) << v14));
v7 = 2i64 - (unsigned int)(32 - v16);
if( v7 >= 0x20 )
{
v17 = v7 >> 5;
v7 += -32i64 * (v7 >> 5);
do
{
*v15++ = 0;
--v17;
}
while( v17 );
}
if( v7 )
LABEL_23:
_InterlockedAnd(v15, -1 << v7);
}
else
{
_InterlockedAnd(v15, ~(3 << v14));
}
}Referenced by:
MiReservePtes