有一个USB/IP工具,允许通过TCP/IP网络共享访问USB设备。USB设备连接到运行TCP服务器的Linux PC,运行VHCI驱动程序的Windows PC连接到Linux。这种方法可以在没有硬件的情况下模拟任何USB设备。您所需要的只是编写TCP服务器,它将处理USB请求。(如这里)
但它的问题是,模拟设备是不正确的。当您尝试使用libusb列出连接的USB设备时,您将得到一个“未列出的祖先..”错误。由于模拟设备在设备树中没有父级。另一方面,像扎迪格这样的工具会显示模拟设备。
正是问题讨论了这里,没有提供真正的解决方案。
那么问题是USB/IP窗口驱动程序中的错误吗?有Windows驱动程序开发经验的人能帮上忙吗?父母的设备是怎么回事?为什么这么重要?
任何提示都会非常感谢!提前谢谢你的帮助
UDPATE :技术上的问题是,libusb不能将模拟设备(USB/IP枚举器)作为集线器来识别。这使得模拟设备被忽略,因为它的父级为空。因此,问题是如何通过libusb将USB/IP驱动程序修补为普通USB集线器。
发布于 2015-10-08 08:46:23
问题是USB/IP windows驱动程序v0.2.0.0在IRP_MN_QUERY_CAPABILITIES IRPs上没有响应。它只向模拟设备发送IRP_MN_QUERY_CAPABILITIES,而不发送给总线驱动程序本身。我在USB/IP驱动程序中添加了IRP_MN_QUERY_CAPABILITIES处理,现在被libusb检测为普通的USB集线器设备。
UPD:
在pnp.c内法中
NTSTATUS Bus_FDO_PnP (
__in PDEVICE_OBJECT DeviceObject,
__in PIRP Irp,
__in PIO_STACK_LOCATION IrpStack,
__in PFDO_DEVICE_DATA DeviceData )我在switch (IrpStack->MinorFunction)中添加了新的“case”:
case IRP_MN_QUERY_CAPABILITIES:
{
status = _PDO_QueryDeviceCaps(DeviceData, Irp);
Irp->IoStatus.Status = status;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
Bus_DecIoCount(DeviceData);
return status;
}UPD2:还有这个:
NTSTATUS _PDO_QueryDeviceCaps(__in PFDO_DEVICE_DATA DeviceData, __in PIRP Irp)
{
PIO_STACK_LOCATION stack;
PDEVICE_CAPABILITIES deviceCapabilities;
DEVICE_CAPABILITIES parentCapabilities;
PAGED_CODE();
stack = IoGetCurrentIrpStackLocation(Irp);
deviceCapabilities = stack->Parameters.DeviceCapabilities.Capabilities;
if (deviceCapabilities->Version != 1 || deviceCapabilities->Size < sizeof(DEVICE_CAPABILITIES))
{
return STATUS_UNSUCCESSFUL;
}
deviceCapabilities->DeviceState[PowerSystemWorking] = PowerDeviceD0;
if (deviceCapabilities->DeviceState[PowerSystemSleeping1] != PowerDeviceD0)
deviceCapabilities->DeviceState[PowerSystemSleeping1] = PowerDeviceD1;
if (deviceCapabilities->DeviceState[PowerSystemSleeping2] != PowerDeviceD0)
deviceCapabilities->DeviceState[PowerSystemSleeping2] = PowerDeviceD3;
if (deviceCapabilities->DeviceState[PowerSystemSleeping3] != PowerDeviceD0)
deviceCapabilities->DeviceState[PowerSystemSleeping3] = PowerDeviceD3;
deviceCapabilities->DeviceWake = PowerDeviceD1;
deviceCapabilities->DeviceD1 = TRUE; // Yes we can
deviceCapabilities->DeviceD2 = FALSE;
deviceCapabilities->WakeFromD0 = FALSE;
deviceCapabilities->WakeFromD1 = TRUE;
deviceCapabilities->WakeFromD2 = FALSE;
deviceCapabilities->WakeFromD3 = FALSE;
deviceCapabilities->D1Latency = 0;
deviceCapabilities->D2Latency = 0;
deviceCapabilities->D3Latency = 0;
deviceCapabilities->EjectSupported = FALSE;
deviceCapabilities->HardwareDisabled = FALSE;
deviceCapabilities->Removable = TRUE;
deviceCapabilities->SurpriseRemovalOK = TRUE;
deviceCapabilities->UniqueID = FALSE;
deviceCapabilities->SilentInstall = FALSE;
deviceCapabilities->Address = 1;
deviceCapabilities->UINumber = 1;
return STATUS_SUCCESS;
}https://stackoverflow.com/questions/32776344
复制相似问题