USB编程研究之三(DeviceIoControl函数和控制码)

来源:互联网 发布:js数组中删除某个元素 编辑:程序博客网 时间:2024/06/09 19:49
在对USB研究的过程中,不得已不停的在网上搜索资料,但得到的都是相互抄袭,对用途和方法解释得很少,大概很多人抱着不同的心里吧,有些人想炫耀一下自己的水平,有不想教别人,而有些人自以为懂了,其实至少掌握了几段源码,对里面的东西根本就没有认真的研究。

 

对于USB编程,其中一个函数叫做:

BOOL DeviceIoControl(
  HANDLE
hDevice            //handle to device of interest
  DWORDdwIoControlCode     // control code of operation to perform
  LPVOIDlpInBuffer         //pointer to buffer to supply input data
  DWORDnInBufferSize       //size, in bytes, of input buffer
  LPVOIDlpOutBuffer        //pointer to buffer to receive output data
  DWORDnOutBufferSize      //size, in bytes, of output buffer
  LPDWORDlpBytesReturned   //pointer to variable to receive byte count LPOVERLAPPEDlpOverlapped     //pointer to structure for asynchronous operation
);
这个函数在MSDN中有简单的介绍:

    TheDeviceIoControl function sends a control code directly to aspecified device driver, causing the corresponding device toperform the specified operation.

   也就是说,这个函数是对指定的设备驱动发送控制码,导致设备响应来完成指定的操作。

   其余的,就介绍得很少,或者很难与你要做的事情联系上。对于我们想写USB程序的人更是不知道怎样来使用。

    那么在这里介绍一些经验。

   首先来说,DeviceToControl()函数是一个通用函数,从微软的解释中我们就可以看到,它对设备的操作是取决于你发什么样的控制码。在MSDN中对这个函数介绍的时候,并没有介绍与USB相关的控制码。我也曾经用错了控制码,导致最后使用GetLastError()函数总数得到错误码50.在网上有些网友也发生同样的错误,但没有人给出答案。这个问题却在新闻组中老外给我答案。看来我们中国的所谓的高手们还得继续努力呀。

   在艰苦卓绝的研究之后,我发现其实与USB相关的控制码都定义在DDK的usbioctl.h头文件中。而对这些控制码的描述可以在在线的MSDN中查到,其路径是:

    http://msdn.microsoft.com/en-us/library/aa476234.aspx

    MSDNLibrary-->Win32 and COMDevelopment-->Windows DriverKit-->Device and DriverTechnologies-->Buses andPorts-->Buses-->Buses-->USB-->Reference-->I/ORequests for USB Client Drivers

   其附近的一些目录也介绍了USB开发的一些信息。不过内容都是英文的,对于看不懂英文的程序员建议离开这个行业。

   在看其中的控制码的同时,有一个技巧,例如IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION控制码,打开相应的网页,在网页的下面有个结构:USB_DESCRIPTOR_REQUEST,也就是说IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION控制码是为了得到USB_DESCRIPTOR_REQUEST结构参数的。这样我们就可以把控制码和我们要做的工作对应起来了。

 

   我讨厌华而不实的,整天玩空对空的人。能力和知识是不完全相同的概念。我会把一些学习的东西与大家分享。大家共同进步吧。

转:http://blog.sina.com.cn/s/blog_4b650d650100dbbm.html

0 0