MiHotPatchProcess

INT64 __fastcall MiHotPatchProcess(struct EX_RUNDOWN_REF *a1, INT64 a2, INT64 a3){
  struct _EX_RUNDOWN_REF *v3; 
  int v5; 
  unsigned int v6; 
  _ETHREAD *CurrentThread; 
  _QWORD *Count; 
  unsigned __int64 i; 
  int v11; 
  __int64 v12; 
  __int64 v13; 
  INT64 v14; 
  INT64 v15; 
  int v16; 
  PVOID v17; 
  _QWORD **v18; 
  unsigned __int64 v19; 
  _QWORD *v20; 
  v3 = a1 + 139;
  v5 = a3;
  v6 = a2;
  if( !ExAcquireRundownProtection(a1 + 139) )
    return 3221225738i64;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  LOCK_ADDRESS_SPACE_SHARED(CurrentThread, (_EPROCESS *)a1);
LABEL_4:
  Count = (_QWORD *)a1[251].Count;
  i = 0i64;
  while( Count )
  {
    i = (unsigned __int64)Count;
    Count = (_QWORD *)*Count;
  }
  while( i )
  {
    if( (*(_DWORD *)(i + 48) & 0x70) == 32 )
    {
      MiLockVadShared((INT64)CurrentThread, i);
      if( !(unsigned int)MiVadDeleted(i)
        && (v11 = *(_DWORD *)(i + 48), (v11 & 0x100000) == 0)
        && (v11 & 0x70) == 32
        && (v11 & 0x400000) != 0
        && (v12 = **(_QWORD **)(i + 72), v13 = *(_QWORD *)(*(_QWORD *)v12 + 56i64), *(_DWORD *)(v13 + 60) == v6)
        && *(_DWORD *)(v13 + 72) == v5 )
      {
        v14 = _InterlockedCompareExchange64((volatile signed __int64 *)(*(_QWORD *)v12 + 24i64), -1i64, -1i64);
        MiReferenceVad(i);
        MiUnlockVadShared((INT64)CurrentThread, i);
        UNLOCK_ADDRESS_SPACE_SHARED((__int64)CurrentThread, (__int64)a1);
        MiHotPatchImage(v15, v14, i, v6);
        LOCK_ADDRESS_SPACE_SHARED(CurrentThread, (_EPROCESS *)a1);
        MiLockVadShared((INT64)CurrentThread, i);
        v16 = MiVadDeleted(i);
        MiUnlockAndDereferenceVadShared(v17);
        if( v16 )
          goto LABEL_4;
      }
      else
      {
        MiUnlockVadShared((INT64)CurrentThread, i);
      }
    }
    v18 = *(_QWORD ***)(i + 8);
    v19 = i;
    if( v18 )
    {
      v20 = *v18;
      for( i = *(_QWORD *)(i + 8); v20; v20 = (_QWORD *)*v20 )
        i = (unsigned __int64)v20;
    }
    else
    {
      while( 1 )
      {
        i = *(_QWORD *)(i + 16) & 0xFFFFFFFFFFFFFFFCui64;
        if( !i || *(_QWORD *)i == v19 )
          break;
        v19 = i;
      }
    }
  }
  UNLOCK_ADDRESS_SPACE_SHARED((__int64)CurrentThread, (__int64)a1);
  ExReleaseRundownProtection(v3);
  return 0i64;
}

Referenced by:

MiHotPatchAllProcesses