MiReleaseDriverPtes
VOID __stdcall MiReleaseDriverPtes(UINT64 SessionImage, _MMPTE *PointerPte, UINT64 ExactPtes){
__int64 v3;
__int64 v5;
_ETHREAD *CurrentThread;
__int64 v7;
_RTL_BITMAP *v8;
unsigned __int64 v9;
__int64 v10;
_RTL_BITMAP *v11;
unsigned __int64 Buffer;
__int64 v13;
void *v14;
__int64 v15;
int v16;
unsigned __int64 NumberToClear;
unsigned __int64 StartingIndex;
v16 = SessionImage;
v3 = (unsigned int)ExactPtes;
v5 = (unsigned int)SessionImage;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v7 = (_QWORD)MmGetPteBase() << 25;
v8 = 0i64;
v9 = 0i64;
v10 = (((_QWORD)PointerPte << 25) - v7) >> 16;
MiLockDriverMappings(CurrentThread);
v15 = v5;
v11 = (_RTL_BITMAP *)*(&qword_140C4CA70 + v5);
if( !v11 )
goto LABEL_16;
do
{
Buffer = (unsigned __int64)v11->Buffer;
if( (unsigned __int64)PointerPte >= Buffer )
{
v9 = (-(__int64)((*(&v11[2].SizeOfBitMap + 1) & 1) != 0) & 0xFFFFFFFFFFFFFFF1ui64) + 16;
if( (unsigned __int64)PointerPte < Buffer + 8 * v9 * v11[1].SizeOfBitMap )
break;
}
v8 = v11;
v11 = *(_RTL_BITMAP **)&v11->SizeOfBitMap;
}
while( v11 );
if( !v11 )
LABEL_16:
KeBugCheckEx(0x1Au, (PVOID)0x2102, (PVOID)v10, (PVOID)(unsigned int)((_DWORD)v3 << 12), 0i64);
NumberToClear = (~(v9 - 1) & (v9 + v3 - 1)) / v9;
StartingIndex = (((char *)PointerPte - (char *)v11->Buffer) >> 3) / v9;
if( !RtlAreBitsSet(v11 + 1, (unsigned int)StartingIndex, (unsigned int)NumberToClear) )
KeBugCheckEx(0x1Au, (PVOID)0x2103, (PVOID)v10, (PVOID)(unsigned int)((_DWORD)v3 << 12), 0i64);
if( (*(&v11[2].SizeOfBitMap + 1) & 2) != 0
|| (RtlClearBits(v11 + 1, StartingIndex, NumberToClear), !RtlNumberOfSetBits((UINT64 *)&v11[1].SizeOfBitMap)) )
{
v13 = (((__int64)v11->Buffer << 25) - v7) >> 16;
MiReturnSystemVa(
(VOID *)v13,
(VOID *)(v13 + (((unsigned int)v9 * v11[1].SizeOfBitMap) << 12)),
(_MI_SYSTEM_VA_TYPE)(12 - (v16 != 0)),
0i64);
v14 = *(void **)&v11->SizeOfBitMap;
if( v8 )
*(_QWORD *)&v8->SizeOfBitMap = v14;
else
*(&qword_140C4CA70 + v15) = v14;
MiUnlockDriverMappings(CurrentThread);
ExFreePoolWithTag(v11, 0);
}
else
{
MiUnlockDriverMappings(CurrentThread);
}
}Referenced by:
MiReleaseSystemImageVa
MiReturnSystemImageAddress
MmUnmapLockedRestartPages