书中无法理解的一处描述

[复制链接]
2229|0
 楼主| BitFu 发表于 2007-8-21 07:48 | 显示全部楼层 |阅读模式
ST, TE, ce, ip, AC
Programming&nbsp;the&nbsp;Microsoft&nbsp;Windows&nbsp;Driver&nbsp;Model中描述:<br />多功能设备&nbsp;<br />如果你的设备有一个配置和多个接口,Microsoft的总线驱动程序将自动把这种设备当作一个组合的,或多功能设备。你必须为每个接口提供一个功能驱动程序,通过在INF中用接口类和子类替换厂商标识和产品标识。总线驱动程序为每个接口创建一个物理设备对象(PDO),这样,PnP管理器就可以装载独立的驱动程序。当任何一个功能驱动程序读取配置描述符时,总线驱动程序就提供一个修改后的仅描述一个接口的描述符。关于INF文件中的设备标识的各种可能形式请参考第十二章。<br /><br />以上是书上的一段话,我做了些试验说明事情不是那么回事<br />例如我的设备有两个INTERFACE第一个INTERFACE中只有一个中断端点EP1<br />第二个INTERFACE&nbsp;中有两个批端点,分别为EP2和EP3,按上面的意思,端点EP2,和EP3是不可用的,而我在配置的过程中获取这些端点的句柄,之后向这些端点读/写数据完全可以,是不是说上面书上的描述有问题?<br /><br />我的配置代码如下:<br /><br />/////////////////////////////////////////////////////////////////////////////<br />//UsbSelectConfiguration:&nbsp;&nbsp;&nbsp;&nbsp;选择配置<br />NTSTATUS&nbsp;UsbSelectConfiguration(&nbsp;IN&nbsp;PUSER_DEVICE_EXTENSION&nbsp;dx)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;获取所有描述符<br />&nbsp;&nbsp;&nbsp;&nbsp;PUSB_CONFIGURATION_DESCRIPTOR&nbsp;Descriptors&nbsp;=&nbsp;NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;ULONG&nbsp;size;<br />&nbsp;&nbsp;&nbsp;&nbsp;ULONG&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;NTSTATUS&nbsp;status&nbsp;=&nbsp;UsbGetConfigurationDescriptors(&nbsp;dx,&nbsp;Descriptors,&nbsp;0,&nbsp;size);<br />&nbsp;&nbsp;&nbsp;&nbsp;if(&nbsp;!NT_SUCCESS(status))<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FreeIfAllocated(Descriptors);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;status;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;USBD_INTERFACE_LIST_ENTRY&nbsp;ilist[3];<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;//从复合的配置描述符中寻找第一个接口描述符<br />&nbsp;&nbsp;&nbsp;&nbsp;PUSB_INTERFACE_DESCRIPTOR&nbsp;id&nbsp;=&nbsp;USBD_ParseConfigurationDescriptorEx(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Descriptors,&nbsp;Descriptors,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;-1,&nbsp;&nbsp;&nbsp;&nbsp;-1,&nbsp;-1,&nbsp;-1);&nbsp;&nbsp;&nbsp;&nbsp;//均为搜索条件&nbsp;-1表示无<br />&nbsp;&nbsp;&nbsp;&nbsp;if(&nbsp;id==NULL)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FreeIfAllocated(Descriptors);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;STATUS_NO_SUCH_DEVICE;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;//用第一个接口描述符填充接口数组<br />&nbsp;&nbsp;&nbsp;&nbsp;ilist[0].InterfaceDescriptor&nbsp;=&nbsp;id;<br />&nbsp;&nbsp;&nbsp;&nbsp;ilist[0].Interface&nbsp;=&nbsp;NULL;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//这将指向urb-&gtUrbSelectConfiguration.Interface<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;//找到第二个接口<br />&nbsp;&nbsp;&nbsp;&nbsp;id&nbsp;=&nbsp;USBD_ParseConfigurationDescriptorEx(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Descriptors,&nbsp;Descriptors,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1,&nbsp;-1,&nbsp;&nbsp;&nbsp;&nbsp;-1,&nbsp;-1,&nbsp;-1);&nbsp;&nbsp;&nbsp;&nbsp;//均为搜索条件&nbsp;-1表示无<br />&nbsp;&nbsp;&nbsp;&nbsp;if(&nbsp;id==NULL)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FreeIfAllocated(Descriptors);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;STATUS_NO_SUCH_DEVICE;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;ilist[1].InterfaceDescriptor&nbsp;=&nbsp;id;<br />&nbsp;&nbsp;&nbsp;&nbsp;ilist[1].Interface=NULL;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;//表示结束<br />&nbsp;&nbsp;&nbsp;&nbsp;ilist[2].InterfaceDescriptor=&nbsp;NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;ilist[2].Interface=NULL;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;创建&nbsp;select&nbsp;configuration&nbsp;URB&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;PURB&nbsp;urb&nbsp;=&nbsp;USBD_CreateConfigurationRequestEx(&nbsp;Descriptors,&nbsp;ilist);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;if(urb==NULL)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DebugPrint(&quot;urb&nbsp;is&nbsp;null&quot;);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;status&nbsp;=&nbsp;CallUSBDI(&nbsp;dx-&gtNextStackDevice,&nbsp;urb);<br />&nbsp;&nbsp;&nbsp;&nbsp;if(&nbsp;!NT_SUCCESS(status)&nbsp;||&nbsp;!USBD_SUCCESS(&nbsp;urb-&gtUrbHeader.Status))<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DebugPrint(&quot;Error&nbsp;Status:%x&nbsp;urb&nbsp;Status:%x&quot;,status,urb-&gtUrbHeader.Status);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;status&nbsp;=&nbsp;STATUS_UNSUCCESSFUL;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dx-&gtUsbConfigurationHandle&nbsp;=&nbsp;urb-&gtUrbSelectConfiguration.ConfigurationHandle;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PUSBD_INTERFACE_INFORMATION&nbsp;InterfaceInfo&nbsp;=&nbsp;&urb-&gtUrbSelectConfiguration.Interface;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DebugPrint(&quot;EndPoint&nbsp;Number:%d&quot;,InterfaceInfo-&gtNumberOfPipes);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PUSBD_PIPE_INFORMATION&nbsp;pi&nbsp;=&nbsp;&InterfaceInfo-&gtPipes[0];<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pi=&(ilist[1].Interface-&gtPipes[0]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dx-&gthEpBulkWrite&nbsp;=&nbsp;pi-&gtPipeHandle;//这是我获取第二个接口中EP2的方法<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pi=&(ilist[1].Interface-&gtPipes[1]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dx-&gthEpBulkRead=pi-&gtPipeHandle;//这是获取EP3的方法<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;FreeIfAllocated(urb);<br />&nbsp;&nbsp;&nbsp;&nbsp;FreeIfAllocated(Descriptors);<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;status;<br />}<br />
您需要登录后才可以回帖 登录 | 注册

本版积分规则

195

主题

1058

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部