Zebra LP2844 DOMException 的 Windows 10 WebUSB 打印问题:拒绝访问

jmr*_*uez 5 google-chrome winusb windows-10 webusb

在一个项目中,我尝试使用 Chrome 中可用的 WebUSB API 来使用 Zebra LP2844 打印机进行打印。

我在 OSX 上毫无问题地取得了成功,并最终在 Ubuntu 和 ChromeOS 上取得了成功,这要归功于这篇讨论解除内核驱动程序绑定以便 Chrome 能够访问设备的帖子

我为此使用的页面通过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");
    }
}
Run Code Online (Sandbox Code Playgroud)

我在这里找到了一个类似的问题,指向另一个答案。当我插入打印机时,Windows 安装的默认驱动程序阻止 Chrome 访问它(就像 Ubuntu 一样),这是完全合理的。

因此,我实现了一个自定义 .inf 文件,如此处所述

这是我的 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
Run Code Online (Sandbox Code Playgroud)

使用 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)]
Run Code Online (Sandbox Code Playgroud)

我什至尝试使用zadig替换打印机驱动程序,结果相同(拒绝访问错误)。

在这一点上,非常感谢任何帮助。

更新 03/05/2018

今天,我按照以下步骤成功地完成了我的自定义 inf 安装程序:

  • 阻止 Windows 10 在我插入打印机时在网络上搜索驱动程序并安装它们(在此处查看详细信息
  • 更新我的自定义 inf 安装程序以使用 USBDevice 类和 {88bae032-5a81-49f0-bc3d-a4ff138216d6} ClassGuid 值
  • 构建驱动cat文件并签名
  • 卸载设备的所有驱动程序并拔下打印机
  • 重新启动计算机
  • 重新插入打印机。此时,在设备管理器中,检测到该设备为通用串行总线设备如图所示
  • 最后,按照此说明使用之前创建的驱动程序更新设备驱动程序。

驱动程序安装成功,regedit 反映设备现在正在使用 WinUSB 驱动程序更新

可悲的是,我继续收到“DOMException:拒绝访问”。当我尝试从网页打印时出错......所以我仍然需要帮助:(

ps:这可能是我所知道的关于 stackoverflow 最长的帖子(或者至少前 10 名)。

更新 03/06/2018

根据 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
Run Code Online (Sandbox Code Playgroud)

有趣的是(实际上很奇怪),在尝试获取这些新信息时,我的谷歌浏览器开始抛出

TypeError: Cannot read property 'getDevices' of undefined
Run Code Online (Sandbox Code Playgroud)

控制台中出现错误,在控制台中输入 navigator.usb 返回undefined

由于那没有任何意义,我重新安装了 Chrome,但错误仍在继续

因此,我安装了 Chrome Canary(存在 navigator.usb 的地方),结果发现打印机开始打印并且拒绝访问错误消失了。

我卸载了 Chrome Canary,不知何故 GA Chrome 也工作了。直到我关闭 Chrome 并再次打开它。然后我再次收到“无法读取未定义的属性‘getDevices’”错误。

我注意到删除 AppData/Local/Google 中 Chrome 的用户数据文件夹(整个配置文件文件夹)会使 Chrome 再次工作,直到我关闭它并再次打开它。

尽管我正在调用 releaseInterface 并关闭,但我的打印代码中的某些内容可能会“保留”某些内容?

现在问题似乎有所改变,有什么想法吗?

jmr*_*uez 6

在其他 Windows 机器上进行了一些测试后,我成功地使用Zadig软件将 Windows 安装的驱动程序替换为 WinUSB,使一切正常工作。

关键是更换驱动程序后重新启动计算机。

我开发的自定义驱动程序也可以工作,但 Zadig 的程序使事情变得更容易;)


归档时间:

查看次数:

2506 次

最近记录:

7 年,10 月 前