DeviceIoControl()是主机应用程序与设备驱动进行通讯的函数,在MSDN中该函数的定义为:
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
);
其中:
lpInBuffer ,应用程序传递给驱动程序的数据缓冲区地址。
nInBufferSize ,应用程序传递给驱动程序的数据缓冲区大小,字节数。
lpOutBuffer ,驱动程序返回给应用程序的数据缓冲区地址。
nOutBufferSize ,驱动程序返回给应用程序的数据缓冲区大小,字节数
而在与usb设备进行数据传输时,使用该函数的含义为:
DWORD ioctl_val=IOCTL_EZUSB_BULK_READ; //设置从设备中读数据
Bresult=DeviceIoControl ( hDevice , ioctl_val , //从设备读数据
&bulkControl , //端点号
sizeof ( BULK_TRANSFER_CONTROL), //传入参数的大小
buffer , //读数据的缓冲区
length , //读数据的长度
(unsigned long *)&nBytes , //驱动返回的数据的实际长度
NULL);
我所不理解的是为什么在usb传输中,应用程序给驱动程序的数据缓冲区地址和大小怎么变成了端点号和传入参数大小了呢? |