Windows 10 WebUSB 打印问题与 Zebra LP2844 DOMException:访问被拒绝
Posted
技术标签:
【中文标题】Windows 10 WebUSB 打印问题与 Zebra LP2844 DOMException:访问被拒绝【英文标题】:Windows 10 WebUSB printing issues with Zebra LP2844 DOMException: Access denied 【发布时间】:2018-03-02 23:21:50 【问题描述】:在一个项目中,我尝试使用 Chrome 中提供的 WebUSB API 来使用 Zebra LP2844 打印机进行打印。
由于this post 谈到解除内核驱动程序绑定以便 Chrome 能够访问设备,我在 OSX 上成功并最终在 Ubuntu 和 ChromeOS 上取得了成功。
我正在使用的页面是通过 https 提供的,因为文档需要它。
但是,在 Windows 10 上,我可以使用 navigator.usb.requestDevice 连接到打印机,如下所示
但是当我在打印例程期间在连接的打印机上调用 open() 时,我不断收到下一个错误
错误 DOMException:访问被拒绝。
这里是打印方法代码:
print : async function(printString)
let startTime = new Date().getTime();
if (!this.pairedPrinter)
console.log("No printer connected");
return;
try
if (!this.pairedPrinter.opened)
await this.pairedPrinter.open();
await this.pairedPrinter.claimInterface(0);
let encoder = new TextEncoder();
const printBuffer = encoder.encode(printString);
let printResult = await this.pairedPrinter.transferOut(6, printBuffer);
await this.pairedPrinter.releaseInterface(0);
await this.pairedPrinter.close();
catch (err)
console.log("Error");
console.log(err);
finally
let endTime = new Date().getTime();
let printTime = endTime - startTime;
console.log("Print time: " + printTime + " ms");
我发现了一个类似的问题here,指向this other answer。当我插入打印机时,Windows 安装的默认驱动程序会阻止 Chrome 访问它(就像 Ubuntu 一样),这是完全有道理的。
所以,我实现了一个自定义 .inf 文件作为described here。
这是我的 inf 文件
;
;
; Installs WinUsb
;
; =================== Strings ===================
[Strings]
ManufacturerName = "Zebra"
ClassName = "Universal Serial Bus devices"
DeviceName = "Aeropost Zebra LP2844"
SourceName = "Aeropost Zebra LP2844 Install Disk"
DeviceID = "VID_0A5F&PID_0009"
DeviceGUID = "c3bd2e26-7e03-4189-8c9d-852faf628494"
REG_MULTI_SZ = 0x00010000
[Version]
Signature = "$Windows NT$"
Class = Printer
ClassGuid = 4d36e979-e325-11ce-bfc1-08002be10318
Provider = %ManufacturerName%
CatalogFile = zebrawinusb.cat
DriverVer = 03/02/2018,1.0.0.0
; ========== Class definition ===========
[ClassInstall32]
AddReg = ClassInstall_AddReg
[ClassInstall_AddReg]
HKR,,,0,"Universal Serial Bus devices"
HKR,,Icon,,-20
; ========== Manufacturer/Models sections ===========
[Manufacturer]
%ManufacturerName% = Standard,NTx86
%ManufacturerName% = Standard,NTamd64
[Standard.NTx86]
%DeviceName% = USB_Install, USB\%DeviceID%
[Standard.NTamd64]
%DeviceName% = USB_Install, USB\%DeviceID%
; =================== Installation ===================
[USB_Install]
Include = winusb.inf
Needs = WINUSB.NT
[USB_Install.Services]
Include = winusb.inf
Needs = WINUSB.NT.Services
[USB_Install.Wdf]
KmdfService = WINUSB, WinUsb_Install
[WinUSB_Install]
KmdfLibraryVersion = 1.11
[USB_Install.HW]
AddReg=Dev_AddReg
[Dev_AddReg]
HKR,,DeviceInterfaceGUIDs,0x10000,%DeviceGUID%
[USB_Install.CoInstallers]
AddReg = CoInstallers_AddReg
CopyFiles = CoInstallers_CopyFiles
[CoInstallers_AddReg]
HKR,,CoInstallers32,0x00010000,"WdfCoInstaller01011.dll,WdfCoInstaller","WinUsbCoInstaller2.dll"
[CoInstallers_CopyFiles]
WinUsbCoInstaller2.dll
WdfCoInstaller01011.dll
[DestinationDirs]
; If your INF needs to copy files, you must not use the DefaultDestDir directive here.
CoInstallers_CopyFiles=11
; ================= Source Media Section =====================
[SourceDisksNames]
1 = %SourceName%
[SourceDisksFiles.x86]
WinUSBCoInstaller2.dll = 1,x86
WdfCoInstaller01011.dll = 1,x86
[SourceDisksFiles.x64]
WinUSBCoInstaller2.dll = 1,x64
WdfCoInstaller01011.dll = 1,x64
使用 inf2cat 构建驱动程序,对其进行测试签名,当我尝试更新打印机驱动程序以使用它时,它失败并出现错误“找不到指定的文件 (0x00000002)”。
setupapi.dev.log 文件没有提供任何关于未找到哪个文件的信息。
这是驱动程序更新过程的日志文件:
>>> [Device Install (DiShowUpdateDevice) - USBPRINT\ZEBRA_LP2844_\6&3295E28F&3&USB001]
>>> Section start 2018/03/02 16:14:00.023
cmd: "C:\WINDOWS\system32\mmc.exe" C:\WINDOWS\system32\devmgmt.msc
dvi: DIF_UPDATEDRIVER_UI 16:14:00.023
dvi: Class installer: Enter 16:14:00.023
dvi: Class installer: Exit
dvi: Default installer: Enter 16:14:00.039
dvi: Default installer: Exit
dvi: DIF_UPDATEDRIVER_UI - exit(0xe000020e) 16:14:00.054
ndv: Update Driver Software Wizard - USBPRINT\ZEBRA_LP2844_\6&3295E28F&3&USB001
dvi: DIF_SELECTDEVICE 16:14:05.662
dvi: Class installer: Enter 16:14:05.678
dvi: Class installer: Exit
dvi: DIF_SELECTDEVICE - exit(0xe000020e) 16:14:05.678
dvi: DIF_SELECTDEVICE 16:14:12.148
dvi: Class installer: Enter 16:14:12.148
dvi: Class installer: Exit
dvi: DIF_SELECTDEVICE - exit(0xe000020e) 16:14:12.163
ndv: Driver package 'C:\WINDOWS\System32\DriverStore\FileRepository\zebrawinusb.inf_amd64_ddcc3ed00fd3e8a8\zebrawinusb.inf' is already imported.
sto: Setup Import Driver Package: c:\zebrawinusbdriver\zebrawinusb.inf 16:14:16.158
sto: Driver package already imported as 'oem20.inf'.
sto: Setup Import Driver Package - exit (0x00000000) 16:14:16.180
dvi: Searching for hardware ID(s):
dvi: usbprint\zebra_lp2844_5bc4
dvi: zebra_lp2844_5bc4
dvi: Class GUID of device remains: 4d36e979-e325-11ce-bfc1-08002be10318.
dvi: Plug and Play Service: Device Install for USBPRINT\ZEBRA_LP2844_\6&3295E28F&3&USB001
dvi: Driver INF Path: C:\WINDOWS\INF\oem20.inf
dvi: Driver Node Name: zebrawinusb.inf:c14ce8840c48fa1f:USB_Install:1.0.0.0:usb\vid_0a5f&pid_0009,
dvi: Driver Store Path: C:\WINDOWS\System32\DriverStore\FileRepository\zebrawinusb.inf_amd64_ddcc3ed00fd3e8a8\zebrawinusb.inf
dvi: Searching for hardware ID(s):
dvi: usbprint\zebra_lp2844_5bc4
dvi: zebra_lp2844_5bc4
dvi: Class GUID of device changed to: 4d36e979-e325-11ce-bfc1-08002be10318.
dvi: Core Device Install 16:14:16.313
! pol: Selected driver node does not match this device (force-install)
dvi: Install Device - USBPRINT\ZEBRA_LP2844_\6&3295E28F&3&USB001 16:14:16.316
dvi: Device Status: 0x0180200a, Problem: 0x0 (0x00000000)
dvi: Parent device: USB\VID_0A5F&PID_0009\42J113802152
! dvi: Unable to determine matching device ID for oem20.inf. Error = 0xE0000228
! dvi: Unable to configure device, falling back to standard device installation.
dvi: DIF_ALLOW_INSTALL 16:14:16.324
dvi: Using exported function 'ClassInstall32' in module 'C:\WINDOWS\system32\ntprint.dll'.
dvi: Class installer == ntprint.dll,ClassInstall32
dvi: Class installer: Enter 16:14:16.336
dvi: Class installer: Exit
dvi: Default installer: Enter 16:14:16.340
dvi: Default installer: Exit
dvi: DIF_ALLOW_INSTALL - exit(0xe000020e) 16:14:16.342
dvi: DIF_INSTALLDEVICEFILES 16:14:16.343
dvi: Class installer: Enter 16:14:16.344
!!! dvi: Class installer: failed(0x00000002)!
dvi: DIF_INSTALLDEVICEFILES - exit(0x00000002) 16:14:16.383
! dvi: Queueing up error report for device install failure.
dvi: Install Device - exit(0x00000002) 16:14:16.383
dvi: Core Device Install - exit(0x00000002) 16:14:16.383
dvi: DIF_DESTROYPRIVATEDATA 16:14:16.383
dvi: Class installer: Enter 16:14:16.383
dvi: Class installer: Exit
dvi: Default installer: Enter 16:14:16.399
dvi: Default installer: Exit
dvi: DIF_DESTROYPRIVATEDATA - exit(0xe000020e) 16:14:16.399
ump: Plug and Play Service: Device Install exit(00000002)
!!! ndv: Device install failed for device.
ndv: Update Driver Software Wizard exit(00000002)
<<< Section end 2018/03/02 16:15:14.498
<<< [Exit status: FAILURE(0x00000002)]
我什至尝试使用zadig 替换打印机驱动程序,结果相同(访问被拒绝错误)。
在此,我们非常感谢任何帮助。
2018 年 3 月 5 日更新
今天我成功地完成了我的自定义 inf 安装程序,遵循以下步骤:
阻止 Windows 10 在我插入打印机时在网上搜索驱动程序并安装它们 (view details here) 更新我的自定义 inf 安装程序以使用 USBDevice 类和 88bae032-5a81-49f0-bc3d-a4ff138216d6 ClassGuid 值 构建驱动程序cat文件并签名 卸载设备的所有驱动程序并拔下打印机 重启电脑 重新插入打印机。此时,在设备管理器中,设备被检测为通用串行总线设备 最后,跟随followed this instructions 使用之前创建的驱动程序更新设备驱动程序。驱动安装成功,regedit 反映设备正在使用 WinUSB
遗憾的是,当我尝试从网页打印时,我继续收到 “DOMException: Access denied.” 错误...所以我仍然需要帮助:(
ps:这可能是我所知道的关于 *** 的最长帖子(或至少前 10 名)。
2018 年 3 月 6 日更新
根据 Reilly Grant 的要求,我包含了 USBView 的输出(Windows 的 lsusb 等效项)
[Port1] : Aeropost Zebra LP2844
Is Port User Connectable: yes
Is Port Debug Capable: no
Companion Port Number: 10
Companion Hub Symbolic Link Name: USB#ROOT_HUB30#4&4f0abe8&0&0#f18a0e88-c30c-11d0-8815-00a0c906bed8
Protocols Supported:
USB 1.1: yes
USB 2.0: yes
USB 3.0: no
Device Power State: PowerDeviceD0
---===>Device Information<===---
*!*ERROR: No String Descriptor for index 4!
ConnectionStatus:
Current Config Value: 0x01 -> Device Bus Speed: Full (is not SuperSpeed or higher capable)
Device Address: 0x01
Open Pipes: 2
===>Device Descriptor<===
bLength: 0x12
bDescriptorType: 0x01
bcdUSB: 0x0100
bDeviceClass: 0x07
*!*ERROR: unknown bDeviceClass 7
bDeviceSubClass: 0x01
*!*ERROR: bDeviceSubClass of 1 is invalid
bDeviceProtocol: 0x02
*!*ERROR: bDeviceProtocol of 2 is invalid
bMaxPacketSize0: 0x08 = (8) Bytes
idVendor: 0x0A5F = Zebra Technologies
idProduct: 0x0009
bcdDevice: 0x0001
iManufacturer: 0x02
*!*ERROR: No String Descriptor for index 2!
iProduct: 0x04
*!*ERROR: No String Descriptor for index 4!
iSerialNumber: 0x06
*!*ERROR: No String Descriptor for index 6!
bNumConfigurations: 0x01
---===>Open Pipes<===---
===>Endpoint Descriptor<===
bLength: 0x07
bDescriptorType: 0x05
bEndpointAddress: 0x85 -> Direction: IN - EndpointID: 5
bmAttributes: 0x02 -> Bulk Transfer Type
wMaxPacketSize: 0x0040 = 0x40 bytes
bInterval: 0x00
===>Endpoint Descriptor<===
bLength: 0x07
bDescriptorType: 0x05
bEndpointAddress: 0x06 -> Direction: OUT - EndpointID: 6
bmAttributes: 0x02 -> Bulk Transfer Type
wMaxPacketSize: 0x0040 = 0x40 bytes
bInterval: 0x00
---===>Full Configuration Descriptor<===---
===>Configuration Descriptor<===
bLength: 0x09
bDescriptorType: 0x02
wTotalLength: 0x0020 -> Validated
bNumInterfaces: 0x01
bConfigurationValue: 0x01
iConfiguration: 0x00
bmAttributes: 0xC0 -> Self Powered
-> Bus Powered
MaxPower: 0x00 = 0 mA
===>Interface Descriptor<===
bLength: 0x09
bDescriptorType: 0x04
bInterfaceNumber: 0x00
bAlternateSetting: 0x00
bNumEndpoints: 0x02
bInterfaceClass: 0x07 -> This is a Printer USB Device Interface Class
bInterfaceSubClass: 0x01
bInterfaceProtocol: 0x02
iInterface: 0x00
===>Endpoint Descriptor<===
bLength: 0x07
bDescriptorType: 0x05
bEndpointAddress: 0x85 -> Direction: IN - EndpointID: 5
bmAttributes: 0x02 -> Bulk Transfer Type
wMaxPacketSize: 0x0040 = 0x40 bytes
bInterval: 0x00
===>Endpoint Descriptor<===
bLength: 0x07
bDescriptorType: 0x05
bEndpointAddress: 0x06 -> Direction: OUT - EndpointID: 6
bmAttributes: 0x02 -> Bulk Transfer Type
wMaxPacketSize: 0x0040 = 0x40 bytes
bInterval: 0x00
有趣(实际上很奇怪),在尝试获取这些新信息时,我的谷歌浏览器开始抛出
TypeError: Cannot read property 'getDevices' of undefined
控制台出错,在控制台输入 navigator.usb 返回 undefined。
由于这没有任何意义,我重新安装了 Chrome,但错误仍然存在
因此,我安装了 Chrome Canary(存在 navigator.usb),结果发现 THE PRINTER STARTED PRINTING 并且拒绝访问错误消失了。
我卸载了 Chrome Canary 并且不知何故 GA Chrome 也可以正常工作。直到我关闭 Chrome 并再次打开它。然后我再次收到“无法读取未定义的属性'getDevices'”错误。
我注意到删除 AppData/Local/Google 中的 Chrome 用户数据文件夹(整个配置文件文件夹)会使 Chrome 再次工作,直到我将其关闭并再次打开它。
尽管我正在调用 releaseInterface 并关闭,但我的打印代码中的某些内容可能会留下一些“保留”的内容?
现在问题似乎有所改变,有什么想法吗?
【问题讨论】:
您能否包含此设备的lsusb -v
的输出以及当您收到“拒绝访问”时在 chrome://device-log 中显示的错误。错误。
@ReillyGrant 我已经相应地更新了问题......但是情况似乎发生了一些变化。非常感谢您快速浏览并分享您的想法
原来 getDevices 错误是由未定义的 navigator.usb 引起的,已报告并详细解释了一个错误 [bugs.chromium.org/p/chromium/issues/detail?id=819197](here).该问题出现在 Chrome 64.0.3282.186(我使用的那个)中。 “解决方案”是使用“--enable-features=WebUSB”标志启动 chrome。
这是错误报告链接bugs.chromium.org/p/chromium/issues/detail?id=819197。另一个“解决方案”是将chrome升级到65.X.X.X
【参考方案1】:
在其他windows机器上进行了几次测试后,我设法使用Zadig软件将windows安装的驱动程序替换为WinUSB。
关键是更换驱动后重启电脑。
我开发的自定义驱动程序也可以,但 Zadig 的程序让事情变得更容易;)
【讨论】:
【参考方案2】:也许您可以在此处使用我的 WebUSB 测试仪进行快速测试:https://larsgk.github.io/webusb-tester/ 它应该会显示系统声明了哪些接口(如果这是失败的原因)。
【讨论】:
感谢您分享您的测试仪。当然有用。请查看上面的最新更新。以上是关于Windows 10 WebUSB 打印问题与 Zebra LP2844 DOMException:访问被拒绝的主要内容,如果未能解决你的问题,请参考以下文章