对于USB编程,其中一个函数叫做:
BOOL WINAPI DeviceIoControl(
__in HANDLE hDevice,
__in DWORD dwIoControlCode,
__in LPVOID lpInBuffer,
__in DWORD nInBufferSize,
__out LPVOID lpOutBuffer,
__in DWORD nOutBufferSize,
__out LPDWORD lpBytesReturned,
__in LPOVERLAPPED lpOverlapped
);
这个函数在MSDN中有简单的介绍:
The DeviceIoControl function sends a control code directly to a specified device driver, causing the corresponding device to perform the specified operation.
也就是说,这个函数是对指定的设备驱动发送控制码,导致设备响应来完成指定的操作。
首先来说,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 Reqsts for USB Client Drivers
其附近的一些目录也介绍了USB开发的一些信息。
在看其中的控制码的同时,有一个技巧,例如IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION控制码,打开相应的网页,在网页的下面有个结构:USB_DESCRIPTOR_REQST,也就是说 IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION控制码是为了得到 USB_DESCRIPTOR_REQST结构参数的。这样我们就可以把控制码和我们要做的工作对应起来了。