libusb未列出USB/IP模拟设备

libusb未列出USB/IP模拟设备,ip,usb,Ip,Usb,有一个工具允许通过TCP/IP网络共享访问USB设备。USB设备连接到运行TCP服务器的Linux PC和运行连接到Linux的VHCI驱动程序的Windows PC。 这种方法可以在没有任何硬件的情况下模拟任何USB设备。您只需要编写TCP服务器,它将处理USB请求。(像) 但它的问题是,模拟设备并不是真正正确的。当您尝试使用libusb列出已连接的USB设备时,会出现错误“未列出的祖先…”,因为模拟设备在设备树中没有父设备。 另一方面,一些工具,如显示模拟设备 只讨论了问题,没有提供真正的解

有一个工具允许通过TCP/IP网络共享访问USB设备。USB设备连接到运行TCP服务器的Linux PC和运行连接到Linux的VHCI驱动程序的Windows PC。 这种方法可以在没有任何硬件的情况下模拟任何USB设备。您只需要编写TCP服务器,它将处理USB请求。(像)

但它的问题是,模拟设备并不是真正正确的。当您尝试使用libusb列出已连接的USB设备时,会出现错误“未列出的祖先…”,因为模拟设备在设备树中没有父设备。 另一方面,一些工具,如显示模拟设备

只讨论了问题,没有提供真正的解决方案

那个么问题是它在USB/IP windows驱动程序中有缺陷吗?有Windows驱动程序开发经验的人能帮上忙吗?关于父设备的交易是什么?为什么它如此重要

任何提示都将不胜感激!事先非常感谢您的帮助


UDPATE:技术上的问题是libusb无法将模拟设备的父设备(USB/IP枚举器)识别为集线器。这使得模拟设备由于父项为空而被忽略。所以问题是如何修补USB/IP驱动程序,使其作为普通USB集线器被libusb可见。问题是USB/IP windows驱动程序v0.2.0.0没有在IRP上回复。它只将IRP_MN_QUERY_功能分派给模拟设备,而不分派给总线驱动程序本身。 我已经向USB/IP驱动程序添加了IRP\u MN\u QUERY\u处理功能,现在它被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 )
我在
开关(IrpStack->MinorFunction)中添加了新的“case”:

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;
}
NTSTATUS\u PDO\u QueryDeviceCaps(\u在PFDO\u设备中\u数据设备数据中,\u在PIRP Irp中)
{
PIO_堆栈_位置堆栈;
PDEVICE_能力设备能力;
设备功能和性能;
PAGED_代码();
堆栈=IoGetCurrentIrpStackLocation(Irp);
deviceCapabilities=stack->Parameters.deviceCapabilities.Capabilities;
如果(设备容量->版本!=1 | |设备容量->大小DeviceState[电源系统工作]=电源设备0;
如果(deviceCapabilities->DeviceState[PowerSystemSleeping1]!=PowerDeviceD0)
deviceCapabilities->DeviceState[PowerSystemSleeping1]=PowerDeviceD1;
如果(deviceCapabilities->DeviceState[PowerSystemSleeping2]!=PowerDeviceD0)
deviceCapabilities->DeviceState[PowerSystemSleeping2]=PowerDeviceD3;
如果(deviceCapabilities->DeviceState[PowerSystemSleeping3]!=PowerDeviceD0)
deviceCapabilities->DeviceState[PowerSystemSleeping3]=PowerDeviceD3;
deviceCapabilities->DeviceWake=PowerDeviceD1;
deviceCapabilities->DeviceD1=TRUE;//是的,我们可以
deviceCapabilities->DeviceD2=假;
deviceCapabilities->WakeFromD0=FALSE;
deviceCapabilities->WakeFromD1=TRUE;
deviceCapabilities->WakeFromD2=假;
deviceCapabilities->WakeFromD3=假;
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;
设备容量->UINumber=1;
返回状态\成功;
}

您愿意分享该更改的来源吗?一堆USB调试工具在USB/IP上似乎不起作用或看不见,就像在你的例子中一样,我正试图用它来模拟一个设备。谢谢!这非常有帮助。那是
总线PDO\u查询设备caps
吗?不,是从总线PnP()调用的总线FDO\u PnP()。或者你的意思是什么?带有
状态=\u PDO\u QueryDeviceCaps
的行。是否定义了
\u PDO\u QueryDeviceCaps
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;
}