MiCheckHoldFaultForHotPatch

INT64 __fastcall MiCheckHoldFaultForHotPatch(INT64 a1, INT64 *a2){
  INT64 v2; 
  bool v3; 
  unsigned int v5; 
  _QWORD *v6; 
  _QWORD *v7; 
  unsigned __int64 v8; 
  _QWORD *v9; 
  _QWORD *v10; 
  INT64 *SharedVm; 
  __int128 v13; 
  __int128 Object; 
  __int64 v15; 
  v2 = a2[7];
  v3 = (a2[1] & 2) == 0;
  v15 = 0i64;
  v13 = 0i64;
  Object = 0i64;
  if( v3 || (unsigned __int64)*a2 > 0x7FFFFFFEFFFFi64 )
    return 0i64;
  v5 = 0;
  v6 = (_QWORD *)(a1 + 24);
  while( 1 )
  {
    v7 = (_QWORD *)*v6;
    if( (_QWORD *)*v6 == v6 )
      break;
    v8 = *a2;
    do
    {
      v9 = v7;
      if( v8 >= v7[2] && v8 <= v7[3] )
        break;
      v7 = (_QWORD *)*v7;
    }
    while( v7 != v6 );
    if( v7 == v6 )
      break;
    LOWORD(Object) = 0;
    DWORD1(Object) = 0;
    v15 = (__int64)&Object + 8;
    *((_QWORD *)&Object + 1) = (char *)&Object + 8;
    BYTE2(Object) = 6;
    v10 = (_QWORD *)v9[5];
    if( (_QWORD *)*v10 != v9 + 4 )
      __fastfail(3u);
    *((_QWORD *)&v13 + 1) = v9[5];
    *(_QWORD *)&v13 = v9 + 4;
    *v10 = &v13;
    v9[5] = &v13;
    MiUnlockFaultWorkingSet((INT64)(a2 + 7));
    v5 = 1;
    KeWaitForSingleObject(&Object, WrKernel, 0, 0, 0i64);
    SharedVm = MiGetSharedVm(v2);
    ExAcquireSpinLockExclusive((PEX_SPIN_LOCK)SharedVm);
    *((_DWORD *)SharedVm + 1) = 0;
    *((_BYTE *)a2 + 69) |= 1u;
  }
  return v5;
}

Referenced by:

MiUserFault