MiHotPatchImage

VOID __stdcall MiHotPatchImage(INT64 a1, INT64 a2, WCHAR a3, INT64 r9_0){
  unsigned int v4; 
  UINT64 v5; 
  _ETHREAD *CurrentThread; 
  _EPROCESS *Process; 
  int v8; 
  _QWORD *ProcessHotPatchContext; 
  int v10; 
  NTSTATUS ProcessImageHotPatchRecord; 
  unsigned int v12; 
  unsigned int v13; 
  INT64 v14; 
  __int64 v15; 
  INT64 v16; 
  int v17; 
  _UNICODE_STRING v18; 
  int v19; 
  NTSTATUS v20; 
  INT64 v21; 
  INT64 v22; 
  INT64 v23; 
  __int64 v24; 
  __int64 v25; 
  INT64 v26; 
  _UNICODE_STRING DestinationString; 
  int v28; 
  INT64 v29; 
  _ETHREAD *v30; 
  _EPROCESS *v31; 
  _EX_RUNDOWN_REF *RunRef; 
  _UNICODE_STRING v33; 
  INT64 a4; 
  INT64 v35; 
  INT64 v36; 
  INT64 v37; 
  char v38; 
  int v39; 

  LODWORD(v36) = r9_0;
  v35 = a2;
  a4 = a1;
  v26 = 0i64;
  v29 = 0i64;
  v4 = r9_0;
  DestinationString = 0i64;
  v5 = a3;
  RtlInitUnicodeString(&DestinationString, 0i64);
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v30 = CurrentThread;
  Process = CurrentThread->Tcb.ApcState.Process;
  v31 = Process;
  RunRef = &Process->RundownProtect;
  if( ExAcquireRundownProtection(&Process->RundownProtect) )
  {
    v8 = v39;
    ProcessHotPatchContext = 0i64;
    v10 = 1;
    while( 1 )
    {
      ProcessImageHotPatchRecord = MiFindProcessImageHotPatchRecord(
                                     Process,
                                     v4,
                                     (unsigned int)v37,
                                     &DestinationString,
                                     (INT64)&v26);
      LODWORD(a4) = ProcessImageHotPatchRecord;
      v12 = ProcessImageHotPatchRecord;
      if( ProcessImageHotPatchRecord >= 0 )
      {
        v13 = v26;
      }
      else
      {
        if( ProcessImageHotPatchRecord != -1073741275 )
          goto LABEL_26;
        if( v8 || !MiGetProcessHotPatchContext((__int64)Process, 0) )
        {
          v12 = 1075380276;
LABEL_25:
          v10 = 0;
          goto LABEL_26;
        }
        v13 = 0;
        LODWORD(v26) = 0;
      }
      if( !ProcessHotPatchContext )
      {
        ProcessHotPatchContext = MiGetProcessHotPatchContext((__int64)Process, 1);
        if( !ProcessHotPatchContext )
        {
          v12 = -1073741670;
          goto LABEL_26;
        }
      }
      LODWORD(v14) = MiGetHotPatchEntry((_RTL_RB_TREE *)ProcessHotPatchContext, v5, v13, &a4);
      v16 = v14;
      if( !v14 )
        break;
      LOBYTE(v25) = v38;
      LODWORD(v24) = v37;
      LODWORD(v22) = v36;
      HIDWORD(v26) = 1;
      v17 = MiPerformImageHotPatch(
              (INT64)ProcessHotPatchContext,
              v14,
              v15,
              v35,
              v5,
              &DestinationString,
              v22,
              v24,
              v25,
              &v29);
      LODWORD(a4) = v17;
      --CurrentThread->Tcb.SpecialApcDisable;
      ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)ProcessHotPatchContext + 2, 0i64);
      LODWORD(v23) = v17;
      MiLogHotPatchOperation(v16, (unsigned int)v36, (unsigned int)v37, v13, &v29, &DestinationString.Length, v23);
      *(_DWORD *)(v16 + 92) &= ~1u;
      v28 = *(_DWORD *)(v16 + 92);
      if( v17 < 0 )
      {
        LOBYTE(v19) = v28;
      }
      else
      {
        v18 = *(_UNICODE_STRING *)(v16 + 64);
        *(_DWORD *)(v16 + 48) = v36;
        *(_DWORD *)(v16 + 52) = v37;
        *(_QWORD *)(v16 + 80) = v29;
        *(_DWORD *)(v16 + 88) = v13;
        *(_UNICODE_STRING *)(v16 + 64) = DestinationString;
        DestinationString = v18;
        v19 = *(_DWORD *)(v16 + 92);
        v33 = v18;
      }
      if( (_InterlockedExchangeAdd64(ProcessHotPatchContext + 2, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
        ExfTryToWakePushLock((_EX_PUSH_LOCK *)ProcessHotPatchContext + 2);
      KeAbPostRelease(ProcessHotPatchContext + 2);
      CurrentThread = v30;
      KiLeaveGuardedRegionUnsafe((__int64)v30);
      v12 = a4;
      if( (int)a4 < 0 )
        goto LABEL_25;
      if( (v19 & 2) != 0 )
      {
        MiDeleteHotPatchEntry((PVOID)v16);
        HIDWORD(v26) = 0;
        goto LABEL_25;
      }
      v8 = 0;
      RtlFreeAnsiString(&DestinationString);
      RtlInitUnicodeString(&DestinationString, 0i64);
      Process = v31;
      v4 = v36;
    }
    v12 = a4;
    if( (int)a4 >= 0 && (_DWORD)a4 != 259 )
      goto LABEL_25;
LABEL_26:
    if( HIDWORD(v26) )
    {
      MiLockVadShared((INT64)CurrentThread, v5);
      v20 = MiVadDeleted((_MMVAD_SHORT *)v5);
      MiUnlockVadShared(&CurrentThread->Tcb, (_EX_PUSH_LOCK *)v5);
      if( v20 )
        MiDeleteImageHotPatchState(v5);
    }
    if( v10 )
    {
      LODWORD(v21) = 0;
      MiLogHotPatchOperationStatus(
        (unsigned int)v36,
        (unsigned int)v37,
        (PFN_WDFCX_DEVICE_POST_SELF_MANAGED_IO_INIT *)&DestinationString,
        v12,
        v21);
    }
    ExReleaseRundownProtection(RunRef);
  }
  RtlFreeAnsiString(&DestinationString);
}

Referenced by:

MiHotPatchProcess
MiSetImageHotPatchAllowed