MiUnloadHotPatchForUserSid

NTSTATUS __stdcall MiUnloadHotPatchForUserSid(VOID *a1, INT64 *a2){
  _ETHREAD *CurrentThread; 
  INT64 *v3; 
  _RTL_BALANCED_NODE *UserSidHotPatchContext; 
  INT64 *v7; 

  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v3 = 0i64;
  --CurrentThread->Tcb.SpecialApcDisable;
  ExAcquirePushLockExclusiveEx(&MiHotPatchListLock, 0i64);
  UserSidHotPatchContext = MiFindUserSidHotPatchContext((UINT8 *)a1);
  v7 = (INT64 *)UserSidHotPatchContext;
  if( UserSidHotPatchContext )
  {
    MiDeleteHotPatchRecord(UserSidHotPatchContext[1].Children, 1u, *(unsigned int *)a2, *((unsigned int *)a2 + 1));
    if( !v7[3] )
    {
      RtlAvlRemoveNode((UINT64 *)&MiUserSidPatchLists, v7);
      v3 = v7;
    }
  }
  if( (_InterlockedExchangeAdd64(&MiHotPatchListLock._bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
    ExfTryToWakePushLock(&MiHotPatchListLock);
  KeAbPostRelease(&MiHotPatchListLock);
  KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
  if( v3 )
    ExFreePoolWithTag(v3, 0);
  MiHotPatchAllProcesses(*(unsigned int *)a2, *((unsigned int *)a2 + 1));
  return 0;
}

Referenced by:

NtManageHotPatch