MiMakeProtoAddressValid

_MMPFN *__stdcall MiMakeProtoAddressValid(VOID *VirtualAddress){
  UINT64 *v2; 
  UINT64 v3; 
  __int64 v4; 
  _MMPFN *v5; 
  UINT8 v6; 
  UINT64 v7; 
  unsigned __int64 v8; 
  UINT64 v10; 

  v2 = (unsigned __int64 *)((char *)&MmGetPteBase()->u.Long + (((unsigned __int64)VirtualAddress >> 9) & 0x7FFFFFFFF8i64));
  while( 1 )
  {
    do
    {
      v3 = *v2;
      v10 = v3;
      if( (v3 & 1) == 0 )
        goto LABEL_9;
      MiPteInShadowRange((UINT64)&v10);
      v4 = (v3 >> 12) & 0xFFFFFFFFFi64;
    }
    while( (MmGetPfnDb()[v4].u4._bf_0 & 0x4000000000000i64) == 0 );
    if( (v10 & 0x200) == 0 )
      break;
LABEL_9:
    MmAccessFault(2ui64, VirtualAddress, 0, 0i64);
  }
  v5 = &MmGetPfnDb()[v4];
  v6 = MiLockPageInline(v5);
  v7 = *v2;
  v8 = v6;
  v10 = v7;
  if( (v7 & 1) == 0 || (v7 & 0x200) != 0 || v4 != ((v7 >> 12) & 0xFFFFFFFFFi64) )
  {
    _InterlockedAnd64(&v5->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
    __writecr8(v6);
    goto LABEL_9;
  }
  MiAddLockedPageCharge(v5, 1ui64);
  _InterlockedAnd64(&v5->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
  __writecr8(v8);
  return v5;
}

Referenced by:

MiLockProtoPage