创建自签名证书并签名 INF
编写inf、gpd文件
1.生成测试证书 PowerShell
New-SelfSignedCertificate -Type CodeSigningCert -Subject "CN=MyPrinterTestCert" -CertStoreLocation "Cert:\CurrentUser\My"
2.导出 PFX 文件(含私钥)
在“证书管理器 (certmgr.msc)” → “个人 → 证书”中找到刚刚创建的证书 → 导出为:MyPrinterTestCert.pfx
受信任的根证书颁发机构certutil -store root MyPrinterTestCert
受信任的发布者certutil -store trustedpublisher MyPrinterTestCert
3.生成驱动目录签名文件(Developer Command Prompt for VS 2019)
inf2cat /driver:. /os:10_X64
Inf2Cat /driver:. /os:10_X64,10_X86
重命名:ren myv3printer.cat MyV3Printer.cat
4.把 MyPrinterTestCert.pfx 从C:\Windows\System32复制到 C:\Visual_Studio_2019\MyV3PrinterDriver
5.使用证书签名
查看证书:certutil -viewstore MY
签名:signtool sign /f MyPrinterTestCert.pfx /p 123 /fd SHA256 /tr http://timestamp.digicert.com MyV3Printer.cat
如果网络不通或被墙,可直接用本地签名,不加时间戳
signtool sign /fd SHA256 /f MyPrinterTestCert.pfx /p 123 MyV3Printer.cat
signtool sign /fd SHA256 /f MyPrinterTestCert.cer /p 123 MyV3Printer.cat
signtool sign /fd SHA256 /f MyPrinterTestCert.pfx /p 123 oemui.dll
signtool sign /fd SHA256 /f MyPrinterTestCert.cer /p 123 oemui.dll
验证签名:signtool verify /v /pa MyV3Printer.cat
signtool verify /kp /v myv3printer.cat
6.安装pnputil /add-driver MyV3Printer.inf /install
7.查看驱动pnputil /enum-drivers
8.卸载pnputil /delete-driver oem11.inf /uninstall /force
9.添加到打印队列
rundll32 printui.dll,PrintUIEntry /if /b "Lithography printer" /f "C:\Visual_Studio_2019\MyV3PrinterDriver\MyV3Printer.inf" /r "FILE:" /m "My V3 Sample Printer"
rundll32 printui.dll,PrintUIEntry /if /b "My V3 Sample Printer" /f "C:\Visual_Studio_2019\MyV3PrinterDriver\MyV3Printer.inf" /r "FILE:" /m "My V3 Sample Printer"
LPT1 端口
rundll32 printui.dll,PrintUIEntry /if /b "My V3 Sample Printer LPT" ^ /f "C:\Visual_Studio_2019\MyV3PrinterDriver\MyV3Printer.inf" ^ /r "LPT1:" /m "My V3 Sample Printer"
COM1 串口
rundll32 printui.dll,PrintUIEntry /if /b "My V3 Sample Printer COM" ^ /f "C:\Visual_Studio_2019\MyV3PrinterDriver\MyV3Printer.inf" ^ /r "COM1:" /m "My V3 Sample Printer"
TCP/IP 9100(Raw 模式)端口
rundll32 printui.dll,PrintUIEntry /if /b "My V3 Sample Printer 9100" ^ /f "C:\Visual_Studio_2019\MyV3PrinterDriver\MyV3Printer.inf" ^ /r "IP_192.168.1.100" /m "My V3 Sample Printer"
FILE: 虚拟测试
rundll32 printui.dll,PrintUIEntry /if /b "My V3 Sample Printer FILE" ^ /f "C:\Visual_Studio_2019\MyV3PrinterDriver\MyV3Printer.inf" ^ /r "FILE:" /m "My V3 Sample Printer"
10.添加到打印队列会在设备管理器中显示,但卸载需要这个命令:printui.exe /s /t2
重启 Spooler 服务(可选但推荐)net stop spooler和net start spooler
11.查找系统中所有 UNIDRV.DLL 的实例,会看到多个版本的 UNIDRV.DLL 存在于 WinSxS 目录中:dir C:\Windows\WinSxS\*unidrv.dll /s /b
12.查看安装日志notepad %windir%\inf\setupapi.dev.log
13.查看打印机端口printmanagement.msc
14.多次安装/卸载驱动或手动清理打印组件后常见: “FILE:” 端口处于损坏或句柄锁死状态。
- 管理员powershell
Add-PrinterPort -Name "MyFilePort:"
cmd
rundll32 printui.dll,PrintUIEntry /if /b "My V3 Sample Printer" ^ /f "C:\Visual_Studio_2019\MyV3PrinterDriver\MyV3Printer.inf" ^ /r "MyFilePort:" /m "My V3 Sample Printer" - cmd
net stop spooler
reg delete "HKLM\SYSTEM\CurrentControlSet\Control\Print\Monitors\Local Port" /f
net start spooler
管理员powershell
Add-PrinterPort -Name "FILE:"
Get-PrinterPort | findstr FILE
正常的输出:
FILE: Local Monitor遇到出错,进行以下操作:
检查 Local Port DLL 是否存在:dir "C:\Windows\System32\localspl.dll"
重新注册 Local Port Monitor:reg add "HKLM\SYSTEM\CurrentControlSet\Control\Print\Monitors\Local Port" /v "Driver" /t REG_SZ /d "localspl.dll" /f - 重建整个打印子系统
cmd
dism /online /enable-feature /featurename:"Printing-PrintToFileServices-Features" /all
15.确认 oemui.dll 是一个真正的、可加载的 DLLdumpbin /headers oemui.dll
确认DLL导出函数dumpbin /exports oemui.dll
16.检查DLL能否独立加载rundll32 .\oemui.dll,OEMGetInfo
17.查看 Driver Store:C:\Windows\System32\DriverStore\FileRepository\
18.验证catinf2cat /list myv3printer.cat
19.oemui.dll 签名signtool verify /v "C:\Visual_Studio_2019\MyV3PrinterDriver\oemui.dll"
20.cat 签名?
signtool verify /pa myv3printer.cat
21.最近的错误条目(时间、事件 ID、faulting module)
wevtutil qe Microsoft-Windows-PrintService/Admin /f:text /c:20
wevtutil qe System /f:text /c:20 | findstr /i spool
22.regedit验证
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Printers\My V3 Sample Printer\PrinterDriverData
23.ttfsub.gpd
C:\Windows\System32\spool\drivers\x64\PCC\
24.GhostPCL (gpcl6win64.exe)渲染prn为pdf
"C:\ghostpcl-10.05.1-win64\gpcl6win64.exe" -r600 -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile="C:\test\1.pdf" "C:\test\1.prn"