Windows 打印机初识
Windows 打印架构
Windows 打印架构是:
应用程序
↓
WinSpool.dll
↓
Spooler(排队)
↓
Port Monitor
↓
链路:物理/网络路径
协议:RAW9100、IPP、LPR等PrintProtocol
↓
Printer连接方式
- 物理连接
USB 或 LPT 连接打印机- 网络连接
TCP/IP打印机 -> 连接方式
电脑 → TCP/IP → 打印机
通过 PowerShell 命令 Get-PrinterPort 可以得到端口: IP_192.168.1.100
优点:稳定、快速、企业标准
缺点:需要知道IP后,手动添加,不能自动发现- 共享连接
共享打印机 -> 连接方式
打印机 → 电脑A → SMB共享 → 电脑B
特点:最老的方案,打印机实际上连在另一台电脑上
例如,有:
HP打印机
↓ USB
财务电脑
然后共享:\\Finance-PC\HPPrinter 其他人连接:\\Finance-PC\HPPrinter 即可打印理解 SMB 和 LocalSpool
✔ SMB 是“把打印任务交给别的电脑”
✔ LocalSpool 是“本机怎么处理打印任务”场景1:USB 打印机(LocalSpool)
- 你电脑直接插了一台打印机:
PC ─── USB ─── Printer - 你点“打印”后:
Word → Windows Spooler(Windows本地排队(Spool)管理) → USB001 → 打印机
- 你电脑直接插了一台打印机:
场景2:共享打印机
你的电脑 → \\PrintServer\HP_LaserJet → 打印服务器电脑 → 真实打印机- 打印流程是:
Word → Windows Spooler → SMB(网络传输)→ 打印服务器 → 服务器 Spooler → USB/TCPIP 打印机
发现方式
通过物理连接 或 共享连接 的方式连接的打印机,不需要特别的发现方式,直接连接即可。
这里主要针对网络打印机。先看下图:
电脑
│
┌──────────────┼──────────────┐
│ │ │
TCP/IP WSD Bonjour
│ │ │
▼ ▼ ▼
9100 IPP/HTTP IPP
│ │ │
└──────────────┬──────────────┘
│
打印机
----------------------------------------------------------
port:9100(TCP) —— RAW打印(JetDirect)
port:631 —— IPP打印(Internet Printing Protocol, 现代标准)
port:80 —— Web管理接口 —— HTTP Web UI
port:443 —— IPPS(加密IPP) —— HTTPS + IPPWSD打印机
WSD打印机 -> 自动发现方式 + 连接方式
Windows自动发现打印机,全称:Web Services for Devices
本质是:是微软推动的一套设备服务框架
包含:
WS-Discovery 设备发现
WS-Metadata 获取设备信息
WS-Eventing 状态通知
WS-Print 打印服务
工作过程:
打印机广播(UDP 3702 multicast):"我在这里" → Windows发现 → 自动安装 → 创建打印机
用户体验:
打开:设置 → 添加打印机,自动出现:
HP LaserJet
Canon MF440
Brother MFC
等已经发现的打印机列表
端口:WSD-12345678Bonjour打印机
Bonjour打印机 -> 自动发现方式
Apple的自动发现机制,也就是说常见的自动发现协议:WSD(微软)、Bonjour(苹果)
本质是:设备发现协议
工作原理:
打印机广播(mDNS UDP 5353):_ipp._tcp.local、 _airprint._tcp.local
电脑或手机监听: UDP 5353
用户体验
iPhone打开:打印
自动看到:
Canon TS8300
Brother MFC
HP M404
等已经发现的打印机列表AirPrint打印机
AirPrint打印机 -> 苹果打印标准
很多人把它和Bonjour混为一谈。实际上:Bonjour ≠ AirPrint
AirPrint是一整套规范。负责: 发现 + 打印 + 认证 + 格式支持
工作流程:
iPhone → Bonjour发现 → 获得打印机 → IPP → 发送PDF → 打印机设备发现实现
- PrinterEngine Discovery
┌─────────────────────────────────┐
│ 1. WSD监听(Windows必备) │
│ 2. mDNS监听(Bonjour/AirPrint) │
│ 3. SNMP扫描(企业标准 │
│ 4. TCP扫描(9100/631/80/443) │
│ 5. USB枚举(USB打印机) │
│ 6. SMB枚举(共享打印机) │
└─────────────────────────────────┘
↓
统一设备模型
↓
PrinterManager APIWindows 下 Printer&&Usb 相关 注册表及文件路径
- 基础信息
HKLM
└─System
└─CurrentControlSet
└─Control
│ └─Print : Printer Object
│ └─Printers : 打印机
│ └─Monitors : 端口
└─Enum
└─USB
└─VID_xxxx&PID_xxxx
└─ xxxx : Usb设备信息
Service = usbprint- 打印机驱动文件目录:
C:\Windows\System32\spool\drivers\[os-version]
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Environments\[os-version]\Drivers\Windows 下打印机安装
安装打印机 = 驱动安装 + 端口创建 + 打印队列创建 + 打印机注册
安装的关键流程:
SetupVerifyInfFileW
SetupCopyOEMInfW
// 触发设备匹配
UpdateDriverForPlugAndPlayDevicesW or DiInstallDriverW
系统自动:
Device ID
↓
INF match
↓
Driver install
↓
Driver Store instance
↓
Enum\Device\Driver 绑定
// 设备生效
Device Manager 更新
Driver loaded
Kernel driver attachWindows 下打印关键 API 节点
如果你要做“完整卸载”,正确顺序是:
- 解绑 Printer / Device
- 停止 Print Spooler(必要时)
- 删除 Printer Driver (Spooler API)
- SetupUninstallOEMInfW
- 清理 Driver Store residual
打印机对象(Spooler)
EnumPrinters、OpenPrinter说明: 打印机已经注册到Windows,Spooler可以访问EnumPrinters(...) 是在问: Spooler,请把你管理的 Printer Object 列出来 OpenPrinter(...) 打开的是:Printer Object 实例句柄打印驱动(Driver)
说明: GetPrinterDriver 验证:驱动注册 DocumentProperties 验证:驱动配置模块(纸张设置、 双面设置、颜色设置 等) CreateDC 验证:驱动渲染模块 CreateDC 是驱动是否真正可用,最有价值的检查之一。
Windows 驱动分类
涉及 Windows 的三种完全不同的驱动体系:
Windows Driver
│
┌────────────────┼────────────────┐
│ │ │
▼ ▼ ▼
PnP Driver Filter Driver Printer Driver
USB Upper Filter V3 Driver
PCI Lower Filter V4 Driver
HID File System Print Driver
NET Class Filter- PnP Driver (即插即用) 即:USB、PCI、HID、NET等,Windows 设备驱动,用于管理硬件连接
- Filter Driver 用于拦截、修改、增强或替换打印数据流,如加密、水印、审计等
- Printer Driver 用于处理打印机渲染和通信的专用驱动,包括 V3、V4 驱动和通用打印驱动
常用的 powershell 命令
Test-NetConnection 192.168.0.105 -Port 80
Get-Printer -Name "Test Mi Printer" | fl *
Get-PrintJob -PrinterName "Test Mi Printer" | fl *
Restart-Service Spooler- Get-Printer 和 Get-PrinterPort 只能看到: ✔ 已安装到 Windows 的打印机 ✔ 已创建端口的打印机 ✔ 已走 Print Spooler 的打印机
