阅读:1158回复:5
关于传输的问题
如果有两个PIPE,请问如何从中选择一个来进行传输
|
|
沙发#
发布于:2003-05-08 10:39
你指的是那一边的啊!是否说得具体一点!
|
|
板凳#
发布于:2003-05-08 12:45
这要根据你的两个终端描述符(endpoint descriptor)的前后位置以及该端口(interface discriptor)模式下固件中所处描述符列表的位置而定,在使用通道时只要填入该端口模式下该管道的序号(从0开始顺序向下数所得的数)就能对其操作。你可找一些厂家框架核固件结合起来看就很容易明白了。
|
|
地板#
发布于:2003-05-09 20:15
yes
|
|
地下室#
发布于:2003-05-09 22:42
最直接的方法是用softice调试一下源代码,只要有源程序,一般是在selectinterface函数,或者buildpipelist函数里处理的端点信息,每个端点会有个端点号,根据这个端点好可以找到相应的端点句柄。看下面这个函数:
NTSTATUS D12_BuildPipeList( IN PDEVICE_OBJECT DeviceObject ) { PDEVICE_EXTENSION deviceExtension; ULONG i; WCHAR Name[] = L\"\\\\PIPE00\";//端点名称 PUSBD_INTERFACE_INFORMATION interface;//接口信息,里面包含有端点信息 deviceExtension = DeviceObject->DeviceExtension; interface = deviceExtension->Interface; deviceExtension = DeviceObject->DeviceExtension; for (i=0; i<D12_MAX_PIPES; i++)//确定端点名字 { Name[6] = \'X\'; RtlCopyMemory(deviceExtension->PipeList.Name, Name, sizeof(Name)); } // // build a list of pipe names based on the interface // for (i=0; i<interface->NumberOfPipes; i++) { Name[6] = \'0\' + (USHORT) i; RtlCopyMemory(deviceExtension->PipeList.Name, Name, sizeof(Name)); deviceExtension->PipeList.PipeInfo = &interface->Pipes;//这里面存的就是端点的信息,包括句柄,端点类型最大包大小等 deviceExtension->PipeList.Opened = FALSE; } return STATUS_SUCCESS; } 里面的具体函数和结构msdn里都有,自己看一下就明白了。关键的有USBD_INTERFACE_INFORMATION和USBD_INTERFACE_LIST_ENTRY(上面没有) |
|
5楼#
发布于:2003-05-10 02:07
thank you very much!
|
|