MiRemoveSecureEntry
VOID __stdcall MiRemoveSecureEntry(_MMVAD *Vad, _MI_VAD_EVENT_BLOCK *SecureToRemove){
_MI_VAD_EVENT_BLOCK **v2;
unsigned int v5;
int v6;
__int64 v7;
INT64 *SharedVm;
KIRQL v9;
_MI_VAD_EVENT_BLOCK *i;
v2 = (_MI_VAD_EVENT_BLOCK **)((char *)Vad + 56);
v5 = 0;
v6 = 0;
v7 = *((_QWORD *)KeGetCurrentThread() + 23);
SharedVm = MiGetSharedVm(v7 + 1664);
v9 = ExAcquireSpinLockExclusive((PEX_SPIN_LOCK)SharedVm);
*((_DWORD *)SharedVm + 1) = 0;
for( i = *v2; i; i = *(_MI_VAD_EVENT_BLOCK **)i )
{
if( *((_DWORD *)i + 16) == 2 && v5 <= 1 )
++v5;
if( i == SecureToRemove )
{
v6 = 1;
*v2 = *(_MI_VAD_EVENT_BLOCK **)i;
}
if( v5 > 1 && v6 == 1 )
break;
v2 = (_MI_VAD_EVENT_BLOCK **)i;
}
MiUnlockWorkingSetExclusive(v7 + 1664, v9);
if( !v6 )
KeBugCheckEx(0x1Au, 0x15001ui64, (ULONG_PTR)Vad, (ULONG_PTR)SecureToRemove, 0i64);
if( (*((_DWORD *)SecureToRemove + 2) & 0x10) != 0 )
MiUnsecureVirtualMemoryAgainstWrites(Vad, *((VOID **)SecureToRemove + 1), *((VOID **)SecureToRemove + 2));
if( v5 == 1 )
MiSetVadFlags((INT64)Vad, 1, 0);
ExFreePoolWithTag(SecureToRemove, 0);
}Referenced by:
MiUnmapLockedPagesInUserSpace
MmUnsecureVirtualMemory