Windows 2000 USB Printer Installation and Binding
This article examines the technical process Microsoft Windows 2000
uses to detect, install, and bind drivers to USB-connected printers. It
details the interaction between the operating system's Plug and Play
(PnP) subsystem, the native USB printer class driver
(usbprint.sys), the creation of virtual printer ports, and
the handoff to the Windows Print Spooler for driver association.
1. Hardware Detection and USB Enumeration
When a USB printer is connected to a Windows 2000 system, the host
controller detects a change in voltage on the data lines (D+ or D-)
indicating a new device. The USB bus driver (usbhub.sys)
enumerates the device by resetting the port, assigning a unique USB
address, and querying the standard Device Descriptor and Configuration
Descriptors.
During enumeration, Windows 2000 identifies the device's base class from the Interface Descriptor:
- Class:
07h(Printer) - SubClass:
01h(Printer) - Protocol:
01h,02h, or03h(Unidirectional, Bidirectional, or 1284.4 compliant)
To identify the specific make and model, the USB stack issues a
class-specific request—GET_DEVICE_ID—to interface 0. This
retrieves an IEEE 1284 device identification string containing
manufacturer (MFG or MANUFACTURER), model
(MDL or MODEL), and command set
(CMD) details.
2. Loading the USB Printer Class Driver
Because the interface matches the USB printer class specification, the Windows 2000 PnP manager matches the device to the native class driver rather than a generic or third-party bus driver.
Windows 2000 loads usbprint.sys (the USB Printer Class
Driver) as the Functional Device Object (FDO) on top of the Physical
Device Object (PDO) generated by the USB bus. The
usbprint.sys driver serves as the communication bridge
between the USB transport layer and the legacy-style printing
architecture.
3. Creation of the Virtual Printer Port
Traditional Windows printing relied on physical hardware ports such
as LPT1 or COM1. Because USB devices lack
static hardware addresses or standard I/O port assignments,
usbprint.sys dynamically instantiates virtual printer
ports.
Upon loading, usbprint.sys:
- Creates a device interface associated with the printer globally
unique identifier (
GUID_DEVINTERFACE_USBPRINT). - Registers a virtual port name—typically
USB001for the first device, incrementing sequentially (USB002,USB003) for subsequent devices or connections. - Exposes this virtual port to the Windows Spooler subsystem, allowing
the port monitor (
usbmon.dll) to handle read and write operations directed to the device.
4. Hardware ID Generation and INF Matching
After establishing communication through usbprint.sys,
the PnP manager constructs a set of Device IDs and Compatible IDs using
the 1284 string obtained during initial enumeration. The primary
Hardware ID follows this format:
USBPRINT\ManufacturerModelChecksum
The PnP manager searches the Windows 2000 driver store (located in
%SystemRoot%\Inf, primarily checking
ntprint.inf and Driver.cab) for a matching
entry. If an exact match is found, the installation proceeds
automatically. If no match is found, Windows prompts the user via the
"Found New Hardware Wizard" to provide an OEM installation disk
containing a compatible .inf file.
5. Driver Binding and Print Spooler Integration
Once a compatible driver is identified, the installation shifts from
the PnP manager to the Print Spooler service
(spoolsv.exe):
- Driver File Placement: The spooler copies necessary
rendering filters, GDI dynamic link libraries (such as
unidrv.dllorpscript5.dll), and device-specific minidrivers to%SystemRoot%\System32\Spool\Drivers\w32x86\. - Registry Configuration: Keys are created under
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Printers\containing the printer name, driver path, and default configuration. - Port Binding: The spooler explicitly assigns the
print queue to the dynamically generated
USB00xport created byusbprint.sys. - Queue Initialization: The printer is marked as
active. When an application submits a print job, GDI processes the
document via the assigned printer driver, passes the raw data to the
spooler, and routes the data stream through
usbmon.dlldirectly tousbprint.sysfor bulk transfer over the USB bus.