加载中…
个人资料
Eagle
Eagle
  • 博客等级:
  • 博客积分:0
  • 博客访问:2,105
  • 关注人气:119
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

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

(2009-06-06 20:39:09)
标签:

it

    在对USB研究的过程中,不得已不停的在网上搜索资料,但得到的都是相互抄袭,对用途和方法解释得很少,大概很多人抱着不同的心里吧,有些人想炫耀一下自己的水平,有不想教别人,而有些人自以为懂了,其实至少掌握了几段源码,对里面的东西根本就没有认真的研究。

 

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

BOOL DeviceIoControl(
  HANDLE
hDevice            // handle to device of interest
  DWORD dwIoControlCode      // control code of operation to perform
  LPVOID lpInBuffer         // pointer to buffer to supply input data
  DWORD nInBufferSize       // size, in bytes, of input buffer
  LPVOID lpOutBuffer        // pointer to buffer to receive output data
  DWORD nOutBufferSize      // size, in bytes, of output buffer
  LPDWORD lpBytesReturned   // pointer to variable to receive byte count   LPOVERLAPPED lpOverlapped     // pointer to structure for asynchronous operation
);
这个函数在MSDN中有简单的介绍:

    The DeviceIoControl function sends a control code directly to a specified device driver, causing the corresponding device to perform the specified operation.

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

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

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

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

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

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

    MSDN Library-->Win32 and COM Development-->Windows Driver Kit-->Device and Driver Technologies-->Buses and Ports-->Buses-->Buses-->USB-->Reference-->I/O Requests 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结构参数的。这样我们就可以把控制码和我们要做的工作对应起来了。

 

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

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有