Skip to content

Releases: no6969el/iracing-x3d-tuning

v3.0.0 — Quieting that survives, every X3D supported

Choose a tag to compare

@no6969el no6969el released this 24 Jul 02:29
dcc6179

Release Notes — v3.0.0

Major release. Two things need your attention before upgrading — see Breaking changes at the bottom. Everything else is a straight improvement.

Race-Quiet now actually holds

A user reported wuauserv and UsoSvc switching themselves back on about ten minutes into a session, stuttering the moment they did.

Cause. The script only stopped those services. A stopped service keeps its startup type, so the first API call restarts it — and Windows Update Medic (WaaSMedicSvc) exists specifically to detect a tampered-with update stack and repair it, on roughly that cadence.

Fix. Pre-Race-Quiet now:

  • sets the services to Disabled (Start=4) rather than stopping them
  • disables WaaSMedic\PerformRemediation, the task driving the ~10-minute revert
  • clears each service's recovery actions, so a force-stop can't trigger an auto-restart, and restores them byte-for-byte afterwards
  • adds WaaSMedicSvc, bits and DoSvc, plus three more UpdateOrchestrator tasks
  • retries anything TrustedInstaller-owned through a temporary SYSTEM task
  • snapshots your real prior state to C:\ProgramData\RaceQuiet\state.json so the restore replays exactly that — anything you had already turned off stays off

New switches: -Verify (wait, then report anything that crept back), -KeepSearch (leave Start Menu search working), -SkipDefender, -Deadman (auto-restore at next boot if you forget), -Force.

Check-Quiet-Status now reports startup type, not just running state — a service that is stopped but still Manual is precisely the condition that let it return, and the old checker called that "quiet".

⚠️ Because this survives a reboot, Post-Race-Restore.ps1 is now required. Until it runs, the PC has no Windows Update and no fresh Defender definitions.


Also fixed

Every dashboard page now opens at the right size. Some pages needed scrolling to see all the buttons. The window now measures each page and resizes to fit, scrolling only if a page genuinely exceeds your screen — and it refits when you expand a section.

The Process Lasso step was missing "Always". Both the guide and the dashboard said CPU Sets → tick your cores, leaving out the Always submenu that makes it persist. Without it the pin was silently lost when the sim closed. If you set this up before, it is worth redoing — you may have been racing without it.

Single-CCD owners were told to change power plan. The dashboard said to set Bitsum Highest Performance; everything else correctly says keep Balanced. Fixed.

The web guide now offers all five chip classes (including 9950X3D2 and the 6-core parts), and a stale instruction about editing a file that no longer exists has been removed.

Faster startup

Cache validation was making a WMI call on every launch — a regression in v2.2.0, where the previous code just read a JSON file. That is gone, three duplicate CPU queries are now one, and the XAML is parsed once instead of twice. The app should open noticeably quicker than v2.2.0.

Breaking changes

1. Post-Race-Restore.ps1 is now required. Quieting disables services rather than stopping them, so nothing self-heals on reboot. Skip the restore and the PC has no Windows Update and no fresh Defender definitions until you run it.

2. Do not mix files across versions. Six scripts share scripts\X3D-Profiles.ps1. Replace the whole folder — a partial upgrade produces wrong core numbers silently.


If you are coming from v2.1.0 or earlier — full AMD X3D lineup support

(this shipped in v2.2.0)

Full AMD X3D lineup support

This release rewrites how the kit identifies your processor. Previously it recognised three chip layouts and guessed at anything else. It now knows every X3D processor AMD has shipped, detects real CCD boundaries from your CPU's cache topology, and validates every core number against the processors Windows actually reports.

If you have a 12- or 16-core X3D, nothing about your setup changes — the core numbers you were given before were correct, and they're the same now. If you have anything else, this release is the one that makes the kit work properly for you.


Newly supported processors

6-core X3D — previously unsupported entirely

