usbser.sys mdmcpq.inf问题与电缆分离

时间:2018-07-31 12:33:47

标签: usb cdc

我设计了使用PIC18F67J94的嵌入式系统,并使用了随机VID和PID。然后,我使用Zadig为硬件生成了USB CDC驱动程序。它使用mdmcpq.inf和usbser.sys。以下是Zadig制作的.inf文件,其中对供应商名称进行了一些修改

[Strings]
SNMPMOD = "SNMP-Modbus Converter"
VendorName = "ABCD"
SourceName = "ABCD Install Disk"
SNMPMODID   = "VID_8474&PID_0005"
DeviceGUID = "{6097438F-67AB-4C8C-A8C5-AF92EE79D3DF}"
Service    = "USB COM Port"

[Version]
Signature   = "$Windows NT$"
Provider = "ABCD"
Class       = Ports
ClassGuid   = {4D36E978-E325-11CE-BFC1-08002BE10318}
CatalogFile = ABCD.cat
DriverVer   = 04/11/2018, 1.0.0.6

[ControlFlags]
ExcludeFromSelect=*

[Manufacturer]
%VendorName% = DeviceList,NTx86,NTamd64

[DeviceList.NTx86]
%SNMPMOD% = UsbSer_Install, USB\%SNMPMODID%

[DeviceList.NTamd64]
%SNMPMOD% = UsbSer_Install, USB\%SNMPMODID%

[UsbSer_Install]
include     = mdmcpq.inf
CopyFiles   = FakeModemCopyFileSection
AddReg      = UsbSer_Install.AddReg
AddProperty = UsbSer_AddProperty

[UsbSer_Install.AddReg]
HKR,,DevLoader,,*ntkern
HKR,,NTMPDriver,,usbser.sys
HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider"

[UsbSer_Install.Services]
AddService = usbser,0x00000002,UsbSer_Service

[UsbSer_Service]
DisplayName   = %Service%
ServiceType   = 1
StartType     = 3
ErrorControl  = 1
ServiceBinary = %12%\usbser.sys
LoadOrderGroup = Base

[UsbSer_AddProperty]
GenericDriverInstalled,,,,1

[DestinationDirs]
DefaultDestDir = 12

[SourceDisksNames]
1 = %SourceName%

它可以使COM端口正常工作,但是如果我在不关闭COM端口的情况下卸下设备,然后重新连接设备,则设备管理器会显示要连接的设备以​​及与之对应的COM端口号,但该COM端口使用终端软件无法访问。

然后我必须再次移除设备,然后重新连接设备,之后它会创建有效的com端口。

我也使用了FTDI设备和Prolific Technology设备,它们都没有这些问题。

Prolific使用ser2pl.sys,因为FTDI有其自己的.sys文件。

我想知道在断开设备连接时是否可以使窗户以某种方式关闭COM端口。

1 个答案:

答案 0 :(得分:1)

据我所知,对于在Windows 10之前的Windows版本上使用usbser.sys的任何设备,这都是不可避免的问题。(最好张贴有关驱动程序的详细信息,但我没有认为在这种情况下很重要。)

您可以使用WinObj程序检查由usbser.sys之类的驱动程序创建的COM端口对象,并且您会看到该驱动程序在使用它的程序之前无法销毁该COM端口。关闭它的句柄。因此,在关闭旧的COM端口之前再次插入设备时,驱动程序将无法使用正确的名称创建COM端口,因为旧的对象仍在闲逛。

他们实际上在重写usbser.sys时已在Windows 10中修复了该问题,因此您可以升级到Windows10。如果我没记错的话,要使COM端口正常工作,您要做的就是关闭句柄。 COM端口的旧实例;您无需断开设备连接。另外,Windows 10附带了一个名为usbser.inf的Microsoft驱动程序,因此您不必生成自己的驱动程序。

(顺便说一句,如果您打算将此设备运送给用户,我希望您购买自己的供应商ID。使用随机的供应商ID是避免冲突的方法,如果冲突会干扰您的设备或其他设备的功能,用户同时拥有。)