MiHotPatchImage

VOID __fastcall MiHotPatchImage(INT64 a1, INT64 rdx0, WCHAR r8_0, INT64 r9_0){
  UINT64 v4; 
  _ETHREAD *CurrentThread; 
  struct _EX_RUNDOWN_REF *v6; 
  int v7; 
  _QWORD *ProcessHotPatchContext; 
  int v9; 
  int v10; 
  int v11; 
  unsigned int v12; 
  INT64 HotPatchEntry; 
  __int64 v14; 
  INT64 v15; 
  int v16; 
  struct _UNICODE_STRING v17; 
  int v18; 
  WCHAR v19; 
  int v20; 
  INT64 a7; 
  INT64 a7a; 
  __int64 v23; 
  __int64 v24; 
  __int64 v25; 
  struct _UNICODE_STRING DestinationString; 
  int v27; 
  INT64 a5; 
  _ETHREAD *v29; 
  struct _EX_RUNDOWN_REF *v30; 
  PEX_RUNDOWN_REF RunRef; 
  struct _UNICODE_STRING v32; 
  INT64 a4; 
  INT64 v34; 
  INT64 a2; 
  INT64 a3; 
  char v37; 
  int v38; 
  LODWORD(a2) = r9_0;
  v34 = rdx0;
  a4 = a1;
  v25 = 0i64;
  a5 = 0i64;
  DestinationString = 0i64;
  v4 = r8_0;
  RtlInitUnicodeString(&DestinationString, 0i64, r8_0);
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v29 = CurrentThread;
  v6 = (struct _EX_RUNDOWN_REF *)*((_QWORD *)CurrentThread + 23);
  v30 = v6;
  RunRef = v6 + 139;
  if( ExAcquireRundownProtection(v6 + 139) )
  {
    v7 = v38;
    ProcessHotPatchContext = 0i64;
    v9 = 1;
    while( 1 )
    {
      MiFindProcessImageHotPatchRecord();
      LODWORD(a4) = v10;
      v11 = v10;
      if( v10 >= 0 )
      {
        v12 = v25;
      }
      else
      {
        if( v10 != -1073741275 )
          goto LABEL_26;
        if( v7 || !MiGetProcessHotPatchContext((INT64)v6, 0i64) )
        {
          v11 = 1075380276;
LABEL_25:
          v9 = 0;
          goto LABEL_26;
        }
        v12 = 0;
        LODWORD(v25) = 0;
      }
      if( !ProcessHotPatchContext )
      {
        ProcessHotPatchContext = MiGetProcessHotPatchContext((INT64)v6, 1i64);
        if( !ProcessHotPatchContext )
        {
          v11 = -1073741670;
          goto LABEL_26;
        }
      }
      HotPatchEntry = MiGetHotPatchEntry((UINT64)ProcessHotPatchContext, v4, v12, &a4);
      v15 = HotPatchEntry;
      if( !HotPatchEntry )
        break;
      LOBYTE(v24) = v37;
      LODWORD(v23) = a3;
      LODWORD(a7) = a2;
      HIDWORD(v25) = 1;
      v16 = MiPerformImageHotPatch(
              (INT64)ProcessHotPatchContext,
              HotPatchEntry,
              v14,
              v34,
              v4,
              &DestinationString,
              a7,
              v23,
              v24,
              &a5);
      LODWORD(a4) = v16;
      --*((_WORD *)CurrentThread + 243);
      ExAcquirePushLockExclusiveEx((UINT64)(ProcessHotPatchContext + 2), 0i64);
      LODWORD(a7a) = v16;
      MiLogHotPatchOperation(v15, (unsigned int)a2, (unsigned int)a3, v12, &a5, &DestinationString.Length, a7a);
      *(_DWORD *)(v15 + 92) &= ~1u;
      v27 = *(_DWORD *)(v15 + 92);
      if( v16 < 0 )
      {
        LOBYTE(v18) = v27;
      }
      else
      {
        v17 = *(struct _UNICODE_STRING *)(v15 + 64);
        *(_DWORD *)(v15 + 48) = a2;
        *(_DWORD *)(v15 + 52) = a3;
        *(_QWORD *)(v15 + 80) = a5;
        *(_DWORD *)(v15 + 88) = v12;
        *(struct _UNICODE_STRING *)(v15 + 64) = DestinationString;
        DestinationString = v17;
        v18 = *(_DWORD *)(v15 + 92);
        v32 = v17;
      }
      if( (_InterlockedExchangeAdd64(ProcessHotPatchContext + 2, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
        ExfTryToWakePushLock(ProcessHotPatchContext + 2);
      KeAbPostRelease(ProcessHotPatchContext + 2);
      CurrentThread = v29;
      KiLeaveGuardedRegionUnsafe((__int64)v29);
      v11 = a4;
      if( (int)a4 < 0 )
        goto LABEL_25;
      if( (v18 & 2) != 0 )
      {
        MiDeleteHotPatchEntry((PVOID)v15);
        HIDWORD(v25) = 0;
        goto LABEL_25;
      }
      v7 = 0;
      RtlFreeAnsiString(&DestinationString);
      RtlInitUnicodeString(&DestinationString, 0i64, v19);
      v6 = v30;
    }
    v11 = a4;
    if( (int)a4 >= 0 && (_DWORD)a4 != 259 )
      goto LABEL_25;
LABEL_26:
    if( HIDWORD(v25) )
    {
      MiLockVadShared((INT64)CurrentThread, v4);
      v20 = MiVadDeleted(v4);
      MiUnlockVadShared((INT64)CurrentThread, v4);
      if( v20 )
        MiDeleteImageHotPatchState(v4);
    }
    if( v9 )
      MiLogHotPatchOperationStatus(a2, a3, (__int128 *)&DestinationString, v11, 0);
    ExReleaseRundownProtection(RunRef);
  }
  RtlFreeAnsiString(&DestinationString);
}

Referenced by:

MiHotPatchProcess
MiSetImageHotPatchAllowed