MiHotPatchProcess

NTSTATUS __stdcall MiHotPatchProcess(_EX_RUNDOWN_REF *a1, INT64 a2, INT64 a3){
  _EX_RUNDOWN_REF *v3; 
  int v5; 
  unsigned int v6; 
  _ETHREAD *CurrentThread; 
  _MMVAD_SHORT *Count; 
  _MMVAD_SHORT *i; 
  union {unsigned int LongFlags;_MMVAD_FLAGS VadFlags;_MM_PRIVATE_VAD_FLAGS PrivateVadFlags;_MM_GRAPHICS_VAD_FLAGS GraphicsVadFlags;_MM_SHARED_VAD_FLAGS SharedVadFlags;volatile unsigned int VolatileVadLong;} v11; 
  __int64 v12; 
  __int64 v13; 
  INT64 v14; 
  INT64 v15; 
  NTSTATUS v16; 
  PVOID v17; 
  _MMVAD_SHORT **ExtraCreateInfo; 
  _MMVAD_SHORT *v19; 
  _MMVAD_SHORT *NextVad; 

  v3 = a1 + 139;
  v5 = a3;
  v6 = a2;
  if( !ExAcquireRundownProtection(a1 + 139) )
    return -1073741558;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  LOCK_ADDRESS_SPACE_SHARED(CurrentThread, (_EPROCESS *)a1);
LABEL_4:
  Count = (_MMVAD_SHORT *)a1[251].Count;
  i = 0i64;
  while( Count )
  {
    i = Count;
    Count = Count->NextVad;
  }
  while( i )
  {
    if( (i->u.LongFlags & 0x70) == 32 )
    {
      MiLockVadShared((INT64)CurrentThread, (INT64)i);
      if( !MiVadDeleted(i)
        && (v11.LongFlags = (unsigned int)i->u, (v11.LongFlags & 0x100000) == 0)
        && (v11.LongFlags & 0x70) == 32
        && (v11.LongFlags & 0x400000) != 0
        && (v12 = *(_QWORD *)i[1].ExtraCreateInfo, 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(&CurrentThread->Tcb, (_EX_PUSH_LOCK *)i);
        UNLOCK_ADDRESS_SPACE_SHARED(CurrentThread, (_EPROCESS *)a1);
        MiHotPatchImage(v15, v14, (WCHAR)i, v6);
        LOCK_ADDRESS_SPACE_SHARED(CurrentThread, (_EPROCESS *)a1);
        MiLockVadShared((INT64)CurrentThread, (INT64)i);
        v16 = MiVadDeleted(i);
        MiUnlockAndDereferenceVadShared(v17);
        if( v16 )
          goto LABEL_4;
      }
      else
      {
        MiUnlockVadShared(&CurrentThread->Tcb, (_EX_PUSH_LOCK *)i);
      }
    }
    ExtraCreateInfo = (_MMVAD_SHORT **)i->ExtraCreateInfo;
    v19 = i;
    if( ExtraCreateInfo )
    {
      NextVad = *ExtraCreateInfo;
      for( i = (_MMVAD_SHORT *)i->ExtraCreateInfo; NextVad; NextVad = NextVad->NextVad )
        i = NextVad;
    }
    else
    {
      while( 1 )
      {
        i = (_MMVAD_SHORT *)(i->VadNode.ParentValue & 0xFFFFFFFFFFFFFFFCui64);
        if( !i || i->NextVad == v19 )
          break;
        v19 = i;
      }
    }
  }
  UNLOCK_ADDRESS_SPACE_SHARED(CurrentThread, (_EPROCESS *)a1);
  ExReleaseRundownProtection(v3);
  return 0;
}

Referenced by:

MiHotPatchAllProcesses