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