Chip Cores / Threads Layout
Ryzen 5 5500X3D 6C / 12T single CCD
Ryzen 5 5600X3D 6C / 12T single CCD
Ryzen 5 7500X3D 6C / 12T single CCD
Ryzen 5 7600X3D 6C / 12T single CCD

Complete supported list (17 chips)

  • 6-core single-CCD — 5500X3D, 5600X3D, 7500X3D, 7600X3D
  • 8-core single-CCD — 5700X3D, 5800X3D, 7700X3D, 7800X3D, 9800X3D, 9850X3D
  • 12-core dual-CCD — 7900X3D, 9900X3D
  • 16-core dual-CCD — 7950X3D, 9950X3D
  • 16-core dual-CCD, both cached — 9950X3D2 Dual Edition
  • Mobile — 7945HX3D, 9955HX3D

Non-X3D processors are now supported too. The general fixes (Defender exclusions, timer resolution, Game Bar / USB suspend, pre-race quieting, tracing, stutter scanning) all run. Core pinning and interrupt steering are skipped automatically rather than guessed at.


The 9950X3D2 needs different advice

This chip has V-Cache on both CCDs, so the usual "pin the sim to the good CCD" framing doesn't apply — there is no good and bad CCD, and no preferred die for the Windows scheduler to target.

Pinning still helps, but for a different reason: keeping the sim on one CCD avoids the latency cost of reaching across to the other die's cache. The kit now gives you the same CPU-Set (0–15) but explains it correctly instead of telling you to avoid a "slow" CCD that doesn't exist.

Note that a 9950X3D2 reports 16 cores exactly like a 9950X3D, so core-count detection alone cannot tell them apart. The new detection identifies it by name and by cache size.


Bug fixes

Invalid interrupt targets on 6-core chips. The old code assumed any chip that wasn't 12 or 16 cores had 8 cores, and steered GPU interrupts to CPU 8 with NIC and USB interrupts to CPUs 9, 10 and 11. On a 6-core chip with SMT enabled those processors happen to exist, so it appeared to work while pointing at arbitrary cores. With SMT disabled, or with cores limited in msconfig, those processors do not exist — and the kit wrote interrupt affinity masks targeting nothing. Core targets are now derived from your actual topology and validated before anything is written; if a target isn't a real processor the script refuses and explains why instead of writing a bad mask.

Two components disagreed about your CPU. Preflight-Check and the Tuning Menu used different fallback calculations. On a 6-core chip the menu chose CPU 8 while Preflight expected CPU 6, so Preflight reported a GPU-IRQ mismatch that wasn't real. All components now read from one shared source.

Wrong V-Cache range reported on single-CCD chips. Preflight described an 8-core single-CCD chip's V-Cache cores as 0-7 when all 16 logical processors share it.

SMT-disabled systems mis-numbered. The dashboard calculated your highest core number as cores × 2 - 1, which is wrong whenever SMT is off.

Core count could be under-reported. Detection used [Environment]::ProcessorCount, which can be skewed by process affinity. It now reads the true count from WMI.

FullTrace could stop logging. If a CPU was missing from Windows' performance counter set, the per-core lookup threw and the row was lost. Missing counters are now skipped rather than fatal.

Contradictory advice on non-X3D chips. The Optimize page said to skip the Process Lasso step, then a dialog asked whether you'd completed it. On a non-X3D chip that dialog no longer appears, and the "steps by hand" heading is hidden. Single-CCD chips now correctly say one step (the power plan) rather than two.


Changes you'll notice

New "CPU profile" page in the dashboard, replacing the old Reset system button. It shows the chip that was detected, how it was identified, and the core numbers in use. If detection gets it wrong you can pick your chip class by hand — six options covering every supported layout, plus a re-detect.

Saved profiles are re-detected automatically. The stored format changed, so your first launch after upgrading re-identifies your CPU. Profiles are also discarded if your logical processor count no longer matches, so swapping CPUs can't leave stale core numbers behind. Nothing to clear by hand.

Interrupt steering is hidden when it doesn't apply. On a non-X3D CPU, or when topology can't be determined confidently, the GPU-IRQ fix is dropped from the automatic run and its Advanced button is disabled with...

