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