MiUnloadHotPatch
NTSTATUS __stdcall MiUnloadHotPatch(UINT64 a1, INT64 a2){
unsigned int v2;
unsigned int v3;
INT64 *v4;
INT8 v5;
INT64 v6;
_ETHREAD *Lock;
NTSTATUS v8;
INT64 *v9;
NTSTATUS v10;
NTSTATUS v11;
NTSTATUS v12;
INT64 v14;
INT64 v15[8];
v2 = a2;
v3 = a1;
memset(v15, 0i64, sizeof(v15));
v4 = 0i64;
Lock = MmAcquireLoadLock(v6, v5);
v8 = 0;
MiDeleteHotPatchRecord((_RTL_BALANCED_NODE **)&MiGlobalHotPatchList, 0, v3, v2);
if( (MiFlags & 0x8000) != 0 )
{
v9 = (INT64 *)MiSecureImageActivePatches;
v15[3] = __PAIR64__(v2, v3);
if( MiSecureImageActivePatches )
{
do
{
v10 = MiCompareHotPatchNodes((INT64)v15, (INT64)v9);
if( v10 >= 0 )
{
if( v10 <= 0 )
break;
v9 = (INT64 *)v9[1];
}
else
{
v9 = (INT64 *)*v9;
}
}
while( v9 );
if( v9 )
{
LODWORD(v14) = 2;
v11 = VslRevertHotPatch(0i64, v3, v2);
MiLogHotPatchOperationStatus(v3, v2, 0i64, (unsigned int)v11, v14);
if( v11 < 0 )
{
v8 = v11;
}
else
{
RtlAvlRemoveNode((UINT64 *)&MiSecureImageActivePatches, v9);
v4 = v9;
}
}
}
v12 = MiApplyHotPatchToDriver(v3, v2, 0i64, 0i64);
if( (int)(v12 + 0x80000000) >= 0 && v12 != -1073741515 && v8 >= 0 )
v8 = v12;
}
MmReleaseLoadLock(Lock);
MiHotPatchAllProcesses(v3, v2);
if( v4 )
ExFreePoolWithTag(v4, 0);
return v8;
}Referenced by:
NtManageHotPatch