Read more

v3.1.0 — Windows Update Medic, caught and disabled

Choose a tag to compare

@no6969el no6969el released this 24 Jul 13:57
20e7c73

Confirmed fixed on the machine that reported it.

v3.0.0 disabled the Windows Update services instead of just stopping them, which holds on most machines. On some it didn't — everything switched back on about ten minutes into a session, exactly as before. This release adds the tooling to find out why on a given machine, and a way through when the answer is Windows Update Medic.

Find out what's undoing it

scripts/Trace-QuietReverts.ps1 — read-only forensics. -Verify told you that something reverted; this tells you who.

It reads the Windows event logs that record a service being re-enabled — including Service Control Manager event 7040, the definitive record — plus the WaaSMedic and Task Scheduler logs, and lays them out as a timeline against what the kit did. It ends with a verdict pointing at one of four causes.

Run it elevated. The WaaSMedic tasks are invisible to a normal user and will look absent when they aren't.

Force it when the answer is Medic

On some builds WaaSMedicSvc's registry key is owned by TrustedInstaller and refuses to be disabled even as SYSTEM. Windows Update Medic then keeps repairing the update stack mid-race.

Pre-Race-Quiet.ps1 -UnlockMedic takes ownership of that one key, disables the service, verifies the write actually took, and hands ownership straight back in the same run. The original security descriptor is captured before anything changes and saved in two places. Post-Race-Restore verifies the permissions and owner are back, and refuses to delete the snapshot while any key remains unrestored.

There's also an optional scripts-medic-unlock/ pair with that behaviour on by default, for handing to someone who's already confirmed it's their problem.

Only use it if you've confirmed you need it. Run Trace-QuietReverts first. If it points at Group Policy or an MDM profile instead, the unlock won't help — a managed machine re-applies those settings regardless.

Upgrading from v2.x

Two things need your attention:

  1. Post-Race-Restore.ps1 is required, not optional. Quieting disables services rather than stopping them, so nothing self-heals on reboot. Skip the restore and the PC has no Windows Update and no fresh Defender definitions until you run it.
  2. Don't mix files across versions. Six scripts share scripts/X3D-Profiles.ps1 — replace the whole folder. A partial upgrade produces wrong core numbers silently.

Coming from v2.1.0 or earlier, this also brings full support for every X3D AMD has shipped — 6-core through 16-core, the dual-cached 9950X3D2, the mobile HX3D parts, and non-X3D CPUs for the general fixes. See RELEASE-NOTES.md for that detail.


Guide: https://no6969el.github.io/iracing-x3d-tuning/
Requires Windows PowerShell 5.1 (built into Windows 10/11). PowerShell 7 is not needed.

Full-X3D-iRacing-PC-Optimizer.v2.2.0

Choose a tag to compare

@no6969el no6969el released this 23 Jul 13:16
3ce29cb

Release Notes — v2.2.0

Full AMD X3D lineup support

This release rewrites how the kit identifies your processor. Previously it recognised three chip layouts and guessed at anything else. It now knows every X3D processor AMD has shipped, detects real CCD boundaries from your CPU's cache topology, and validates every core number against the processors Windows actually reports.

If you have a 12- or 16-core X3D, nothing about your setup changes — the core numbers you were given before were correct, and they're the same now. If you have anything else, this release is the one that makes the kit work properly for you.


Newly supported processors

6-core X3D — previously unsupported entirely

Chip Cores / Threads Layout
Ryzen 5 5500X3D 6C / 12T single CCD
Ryzen 5 5600X3D 6C / 12T single CCD
Ryzen 5 7500X3D 6C / 12T single CCD
Ryzen 5 7600X3D 6C / 12T single CCD

