xHCI98 is a USB host controller driver (HCD) for xHCI (USB 3.x) controllers on Windows 98 SE, ME, 2000, XP (x86/x64), Vista (x86/x64) and 7 (x86/x64).
Experimental support for USB4 and Thunderbolt 3/4 is also included, on those systems and on Windows 8, 8.1 and 10 (x86/x64).
Supported:
- SuperSpeed devices and hubs:
- USB 3.2 Gen 1, 5 Gbit/s
- SuperSpeedPlus: USB 3.2 Gen 2 and Gen 1x2 (10 Gbit/s), and Gen 2x2 (20 Gbit/s)
- USB 2.0 and 1.1 (High, Full and Low Speed) devices and hubs
- UAS (USB Attached SCSI) storage via
xhciuas.sys - Thunderbolt 3 and USB4 via
xhcicm.sys
It is built to Intel's xHCI specification and tested mainly on Intel machines. Other vendors' controllers carry no guarantee, though best effort has been made for the quirks of Fresco Logic, ASMedia, AMD, TI, Etron, VIA and some Intel controllers, even ones built to the xHCI 0.96 draft standard.
This is a solo human's project with AI assistance, so bugs are not unexpected. Please report them.
Contents: Motivation - SuperSpeed and UAS - Thunderbolt 3 and USB4 - The xHCI98 USB Tree - Installation Steps (Downloads, SETUP.EXE, by hand) - Tuning - Tested on - The package - Reporting a bug - Known limitations - Building - Repository Layout - Documentation - AI usage - References - Licensing
My 2020 ThinkPad P14s Gen 1 on Windows 98 SE with a USB 3.0 hub, two UAS drives, USB Ethernet, USB Audio and a mouse. All run on the xHCI controller, the drives at SuperSpeed.
CrystalDiskMark on the same machine with sequential speed 1020 MB/s read, 891 MB/s write.
The xHCI98 USB Tree and Device Manager on Windows 98 SE, with an ASMedia USB4 NVMe enclosure on a USB4 host.
-
Video by Omores featuring this driver in its earlier USB 2.0 days:
-
My demo video: https://www.youtube.com/watch?v=AU77f9CSbYc
-
Blog post xHCI98v1: https://yeokhengmeng.com/2026/08/xhci98-usb-host-driver/
-
Blog post xHCI98v2 v3: https://yeokhengmeng.com/2026/10/xhci98-usb3-usb4/
PCs from the mid-2010s onwards have xHCI-only USB chipsets. Windows 98 shipped with USB 1.1 (UHCI/OHCI) drivers and gained USB 2.0 (EHCI) through NUSB's back-ported stack; Windows 2000 gained EHCI in SP4. Windows 7 has no USB 3 stack of its own either.
Without xHCI support, even keyboards, mice and flash drives need the BIOS's legacy support, cannot be hotplugged, and devices such as Ethernet and audio do not work at all. This project fills that gap.
The P14s Gen 1 under Windows 98 SE with NUSB: the MSSU10-128GSR flash drive at SuperSpeed through xhciuas.sys. ATTO Disk Benchmark (Direct I/O) gives about 201 to 215 MB/s write and 196 to 221 MB/s read from 512 KB transfers upward.
- A UAS-capable drive gets UAS; anything else gets Windows' own
usbstor.sys(Bulk-Only), at whatever speed it connects. A drive that offers both can be forced to Bulk-Only (XhciForceBulkOnly, see Tuning). - Device Manager and other Windows tools on these systems may show a SuperSpeed device as High Speed at most: the interface they read predates SuperSpeed.
Device Manager names USB 3 controllers by maker and product as per list below.
| Controller | PCI ids | In Device Manager |
|---|---|---|
| Intel 8 Series | 8086:8C31 |
xHCI98 USB 3 Controller (Intel 8 Series) |
| Intel 500 Series | 8086:43ED |
xHCI98 USB 3 Controller (Intel 500 Series) |
| AMD 500 Series | 1022:43EE |
xHCI98 USB 3 Controller (AMD 500 Series) |
| AMD 800 Series | 1022:43FC, 1022:43FD |
xHCI98 USB 3 Controller (AMD 800 Series) |
| Renesas uPD720202 | 1912:0015 |
xHCI98 USB 3 Controller (Renesas uPD720202) |
| ASMedia ASM1142 | 1B21:1242 |
xHCI98 USB 3 Controller (ASMedia ASM1142) |
| ASMedia ASM3242 | 1B21:3242 |
xHCI98 USB 3 Controller (ASMedia ASM3242) |
| VIA VL805/VL806 | 1106:3483 |
xHCI98 USB 3 Controller (VIA VL805/VL806) |
| Fresco Logic FL1100 | 1B73:1100 |
xHCI98 USB 3 Controller (Fresco Logic FL1100) |
| Etron EJ188/EJ198 | 1B6F:7052 |
xHCI98 USB 3 Controller (Etron EJ188/EJ198) |
xhcicm.sys brings Thunderbolt 3 and USB4 docks, enclosures and NVMe cases to these systems. Devices inside them (an NVMe drive, a dock's USB controller or network adapter) appear in Device Manager within seconds of the plug, with no Refresh, and leave on unplug. A device the BIOS connected at power-on is kept as it is.
- Intel Thunderbolt 2 and 3 controllers, and USB4-generation Intel ones while their firmware runs its own connection manager: the driver approves each device the firmware announces.
- USB4 hosts whose firmware has no connection manager (AMD, ASMedia ASM4242, Intel Lunar Lake and later, Barlow Ridge), the driver is the connection manager and builds the tunnels.
Device Manager names each controller by its generation, then its maker and product: Thunderbolt 2 and Thunderbolt 3 (TB2, TB3) controllers, and USB4 Routers (the USB4 host router).
| Controller | PCI ids (8086: unless named) |
In Device Manager |
|---|---|---|
| Falcon Ridge (Thunderbolt 2) | 156A, 156C |
xHCI98 TB2 Controller (Intel Falcon Ridge) |
| Alpine Ridge (Thunderbolt 3) | 15BF, 1575, 1577, 15D2, 15D9 |
xHCI98 TB3 Controller (Intel Alpine Ridge) |
| Titan Ridge (Thunderbolt 3) | 15E8, 15EB |
xHCI98 TB3 Controller (Intel Titan Ridge) |
| Ice Lake | 8A0D, 8A17 |
xHCI98 TB3 Controller (Intel Ice Lake) |
| Maple Ridge | 1134, 1137 |
xHCI98 USB4 Router (Intel Maple Ridge) |
| Tiger Lake, Alder Lake, Raptor Lake, Meteor Lake | 9A1B, 9A1D, 9A1F, 9A21; 463E, 466D; A73E, A76D; 7EB2, 7EC2, 7EC3 |
xHCI98 USB4 Router (Intel Tiger Lake), (Intel Alder Lake), (Intel Raptor Lake), (Intel Meteor Lake) |
| Lunar Lake, Panther Lake, Wildcat Lake | A833, A834; E333, E334, E433, E434; 4D33 |
xHCI98 USB4 Router (Intel Lunar Lake), (Intel Panther Lake), (Intel Wildcat Lake) |
| Barlow Ridge | 5781, 5784 |
xHCI98 USB4 Router (Intel Barlow Ridge) |
| AMD Pink Sardine | 1022:1668, 1022:1669 |
xHCI98 USB4 Router (AMD Pink Sardine) |
| ASMedia ASM4242 | 1B21:2425 |
xHCI98 USB4 Router (ASMedia ASM4242) |
| Any other USB4 host | PCI class 0C0340 |
xHCI98 USB4 Router |
On Vista x64 to 10 x64, keep test-signing mode on for as long as the Thunderbolt 3 / USB4 support is installed, even with nothing plugged in: without it the support does not load, and its devices and the USB controllers this package runs show Code 52 (Code 39 on Vista).
- Boot in legacy (CSM) mode, as for every system here.
- Thunderbolt BIOS Assist off. With it on, the BIOS switches the controller off when nothing is attached at power-on, and the driver cannot switch it back on (on the P14s Gen 1 the controller disappears altogether).
- Security level User Authorization or No Security. Secure Connect, DisplayPort-only and USB-only are not supported.
- Pre-boot support (boot from Thunderbolt) may be on or off. When on, a device attached at power-on keeps working under the driver.
- Above 4G Decoding. Off for 32-bit OS, on for 64-bit.
- Names: on Windows 2000 to 7 the controller's PCI ports show as "xHCI98 Thunderbolt PCI Bridge" or "xHCI98 USB4 PCI Bridge", an ASM4242's downstream ports as "xHCI98 USB4 PCI Bridge (ASMedia ASM4242)" (Windows' own bridge driver with this package's filter).
- Approval: by default (
XhciCmApprove1) every device plugged in is approved at once. A device with a PCI Express tunnel can read and write all of the machine's memory, and these systems cannot stop it. Where untrusted people can reach the port, setXhciCmApproveto0: only devices the BIOS connected at power-on then work.
Removing a device safely. Close its open files first, then:
| Windows | How |
|---|---|
| 2000 | Stop it in "Unplug or Eject Hardware", then unplug. Without the stop, Windows 2000 shows "Unsafe Removal of Device". |
| XP, Vista, 7 | Stop it in "Safely Remove Hardware", then unplug. |
| 98 SE, ME | No such dialog lists them (ME's "Unplug or Eject Hardware", and NUSB 3.3's on 98 SE, list USB storage only): use the xHCI98 USB Tree or INSTALL /console /eject. Until you unplug, Device Manager's Refresh can start the device again. |
- A dock is listed under a generic PCI bridge name; stopping it stops everything in the dock.
- A device missing from Windows' list (its first plug, or after a disable and enable or a driver update): stop it in the USB Tree run as an administrator. Otherwise close every program using it, unplug it and plug it in again; Windows lists it from then on.
- For scripts:
INSTALL /console /devicesandINSTALL /console /eject(tools\xhciinst\readme.txt).
An NVMe drive in an enclosure needs an NVMe driver. Stor98, shipped with this package, is that driver where Windows has none, or where Windows' own one handles an unplug badly. xhcicm.sys runs the tunnel; Stor98 runs the drive.
| Windows | Driver of a tunnelled NVMe drive | Why |
|---|---|---|
| 98 SE, ME, 2000, XP, Vista, 8 | Stor98 | no NVMe driver of its own |
| 7 | Stor98 | its stornvme comes only with update KB2990941, untested behind a tunnel |
| 8.1 | Stor98 (internal drives keep stornvme) |
its stornvme hangs a write for good on an unplug without Safely Remove |
| 10 | Windows' own stornvme; Stor98 is opt-in |
stornvme handles an unplug cleanly |
Use Safely Remove before unplugging a drive, on every system.
Stor98 is only for NVMe drives behind a Thunderbolt or USB4 port, not internal ones. SETUP.EXE puts it only on tunnel drives.
On 2000 to 8 ,its INF matches only the id the connection manager gives a tunnel drive, so Windows never offers it for an internal one.
On 8.1 and 10 Windows' own stornvme keeps an internal drive.
On 98 SE and ME Windows may offer it for an internal NVMe drive with no driver: decline. An internal drive that already runs Stor98 keeps it, and the uninstall leaves it there.
SETUP.EXEinstalls Stor98 with the Thunderbolt 3 / USB4 support (its box, ticked with it) and updates an earlier Stor98. By hand: Update Driver on the drive's NVMe controller -> Have Disk -> thestor98\folder of98-me\,nt-x86\ornt-x64\.- On 98 SE and ME,
S98VSD.VXDlets reads and writes of up to 2 MiB reach Stor98 whole, for much faster transfers.SETUP.EXEinstalls it with Stor98. - Stor98's settings and limits:
stor98-readme.txtbeside it, and the release notes.
Two computers joined by one Thunderbolt or USB4 cable can share a network connection, file sharing included, in the frame format Linux's Thunderbolt networking uses. It is off unless you tick "Thunderbolt networking" on the installer's Thunderbolt and USB4 page.
- Before standby or hibernation, stop and unplug every Thunderbolt or USB4 device. Standby with one attached is not supported.
- 98 SE and ME: a device plugged in after the start needs an interrupt from the BIOS (the P14s Gen 1 gives one). If it stays at Code 29, attach it at power-on with pre-boot support on. An NVMe drive on the bundled Stor98, installed or staged by
SETUP.EXE, is the exception. It can start without one with Stor98 polling it (XhciCmNoIrqStart, on by default). - 98 SE and ME: the Thunderbolt driver stays loaded until a restart, so a disable, update or removal takes effect after one.
- Settings: Tuning if you want to see what settings are available.
XHCITR.EXE (XHCITR64.EXE on 64-bit Windows) shows every USB and Thunderbolt/USB4 controller and device. It needs no administrator rights. The install starts it at login as a notification-area icon (untick Start at login in its menus to stop that); it is also in tools\xhcitr\.
- Safely Remove: left-click the icon, pick the device and unplug when told. Works for USB storage on 98 SE and ME too.
- Notices: a "can run faster" balloon for a device on a slower port or behind a slower hub, a red icon while something needs you, a warning after a Thunderbolt or USB4 device is removed unexpectedly, and a status-bar note when a driver update waits for a restart.
- Details: each item's speed, port, IDs, driver, Device Manager status, resources and PCI configuration; for a USB drive, whether it runs UAS or Bulk-Only and why; for a Thunderbolt or USB4 device, its generation and what its link runs as ("USB4 v1.0 device, running as Thunderbolt 3"). File > Save Report writes it all to a text file for a bug report.
- Driver log: each controller has a "Driver log" item, included in Save Report. View > Logging level... sets either driver's level (default 2,
0for off; takes effect after a restart). - Snapshot: Save Report ends with the driver's snapshot (its device report and decoded state). File > Save Snapshot...,
XHCITR /snapshot,/dumpand/probewrite the snapshot's files themselves if a maintainer asks for them.
Details: the release notes' USB Tree section.
Each release has three zips. Each holds everything in the one before it, so pick one:
| Download | What it holds |
|---|---|
xhci98-<version>.zip |
The xHCI98 drivers (USB 3, UAS, Thunderbolt 3 / USB4), Stor98, the installer and the tools. Also NUSB 3.3's seven Windows 98 SE storage files in USBDRV\NUSB33\, which the installer offers on 98 SE when NUSB is not installed (an installed NUSB is kept). |
xhci98-<version>-free.zip |
Adds the free USB class drivers (audio, webcam, Ethernet, printing and more) from usb-wdm-free in USBDRV\FREE\. Experimental: they may not work with every device and can make Windows unstable. It includes the CamCheck webcam preview tool in USBDRV\FREE\tools\camcheck\. |
xhci98-<version>-nonfree.zip |
Adds the makers' Ethernet, HID, serial and audio drivers (the TASCAM US-122 on 98 SE and ME) from usb-wdm-nonfree in USBDRV\NONFREE\, not this project's work. Wi-Fi drivers are not in this download. Get them from the usb-wdm-nonfree release. |
Nothing from USBDRV\ is installed unless you tick it on the installer's Free USB drivers or Non-free USB drivers page (each shown when the download carries that set).
On Windows 98 SE and ME the free and non-free drivers are copied to the install directory, and the ones ticked are also added to the hardware wizard's search path, so Windows finds them at the first plug. When the hardware wizard asks for a driver, point it at the package's folder, USBDRV\FREE\<class>\<package>\<folder> (or USBDRV\NONFREE\...) in the install directory.
| Windows | What to install first |
|---|---|
| 98 SE | NUSB 3.3 or 3.6 for USB storage, UAS included. Without it HID and audio work but storage has no driver. SweetLow's stack also works (right-click its root USB2.INF, Install) but has no storage half: a stick shows Code 28 and a UAS drive Code 2 until NUSB's storage files are present. Reboot if asked. |
| ME | Nothing; a stock ME works, as does SweetLow's stack if already there. Plug an ordinary USB stick in once, so ME copies its storage drivers, before a UAS drive is recognised. |
| 2000 SP4, XP SP3 | Nothing. |
| XP x64 SP2, Vista SP2, 7 SP1 (x86/x64) | Nothing. Vista x64 and 7 x64 need test-signing mode (or F8 at every boot). |
| 8, 8.1, 10 (x86/x64) | Secure Boot off in the firmware setup; the x64 editions also need test-signing mode. Windows' own USB 3 driver stays unless you tick the USB drivers. |
- The eject icon on 98 SE comes only with NUSB 3.3's own setup, not with the seven storage files in this download. It lists USB sticks and UAS disks, never a Thunderbolt or USB4 drive: use the xHCI98 USB Tree or
INSTALL /console /ejectfor those. - 98 SE storage of any kind needs NUSB's mass-storage files (details).
- On an xHCI-only 98 SE or ME machine, have the Windows CD (or its files) at hand: Windows may ask for files.
You can also install by hand from Device Manager (Install by hand).
- Unzip the whole package.
- Double-click
SETUP.EXEin its top directory (on 2000 and XP as an administrator, on Vista and later answer Yes when Windows asks). - Go through the pages: Welcome, Components, Thunderbolt and USB4 (when that support is ticked), Free USB drivers and Non-free USB drivers (when the download carries them) and Summary. Help, or F1, explains the page you are on. The driver's options are under Settings; the tools go to
C:\XHCI98. Nothing changes until you click Install. - Answer Windows' unsigned-driver questions. If the Finish page lists steps left for you (a Found New Hardware window, for instance), do them and run
SETUP.EXEagain. Restart if it offers.
To uninstall, use Remove in Add/Remove Programs (Programs and Features on Vista and later). Every run writes XHCIINST.LOG at the root of the system drive; attach it to a bug report about an install. For scripted installs, see tools\xhciinst\readme.txt.
The controller in Device Manager on the P14s Gen 1 under Windows 98 SE.
The 64-bit drivers are test-signed, so Vista x64 to 10 x64 run them in test-signing mode (or with F8, "Disable Driver Signature Enforcement", at every boot). On 8, 8.1 and 10, turn Secure Boot off in the firmware setup first. Then, once:
- Open an elevated Command Prompt (Start, type
cmd, right-click, Run as administrator). - Run
bcdedit /set testsigning on. It stays on for every boot until turned off. - Restart. "Test Mode" shows on the desktop (bottom right on 7 and later, in the corners on Vista).
- Install the driver. Windows still says it cannot verify the publisher: choose "Install this driver software anyway". The Driver tab then says "Not digitally signed". Both are expected.
- Check:
bcdedit /enum {current}showstestsigning Yes. - Turn off:
bcdedit /set testsigning offand restart. The driver then needs F8 again, or the controller shows Code 39 (Vista) or Code 52 (7). - With BitLocker on the system drive, suspend it before changing the boot setting, or the next boot asks for the recovery key.
- This is not Microsoft signing: the certificate is the project's own, which no Windows trusts by itself. F8 still works for one boot without test mode.
For a machine whose keyboard or install medium is on the xHCI controller:
- Copy the files at the root of
nt-x86\(nt-x64\for XP x64), without its subfolders, to the root of a floppy. - Windows 2000 only: from the
I386folder of your Windows 2000 CD, copyUSBD.SY_,HIDCLASS.SY_andHIDPARSE.SY_to the floppy's root, unchanged (do not expand or rename). The package does not carry them. - Press F6 when text-mode Setup offers it, then S, and pick "xHCI98 USB 3 Controller (32-bit Windows 2000/XP)" (the x64 entry on XP x64), or on Windows 2000 the second entry, "xHCI98 USB 3 Controller (32-bit Windows 2000, files from CD)".
- Windows 2000: with a USB keyboard, mouse or stick used during Setup, the first entry leads to
STOP c000026cat the first start; the second entry without the three files stops Setup asking for them in drive A: (F3 quits). Plug the USB keyboard and stick in before Setup starts. - XP and XP x64: have a PS/2 or built-in laptop keyboard at hand. Later in Setup the USB keyboard does not work until a step that first asks about this unsigned driver.
- Pressing F6 needs the BIOS's own USB keyboard support.
- A USB floppy drive works for F6 only if it is one Setup knows: Mitsumi
03EE:6901, Y-E Data057B:0000or TEAC0644:0000(VID:PID). No INF can add another; otherwise use a floppy drive on the floppy controller. - A UAS-only disk is not usable until GUI-mode Setup; a flash stick, or a UAS disk that also offers Bulk-Only (most do), is.
- A USB drive present at the partition screen takes
C:. Unplug the USB drives you do not need. - Recovery Console (2000 and XP): the same floppy and F6, then R at the Welcome screen (on 2000, then C). The USB keyboard works throughout.
Details and limits: the release notes' F6 section.
Run SETUP.EXE (see above). By hand: Update Driver on the controller ("xHCI98 USB 3 Controller", or "xHCI98 USB 3.x eXtensible Host Controller" while an older version is installed), then on the root hub ("xHCI98 USB 3 Root Hub", or "xHCI98 USB 3.x Root Hub" while a version before 3.3.0.0 is installed), pointed at 98-me\, nt-x86\ or nt-x64\.
- 98 SE and ME: restart afterwards, although Windows does not ask. The old driver runs until then.
- 2000: use Have Disk (Update Driver -> "Display a list of the known drivers" -> Have Disk ->
nt-x86\) and pick the first model listed. Letting Windows search keeps the old driver. - XP, Vista and 7: the new driver runs at once, after the unsigned-driver warning; 32-bit Vista and 7 ask for a restart. Vista and 7 do not take a build with the same
DriverVeras the installed one. - A device Windows finds again as new hardware loses its hidusbf setting. Set it again.
- From
2.3.xor earlier: update the controller only; the hubs and composite devices then install by themselves. On 98 SE, XP and XP x64 keep a PS/2 or built-in keyboard and mouse at hand. See From 2.3.x or earlier. xhciuas.sysat the sameDriverVer: use Have Disk on "xHCI98 USB Attached SCSI Storage"; letting Windows search keeps the cached INF.
Each value is a DWORD in a driver (software) key, and also in the machine-wide key HKLM\System\CurrentControlSet\Services\USB, which wins for every controller when the value is there (tuning); restart Windows after a change (for XhciCm*, disabling and enabling the controller also works). The install writes most values (its Settings dialog, and "Advanced...") and an update keeps any you changed.
| Driver | Windows | Key (NNNN is the subkey whose DriverDesc names the controller) |
|---|---|---|
xhci98.sys |
98 SE, ME | HKLM\System\CurrentControlSet\Services\Class\USB\NNNN |
xhci98.sys |
2000 to 10 | HKLM\SYSTEM\CurrentControlSet\Control\Class\{36FC9E60-C465-11CF-8056-444553540000}\NNNN |
xhcicm.sys |
98 SE, ME | HKLM\System\CurrentControlSet\Services\Class\System\NNNN |
xhcicm.sys |
2000 to 10 | HKLM\SYSTEM\CurrentControlSet\Control\Class\{4D36E97D-E325-11CE-BFC1-08002BE10318}\NNNN |
| Value | What it does | Default |
|---|---|---|
XhciLogVerbosity |
The driver's log level, read by the USB Tree (0 to 4; 0 off) |
2 (fresh install; an update keeps the value there) |
XhciLogDebugView |
The log sent to DebugView as well | 0 |
XhciInterruptMode |
How events arrive: 0 automatic, 1 interrupt line, 2 polling, 3 message-signalled interrupt only |
0 |
XhciSelectiveSuspend |
1 suspends idle devices when Windows asks |
0 |
XhciResumeKeep |
1 keeps a device on a root port (its drive letter and open files) across a resume that starts the controller afresh; 0 removes it and finds it again |
1 |
XhciMaxTransferKB |
The largest UAS command, 64 to 2048 KiB |
1024 |
XhciForceBulkOnly |
1 uses Bulk-Only instead of UAS |
0 (1 if the value is absent) |
XhciIntelPortSwitch |
Intel 7/8/9-series port switchover: 1 on, 2 any Intel controller at your own risk (tools\portsw\) |
0 |
XhciCmMode |
Thunderbolt/USB4: 0 off, 1 automatic (2 and 3 are at your own risk) |
1 |
XhciCmApprove |
1 approves every device, 0 none (see approval) |
1 |
XhciCmSafeEject |
1 offers tunnelled devices for safe removal (98 SE and ME: in the USB Tree and INSTALL /console /eject only) |
1 |
XhciCmBridgeNumbering |
98 SE and ME: 1 sets up PCI bridges behind a tunnel plugged in after start (else Code 29 until restart) |
1 |
XhciCmLogVerbosity |
The Thunderbolt driver's log level, read by the USB Tree (0 to 4) |
2 |
XhciCmLogDebugView |
The Thunderbolt driver's log sent to DebugView as well | 0 |
XhciCmNet |
1 turns on Thunderbolt networking |
0 |
docs/using/tuning.md has every value of both drivers, its range and its effect, including polling periods, interrupt moderation, controller-fault handling, the per-controller fixes, the Linux-derived controller quirks and the XhciCm* values; the release notes describe the XhciCm* values in full.
| Machine | Controller | Tested by |
|---|---|---|
| 2012 Lenovo B490 | Intel Ivy Bridge, Panther Point HM77 (7-series) PCH, with EHCI beside it. xHCI 1.0. | Me |
| 2015 Dell Latitude E7250 | Intel Broadwell-U, Wildcat Point-LP (9-series) PCH, with EHCI beside it. xHCI 1.0. | Me |
| 2016 ThinkPad E460 | Intel Skylake, Sunrise Point-LP (100-series) PCH. xHCI 1.0. | Me |
| 2018 HP EliteBook 850 G5 | Intel Sunrise Point-LP (8086:9D2F, the E460's controller), xHCI 1.0. |
Community |
| 2020 ThinkPad P14s Gen 1 | Intel Comet Lake PCH-LP (400-series). xHCI 1.1. | Me |
| Omores' Intel and AMD desktops | H110, B360, B550, X570, X670 | Omores (1.x.x.x) |
| VMware Workstation 26 (virtual hardware 21), Windows XP SP3 guest | VMware's virtual xHCI (15AD:077A), a USB 3.0 stick at SuperSpeed |
Community (3.2.0.0) |
The drivers are in one folder per Windows family: 98-me\ (98 SE, ME), nt-x86\ (2000, XP, Vista, 7, 8, 8.1 and 10, 32-bit) and nt-x64\ (XP x64 and Server 2003 x64, Vista to 10, 64-bit). Each holds what its Windows installs, and nothing for another.
| Path | Contents |
|---|---|
98-me\, nt-x86\, nt-x64\ |
The drivers to install (below) |
INTEGRATE.TXT |
Which folder to give nLite, NTLite or DISM, and the F6 disk |
SETUP.EXE |
The installer: double-click it to install or update |
USBDRV\ |
Other USB drivers the download carries: NUSB33\, plus FREE\ in the -free download, and FREE\ and NONFREE\ in the -nonfree one (Downloads) |
INSTALL.BAT, tools\xhciinst\ |
For command-line and scripted installs (tools\xhciinst\readme.txt is the reference), and the programs both run (XHCIWIZ.EXE, XHCIWZ64.EXE, XHCIINST.EXE, XHCIIN64.EXE, and on 98 SE and ME the device install helper XHCIDI.EXE) |
tools\xhcitr\ |
The xHCI98 USB Tree, also the driver's log and snapshot reader |
tools\xhcimark\ |
XHCIMARK.EXE, XHCIMK64.EXE: the Thunderbolt safe-removal mark service, which the installer puts in place on 2000 to 10 with the Thunderbolt 3 / USB4 support |
tools\xhciqual\ |
DOS: XHCIQUAL.EXE and QUALREP.BAT |
tools\portsw\ |
portsw.vbs, portsw-on.bat, portsw-off.bat: the Intel port switchover |
tools\silent\ |
98 SE and ME: the silent install's list and switch |
readme.txt |
The release notes in plain text |
Each family folder holds:
- at its root,
xhci98.sys/.inf(controller) andxhciuas.sys/.inf(UAS storage); innt-x86\alsoxhcihlpr.sys, a helper 32-bit 2000, XP, Vista and 7 use for a finer timer while polling and, on Vista and 7, a message-signalled interrupt; innt-x86\andnt-x64\txtsetup.oem, for F6 during Windows 2000 or XP Setup (the folder's root files are the F6 floppy) cm\:xhcicm.sys/.inf(Thunderbolt and USB4); innt-x86\andnt-x64\its PCI-port filter,xhcicmf.inx, whichSETUP.EXEinstalls and no integration tool takes; and XHCIPFW, which closes the USB4 ports' memory windows above 4 GB at Windows start:XHCIPFW.VXDin98-me\,XHCIPFW.SYSinnt-x86\for 32-bit 2000 to 8.1 (see the BIOS)stor98\: the bundled NVMe driver (see NVMe drives), withstor98.mpdandS98VSD.VXDin98-me\xhci98-test.cerand a test-signed catalog (*.cat) for each driver, innt-x64\alone: the certificate is the public half of the x64 drivers' test certificate (no need to import it), and 64-bit 8, 8.1 and 10 need the catalogs
Bugs in the free USB class drivers go to usb-wdm-free's issues. The non-free drivers are from their manufacturers, as released, unchanged by this project. Everything else: open a bug report and attach:
- The driver's report: make the problem happen, then in the xHCI98 USB Tree use File > Save Report (or
XHCITR /report <file>) and attach the.TXT. It needs the logging level at 2 or more (the default; View > Logging level...). - The driver's snapshot: right after the report, use File > Save Snapshot... (or
XHCITR /snapshot;XHCITR64on 64-bit Windows) and attach the four files it writes (.DEV,.TXT,.BINand.PSC, named from the date and time). - The DOS report, if a maintainer asks for it: run
QUALREP.BATfrom real DOS inTOOLS\XHCIQUAL\and attach the.LOGit names (read-only). If a maintainer asks for the full run,XHCIQUAL --no-page --log FULL.LOGresets the controller and its ports: use a PS/2 keyboard, and do not write the log to a drive on that controller. - An install problem:
XHCIINST.LOGfrom the root of the system drive.
The release notes' Known limitations, Thunderbolt and USB4 limitations and Untested ground have the full lists. The ones most likely to matter:
- Windows 98 SE and ME
- Stock Windows 98 SE has no USB storage driver without NUSB. HID and audio still work.
- Windows ME: do not unplug a device while Windows is installing it. Shut Down can hang with a USB disk not opened since start; open it once (a
diris enough) or remove it first. (Both happen on Microsoft's own USB stack too.) - Windows ME: a UAS drive plugged in before any ordinary stick shows Code 2. Plug in a stick once, then replug the UAS drive.
- Windows 98 SE: the first USB audio device plugged in after a boot (a webcam with a microphone included) can freeze Windows. Plug it in before switching on and leave it plugged in. If you have a webcam but not use the microphone, you can use usb-wdm-free's
NOAUD98.INF. - Windows 98 SE and ME: installing the free audio or MIDI driver, Windows may ask for
wdmaudio.cat,ks.catand other files of its own from the Windows CD. Point it at the CD'sWIN98folder, or click Skip File for the.catfiles: they only hold signatures, which 98 SE and ME do not check.
- Windows 2000
- A mounted USB drive can come back at Code 31 after a controller recovery or hibernation. Replug it to recover.
- Windows XP
- Installing XP from the F6 floppy needs a PS/2 or built-in keyboard to answer GUI-mode Setup's unsigned-driver question. Windows 2000 does not ask.
- Vista x64 and 7 x64
- Test-signing mode or F8 is needed at every start; otherwise the controller sits at Code 39 (Vista) or Code 52 (7).
- Windows 8, 8.1 and 10
- Secure Boot must be off, and the x64 editions need test-signing mode.
- Thunderbolt and USB4
- Standby and hibernation with a device attached are not supported. Stop and unplug the device first.
- Windows 2000 to 7 with a TB/USB4 host: ejecting a dock, or an enclosure with its own PCIe switch, stops it safely, but its connection stays up until you physically disconnect it.
- A dual-mode NVMe enclosure (TB/USB4, and USB) may come up as a USB (UAS) disk instead. Unplug it and plug it in again to get the Thunderbolt or USB4 connection.
- Windows 2000, XP and XP x64: the first time a dock or an enclosure with a switch is plugged in, its devices may stop and start again once, a few seconds after it is plugged in (after its Found New Hardware windows are answered), while xHCI98 sets up its PCI Express ports. If a drive behind it is already in use, unplug it safely and plug it in again instead. The first NVMe enclosure plugged in brings two Found New Hardware wizards: finish the first (it finds no driver), then follow the second, "Stor98 Storage Controller for NVMe SSDs", to the end.
- Stop a dock before unplugging it when a keyboard, mouse, tablet or similar device is on the dock's own USB controller (on 98 SE and ME, on Vista and 7 with a Thunderbolt 3 controller, and on 2000 and XP unless xHCI98 builds the computer's USB4 tunnels itself, where the unplug is normally handled). Otherwise Windows may never finish removing the dock: it is not found again when plugged back, and Windows does not shut down.
- Windows 2000 with the "Standard PC" computer type: an NVMe drive plugged in behind the tunnel after the start works, but runs polled. Drives attached at power-on are not affected; other non-ACPI computer types are untested (issue 19).
The drivers are C89 (no C++ or CRT), built on Windows 11 x64. The toolchain unpacks inside the repository (tools/, git-ignored), installs nothing to C:\, and every script finds it relative to itself.
-
Download into
tools\under these exact names:File Source tools\MSVC600.zipMSVC 6.0 - itsmattkc/MSVC600 tools\WIN2KDDK.EXEWindows 2000 DDK - KunYi/WDK_DDKArchive The 64-bit build (and the 32-bit
xhcihlpr.sys) also needs WDK 7.1 (7600.16385.1) unpacked totools\WinDDK71. -
Unpack them in place:
powershell -ExecutionPolicy Bypass -File scripts\setup-msvc6.ps1 # -> tools\MSVC600 powershell -ExecutionPolicy Bypass -File scripts\install-w2kddk-cabs.ps1 # -> tools\ntddk
-
Build.
release(default) is the one shipping flavour;alladds the emulator-onlyqemuflavour, which is never published.-amd64builds the separate 64-bit binaries. Every build runs the gates' self-tests, the host unit tests and the INF, import and charset gates, and stops on any failure.scripts\build-driver.cmd release scripts\build-driver.cmd release -amd64The same runs build and gate Stor98, the bundled NVMe driver, from
src\stor98(it also needs the Windows 98 DDK'sSCSI.HandSRB.Hintools\w98ddk\inc; src/stor98/docs/BUILD.md);scripts\build-all.cmdruns both architectures at once. -
The tools build with their own
build.cmdinxhciqual\(needs Open Watcom 2.0 atC:\WATCOM),xhciinst\andxhcitr\. -
Install media:
scripts\package\make-package.ps1(toout\); a release cut:scripts\package\make-release.ps1. Never hand-copy a.syswithout its INF. -
Test in QEMU with
qemu-xhci(Win98 SE, Win2000 SP4 and an SMP Win2000 guest;usb-storageandusb-uasfor SuperSpeed and UAS).
The version lives in src/xhci_version.h. build-and-test.md has the full procedure (VMs, gates, versioning, packaging), and source-files.md says what each source file is.
src/ xhci98.sys (C), its two INFs and DDK build files
uas/ xhciuas.sys, the UAS class driver
cm/ xhcicm.sys, the Thunderbolt and USB4 driver
stor98/ Stor98, the bundled NVMe driver (BSD-3-Clause)
test/ Host-side unit tests (test\run-host-tests.cmd)
scripts/ Build wrapper, setup helpers, gates, vm-matrix/
xhciqual/ DOS hardware-qualification tool (Open Watcom)
xhciinst/ Install/update/uninstall tool and INSTALL.BAT
xhcitr/ The xHCI98 USB Tree
docs/ Documentation, indexed by docs/README.md
releases/ Every release cut, one directory per version
images/ Pictures used by this README
.github/ Issue forms
AGENTS.md Maintainer and AI agent guide
tools/ external/ vm/ out/ Toolchain, reference mirrors, guests, staged media (git-ignored)
Everything is under docs/, indexed by docs/README.md. Start with:
- Users: Release notes, Tuning, Release acceptance test, Release history
- Contributors: AGENTS.md (the orientation), Build and test, the roadmaps for 2.0.0.0 onward and for 3.0.0.0 onward, Design records (the HCD is 13; Thunderbolt and USB4 are 21 and 22), Source files, Failure diagnosis and lessons, Test equipment, Legal and provenance record
- Hardware and Windows: xHCI programming, xHCI data structures, Windows 98/2000 WDM constraints, and the 1.x miniport's USBPORT interface and ABI
This project was developed with substantial help from AI coding agents:
- Claude Fable 5.1 for planning
- Claude Opus 5.5 for coding
- Codex GPT 6 Astra as an adversarial reviewer
The agents wrote and revised code, tests and documentation under the guidance in AGENTS.md.
Kheng Meng directed the work, ran the hardware validation on real machines and reviewed what went in.
- xHCI specification (Intel), citations verified against revision 1.2c
- USB 3.2 specification (USB-IF), revision 1.1 (June 2022) with its ECNs, cited as
USB 3.2 p.N - USB-IF xHCI backwards compatibility testing (v1.7)
- How does USB stack enumerate a device? (Microsoft USB blog) - the hub driver's enumeration steps and timeouts, which the first-enumeration wait's defaults follow
- ReactOS usbport - the
usbport.sysminiport interface of the 1.x driver (undocumented by Microsoft) - Linux xhci-pci.c - controller quirk table
- Haiku XHCI driver and FreeBSD xhci.c - second opinions on hardware details
None of these PDFs is tracked here; fetch your own into the git-ignored docs/references/ (docs/references/README.md has versions and SHA-256 sums). Source mirrors go in external/ (external/README.md).
xHCI98 is licensed under GPL-2.0-or-later (LICENSE); Stor98 keeps its own BSD-3-Clause licence (src/stor98/LICENSE). The repository holds no Microsoft file, but some downloads carry third-party drivers unmodified, without an established licence to redistribute them. The details are in docs/contributing/legal-provenance.md.
The documentation (every Markdown file outside src/stor98/, this README included) is licensed under CC BY 4.0, not the GPL. LICENSE-docs.md gives the scope, what is excluded and how to credit. Third-party material quoted in the documentation keeps its own terms.
If you use anything from the xHCI98 project and its blog posts in your work, please credit this repository and/or blog post. I would be interested to know how it has helped.
- Stor98, the bundled NVMe driver, is a fork of SweetLow's nvme9x / nvment, SweetLow's port to Windows 9x and NT4 of nvme2k by Dominik Behr (techomancer). Its README and NOTICE give the lineage and the licence.
- The Windows 98 SE USB storage files in the release download are taken unmodified from the NUSB (Native USB) project's 3.3 release by Maximus Decim; the files themselves are Microsoft's, apart from
USBU2A.SYS(see "Licensing and provenance").
