首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >未被libusb列出的USB/IP模拟设备

未被libusb列出的USB/IP模拟设备
EN

Stack Overflow用户
提问于 2015-09-25 06:46:19
回答 1查看 1.1K关注 0票数 1

有一个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集线器。

EN

回答 1

Stack Overflow用户

发布于 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内法中

代码语言:javascript
复制
 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”:

代码语言:javascript
复制
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:还有这个:

代码语言:javascript
复制
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;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32776344

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档