Complete supported list (17 chips)

  • 6-core single-CCD — 5500X3D, 5600X3D, 7500X3D, 7600X3D
  • 8-core single-CCD — 5700X3D, 5800X3D, 7700X3D, 7800X3D, 9800X3D, 9850X3D
  • 12-core dual-CCD — 7900X3D, 9900X3D
  • 16-core dual-CCD — 7950X3D, 9950X3D
  • 16-core dual-CCD, both cached — 9950X3D2 Dual Edition
  • Mobile — 7945HX3D, 9955HX3D

Non-X3D processors are now supported too. The general fixes (Defender exclusions, timer resolution, Game Bar / USB suspend, pre-race quieting, tracing, stutter scanning) all run. Core pinning and interrupt steering are skipped automatically rather than guessed at.


The 9950X3D2 needs different advice

This chip has V-Cache on both CCDs, so the usual "pin the sim to the good CCD" framing doesn't apply — there is no good and bad CCD, and no preferred die for the Windows scheduler to target.

Pinning still helps, but for a different reason: keeping the sim on one CCD avoids the latency cost of reaching across to the other die's cache. The kit now gives you the same CPU-Set (0–15) but explains it correctly instead of telling you to avoid a "slow" CCD that doesn't exist.

Note that a 9950X3D2 reports 16 cores exactly like a 9950X3D, so core-count detection alone cannot tell them apart. The new detection identifies it by name and by cache size.


Bug fixes

Invalid interrupt targets on 6-core chips. The old code assumed any chip that wasn't 12 or 16 cores had 8 cores, and steered GPU interrupts to CPU 8 with NIC and USB interrupts to CPUs 9, 10 and 11. On a 6-core chip with SMT enabled those processors happen to exist, so it appeared to work while pointing at arbitrary cores. With SMT disabled, or with cores limited in msconfig, those processors do not exist — and the kit wrote interrupt affinity masks targeting nothing. Core targets are now derived from your actual topology and validated before anything is written; if a target isn't a real processor the script refuses and explains why instead of writing a bad mask.

Two components disagreed about your CPU. Preflight-Check and the Tuning Menu used different fallback calculations. On a 6-core chip the menu chose CPU 8 while Preflight expected CPU 6, so Preflight reported a GPU-IRQ mismatch that wasn't real. All components now read from one shared source.

Wrong V-Cache range reported on single-CCD chips. Preflight described an 8-core single-CCD chip's V-Cache cores as 0-7 when all 16 logical processors share it.

SMT-disabled systems mis-numbered. The dashboard calculated your highest core number as cores × 2 - 1, which is wrong whenever SMT is off.

Core count could be under-reported. Detection used [Environment]::ProcessorCount, which can be skewed by process affinity. It now reads the true count from WMI.

FullTrace could stop logging. If a CPU was missing from Windows' performance counter set, the per-core lookup threw and the row was lost. Missing counters are now skipped rather than fatal.

Contradictory advice on non-X3D chips. The Optimize page said to skip the Process Lasso step, then a dialog asked whether you'd completed it. On a non-X3D chip that dialog no longer appears, and the "steps by hand" heading is hidden. Single-CCD chips now correctly say one step (the power plan) rather than two.


Changes you'll notice

New "CPU profile" page in the dashboard, replacing the old Reset system button. It shows the chip that was detected, how it was identified, and the core numbers in use. If detection gets it wrong you can pick your chip class by hand — six options covering every supported layout, plus a re-detect.

Saved profiles are re-detected automatically. The stored format changed, so your first launch after upgrading re-identifies your CPU. Profiles are also discarded if your logical processor count no longer matches, so swapping CPUs can't leave stale core numbers behind. Nothing to clear by hand.

Interrupt steering is hidden when it doesn't apply. On a non-X3D CPU, or when topology can't be determined confidently, the GPU-IRQ fix is dropped from the automatic run and its Advanced button is disabled with an explanation.

Mobile chips warn about OEM power management. Laptop firmware can override power plans and interrupt settings, and vendor control apps may revert them. The kit says so up front and points at the Undo scripts.


Under the hood

All CPU logic now lives in scripts\X3D-Profiles.ps1. Six scripts previously carried their own copy of the detection fallback, and those copies had drifted apart.

