MiLoadHotPatch

NTSTATUS __stdcall MiLoadHotPatch(PCUNICODE_STRING SourceString){
  int v1; 
  int *v2; 
  unsigned int *v3; 
  int v4; 
  int *v5; 
  __int64 v7; 
  _RTL_BALANCED_NODE *HotPatchRecord; 
  int v10; 
  INT8 v11; 
  INT64 v12; 
  unsigned int v13; 
  int v14; 
  unsigned int *v15; 
  int v16; 
  unsigned int v17; 
  int v18; 
  char v19; 
  _CONTROL_AREA *v20; 
  INT64 v21; 
  _FILE_OBJECT *v22; 
  __int64 v23; 
  __int64 v24; 
  NTSTATUS v25; 
  int v26; 
  NTSTATUS v27; 
  INT64 v28; 
  INT64 v29; 
  PVOID *Object; 
  INT64 v31; 
  int v32; 
  PVOID v33; 
  _ETHREAD *CurrentThread; 
  _SECTION *Section; 
  _HANDLE Handle[2]; 
  __int128 v37; 
  int v38; 
  UINT64 a4; 
  PADAPTER_OBJECT DmaAdapter; 
  __int64 v41; 
  int *v42; 
  unsigned int *v43; 

  v43 = v3;
  v42 = v2;
  v4 = v1;
  v41 = 0i64;
  v5 = v2;
  v32 = 0;
  a4 = 0i64;
  v7 = 0i64;
  v38 = 0;
  v37 = 0i64;
  if( !dword_140C4C9F0 )
    return -1073741811;
  CurrentThread = 0i64;
  HotPatchRecord = 0i64;
  Section = 0i64;
  DmaAdapter = 0i64;
  *(_QWORD *)Handle = 0i64;
  v31 = 0i64;
  LODWORD(v33) = 1;
  v10 = MiOpenHotPatchFile((_UNICODE_STRING *)SourceString, 1, 0, (VOID **)Handle, &Section, 0i64, &v31, 0i64);
  v13 = v31;
  v14 = v10;
  if( v10 < 0 )
    goto LABEL_32;
  v15 = v43;
  v16 = HIDWORD(v31);
  *v5 = v31;
  *v43 = v16;
  if( v4 )
  {
    HotPatchRecord = (_RTL_BALANCED_NODE *)MiAllocateHotPatchRecord(*v5, v16, (const VOID **)SourceString);
    if( !HotPatchRecord )
    {
      v17 = HIDWORD(v31);
      v14 = -1073741670;
LABEL_34:
      LODWORD(Object) = 1;
      MiLogHotPatchOperationStatus(
        v13,
        v17,
        (PFN_WDFCX_DEVICE_POST_SELF_MANAGED_IO_INIT *)SourceString,
        (unsigned int)v14,
        (INT64)Object);
      v24 = 0i64;
      goto LABEL_35;
    }
  }
  CurrentThread = MmAcquireLoadLock(v12, v11);
  if( HotPatchRecord )
    MiInsertHotPatchRecord((_RTL_BALANCED_NODE **)&MiGlobalHotPatchList, HotPatchRecord, 0i64);
  v18 = 1073741879;
  if( (MiFlags & 0x8000) == 0 )
  {
    v17 = HIDWORD(v31);
    goto LABEL_30;
  }
  v14 = VslDetermineHotPatchType(*v5, *v43, &v32);
  if( v14 < 0 )
    goto LABEL_32;
  v19 = v32;
  if( (v32 & 1) != 0 )
  {
    v33 = 0i64;
    v14 = ObReferenceObjectByHandle(*(VOID **)Handle, 1ui64, (_OBJECT_TYPE *)IoFileObjectType, 0, &v33, 0i64);
    DmaAdapter = (PADAPTER_OBJECT)v33;
    if( v14 >= 0 )
    {
      v20 = MiSectionControlArea(Section);
      v14 = MiPromoteControlAreaToStrongCode(v20, v22, v21, &a4);
      if( v14 >= 0 )
      {
        v7 = a4;
        goto LABEL_15;
      }
    }
LABEL_32:
    v17 = HIDWORD(v31);
    goto LABEL_33;
  }
LABEL_15:
  LODWORD(v33) = 0;
  if( (v19 & 2) != 0 )
  {
    LODWORD(v23) = MiAllocateSecureImageActivePatch(SourceString);
    v24 = v23;
    if( v23 )
    {
      v25 = VslApplyHotPatch(v7, (__int64)Section, 0i64, 0i64, 0i64, 0i64, (__int64)&v37);
      v26 = v38;
      v14 = v25;
    }
    else
    {
      v26 = v41;
      v14 = -1073741670;
    }
    v17 = HIDWORD(v31);
    LODWORD(Object) = 2;
    MiLogHotPatchOperationStatus(
      v13,
      HIDWORD(v31),
      (PFN_WDFCX_DEVICE_POST_SELF_MANAGED_IO_INIT *)SourceString,
      (unsigned int)v14,
      (INT64)Object);
    if( v14 < 0 )
    {
LABEL_35:
      if( CurrentThread )
        MmReleaseLoadLock(CurrentThread);
      goto LABEL_37;
    }
    *(_OWORD *)(v24 + 24) = v37;
    *(_DWORD *)(v24 + 40) = v26;
    MiInsertSecureImageActivePatch((_RTL_BALANCED_NODE *)v24);
    v18 = v14;
  }
  else
  {
    v17 = HIDWORD(v31);
  }
  v15 = v43;
  v5 = v42;
  v27 = MiApplyHotPatchToDriver((unsigned int)*v42, *v43, (_UNICODE_STRING *)SourceString, *(INT64 *)Handle);
  if( v27 == -1073741515 )
  {
    v27 = 1073741879;
  }
  else if( v27 < 0 )
  {
    v18 = v27;
  }
  if( v18 == 1073741879 )
    v18 = v27;
LABEL_30:
  MmReleaseLoadLock(CurrentThread);
  v28 = *v15;
  v29 = (unsigned int)*v5;
  CurrentThread = 0i64;
  MiHotPatchAllProcesses(v29, v28);
  v14 = v18;
  v24 = 0i64;
  if( (_DWORD)v33 )
  {
LABEL_33:
    v24 = 0i64;
    if( v14 == 1073741879 )
      goto LABEL_35;
    goto LABEL_34;
  }
LABEL_37:
  if( Section )
    HalPutDmaAdapter((PADAPTER_OBJECT)Section);
  if( DmaAdapter )
    HalPutDmaAdapter(DmaAdapter);
  if( *(_QWORD *)Handle )
    ObCloseHandle(*(VOID **)Handle, 0);
  if( v24 )
    ExFreePoolWithTag((PVOID)v24, 0);
  return v14;
}

Referenced by:

MiApplyRequiredDriverHotPatches
MmRegisterHotPatch
NtManageHotPatch