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:访问被拒绝的主要内容,如果未能解决你的问题,请参考以下文章

通过 WebUSB JavaScript 打开钱箱

windows 打印刻录 代码规范及问题

windows10 更新之后不能连接共享打印机 错误代码0x0000011b是怎么回事?

Erlang中的Collat​​z序列

python 打印 A ~ Z

接口申领失败:该平台不支持或未实现操作