Detection resolves in four layers, most reliable first:

  1. CPU name matched against the catalog of all 17 chips
  2. L3 cache topology via GetLogicalProcessorInformationEx — finds real CCD boundaries and identifies which CCDs carry V-Cache by cache size, so chips that don't exist yet still resolve correctly
  3. Total L3 size — a cheap X3D / non-X3D discriminator
  4. Core count — last-resort estimate, which marks topology as untrusted and disables the topology-specific fixes

The cache probe is defensive: if it returns anything failing its sanity checks (overlapping cache pools, asymmetric CCDs, coverage that doesn't match the reported CPU count) it reports "unknown" and the name catalog takes over rather than acting on bad data. Preflight-Check prints which layer answered.

Requires Windows PowerShell 5.1, built into Windows 10 and 11. PowerShell 7 is not needed for any part of the kit.


Upgrading

Replace the whole folder. Don't copy individual files across.

  1. Rename your existing kit folder (keep it until the new one is confirmed working)
  2. Extract this release in its place
  3. Run Start-Tuning-Menu.bat

Six scripts now share scripts\X3D-Profiles.ps1. Mixing an old copy of one script with new ones produces inconsistent core numbers, which is exactly the failure this release exists to eliminate.

Your first launch re-detects your CPU. Check the header shows the right chip; if not, use CPU profile to set it by hand.


For testers

You can make the entire kit behave as any supported chip without owning one:

$env:X3D_FORCE_PROFILE = '5600X3D'
.\Start-Tuning-Menu.bat

Everything that writes to the registry switches to dry-run and changes nothing. Close the window to return to normal detection.

tests\test-integration.ps1 sweeps all 17 chips and asserts that every interrupt target, CPU-Set range and trace split is valid and in range:

powershell -ExecutionPolicy Bypass -File .\tests\test-integration.ps1

The tests\ folder is development-only and safe to delete.


Unchanged

FullTrace CSV column names are the same (ccd0_cpu, ccd1_cpu, freqcore_int, freqcore_dpc) so existing traces and any spreadsheets you've built still work. On a single-CCD chip those two columns represent the low and high halves of your cores rather than separate dies; the console output labels this correctly while logging.

iRacing X3D Tuner v2.1.0

Choose a tag to compare

@no6969el no6969el released this 23 Jul 02:22
2a8bd71

v2.1.0 — Race-Quiet That Stays Quiet

This release fixes a real bug in the per-session quieting: Windows Update was
turning itself back on about ten minutes into a session, so the background scans
that cause micro-stalls came back mid-race. Pre-Race-Quiet now shuts them down in
a way Windows can't undo on its own.

What's new

The quieting actually holds now. Previous versions only stopped the update
services. Windows has a built-in repair service — the Update Medic — whose entire
job is to notice that and start them again, which it did within about ten minutes.
This release disables the services outright and shuts down the Medic's repair task,
so nothing brings them back mid-session.

It survives a reboot — so the restore step is now required. This is the one
behavior change to be aware of. Quieting used to undo itself when you restarted;
it no longer does. Until you run Post-Race-Restore, Windows Update stays off, and
because Defender's virus definitions arrive through the same services, they'll go
stale too. Race, then restore. Don't leave a rig quieted for days.

Everything is put back exactly as it was. Pre-Race-Quiet now saves a snapshot
of your real settings before touching anything — how each service was configured,
which tasks were already off, whether Defender real-time was already disabled — and
Post-Race-Restore replays that snapshot. If Defender was already off before you
raced, it stays off. Nothing gets "restored" to a setting you never had.

No extra clicks. Both scripts now elevate themselves and automatically run the
part that needs higher privileges, so the tasks Windows normally protects can be
switched off. You just get the usual admin prompt.

A way to prove it worked. Run Pre-Race-Quiet with -Verify and it waits a few
minutes, re-checks everything, and tells you whether anything crept back on. Useful
on a new PC, or any time you want confirmation rather than hope.

Also quieted: the update transfer services (BITS and Delivery Optimization), on
top of Windows Update, Search, Edge updates and the rest from before. If you'd
rather leave those alone, they're in a clearly labelled list at the top of the
script.

Changelog

  • Update services are now disabled, not just stopped — fixes the ~10-minute revert
  • Disables the Update Medic repair task that was undoing the change
  • Both scripts run the protected steps automatically (no extra prompts)
  • Snapshot-based restore: every service, task and Defender setting returns to its
    exact prior state
  • Added -Verify to re-check a few minutes later that nothing reverted
  • Added BITS and Delivery Optimization to the quieted services
  • Added a Windows Update pause as a safety net if a restore is missed
  • Saved state and log moved to C:\ProgramData\RaceQuiet\ so they're always writable
  • Running Pre-Race-Quiet twice without restoring is now blocked, so the original
    settings can't be overwritten
  • Post-Race-Restore falls back to safe defaults, with a warning, if no snapshot exists
  • README updated for the new reboot behavior

Upgrading from v2.0.0

Replace Pre-Race-Quiet.ps1 and Post-Race-Restore.ps1 (and README.txt) with the
versions in this release. If a v2.0.0 session is still quieted, run the old
Post-Race-Restore first, or just run the new one — it restores sane defaults when it
finds no snapshot.

Requirements

  • Windows 10/11 with PowerShell 5.1+
  • Process Lasso (free, bitsum.com) for the power-plan / core-pinning steps
  • Some tools must be run as Administrator (marked in the app)
  • Tamper Protection must be off for the optional Defender real-time step
  • Run Post-Race-Restore after every session — quieting no longer expires on reboot

Verified

Tested on a dual-CCD X3D rig: the Medic repair task confirmed disabled, and the
update services stayed down for 30+ minutes against a previous ~10-minute failure,
with the built-in "Am I race-ready?" check still reporting green.

iRacing X3D Tuner v2.0

Choose a tag to compare

@no6969el no6969el released this 20 Jul 22:04
9e9bccd

v2.0.0 — GUI Dashboard

This release replaces the old text-based PowerShell menu with a full graphical
dashboard. Everything now lives in a clean, dark-themed window that detects your
hardware and walks you through each fix — no more reading console prompts.

What's new

A real GUI. The whole tool is now a modern WPF dashboard instead of a console
menu. It auto-detects your CPU and GPU on first launch and picks the right tuning
profile (single- vs dual-CCD), so the steps match your chip.

Collapsible tool menus. The Advanced Tools and Troubleshoot a Stutter pages
now use expandable dropdowns — each item shows just its name, and clicking it
reveals a plain-English description and a Run button. Admin actions are marked in
orange, undo actions in red.

Smarter window sizing. The window resizes to fit each page, so buttons are
never clipped. The scrollbar only appears when the window is too tall for your
screen — on normal displays everything shows at once.

Guided Optimize. The Optimize page lays out the manual Process Lasso steps
first, then runs all the automatic fixes in a single elevated window that closes
itself when done.

More built-in help. Added a Help page explaining what each step does,
per-button tooltips, an "Am I race-ready?" status check, and a Reset button to
re-detect your hardware.

Cleaner launch. The console window is now hidden for an app-like feel, with a
safe error dialog if anything fails to load.

Changelog

  • New WPF GUI dashboard (replaces the console menu)
  • Automatic CPU/GPU detection and profile selection
  • Collapsible dropdowns on the Advanced Tools and Troubleshoot pages
  • Window auto-sizes to content; scrollbar only on small screens
  • Guided Optimize flow with manual + automatic steps
  • Added Help page and per-button tooltips
  • Added "Am I race-ready?" status check and Reset / re-detect
  • Hidden console window and safe startup error dialog
  • One-click Web Guide link

Requirements

  • Windows 10/11 with PowerShell 5.1+
  • Process Lasso (free, bitsum.com) for the power-plan / core-pinning steps
  • Some tools must be run as Administrator (marked in the app)