MiMakeProtoReadOnly

CHAR __stdcall MiMakeProtoReadOnly(UINT64 *a1, INT64 a2){
  INT64 v4; 
  char v5; 
  __int64 v6; 
  unsigned __int64 v7; 
  int v8; 
  _ETHREAD *CurrentThread; 
  v4 = MI_READ_PTE_LOCK_FREE((INT64)a1);
  v5 = *(_BYTE *)(a2 + 34) >> 6;
  v6 = 1i64;
  if( v5 != 1 )
  {
    if( v5 )
    {
      if( v5 == 2 )
        v6 = 25i64;
    }
    else
    {
      v6 = 9i64;
    }
  }
  v7 = v4 & 0xFFFFFFFFFFFFFC1Fui64 | (32 * v6);
  v8 = 0;
  LODWORD(CurrentThread) = MiPteInShadowRange((UINT64)a1);
  if( (_DWORD)CurrentThread )
  {
    LODWORD(CurrentThread) = MiPteHasShadow();
    if( (_DWORD)CurrentThread )
    {
      v8 = 1;
      if( HIBYTE(word_140C4DD48) )
        goto LABEL_13;
    }
    else
    {
      CurrentThread = (_ETHREAD *)KeGetCurrentThread();
      if( (*(_DWORD *)(*((_QWORD *)CurrentThread + 23) + 2172i64) & 0x1000) == 0 )
        goto LABEL_13;
    }
    if( (v7 & 1) != 0 )
    {
      LOBYTE(CurrentThread) = 0;
      v7 |= 0x8000000000000000ui64;
    }
  }
LABEL_13:
  *a1 = v7;
  if( v8 )
    LOBYTE(CurrentThread) = MiWritePteShadow();
  return(char)CurrentThread;
}

Referenced by:

MiFinishHardFault
MiResolveTransitionFault