DeviceIoControl功能将控制代码直接发送到指定的设备驱动程序,使相应的设备执行指定的操作。
BOOL DeviceIoControl(
HANDLE 【hDevice】, | //处理感兴趣的设备 |
DWORD 【dwIoControlCode】, | //控制要执行的操作代码 |
LPVOID 【lpInBuffer】, | //指向缓冲区的指针,以提供输入数据 |
DWORD 【nInBufferSize】, | //输入缓冲区的大小 |
LPVOID 【lpOutBuffer】, | //指向缓冲区的指针以接收输出数据 |
DWORD 【nOutBufferSize】, | //输出缓冲区的大小 |
LPDWORD 【lpBytesReturned】, | //指向变量的指针,以接收输出字节数 |
LPOVERLAPPED 【lpOverlapped的】 | //指向异步操作的重叠结构的指针 |
); |
参数
【hDevice】
处理要执行操作的设备。调用CreateFile函数获取设备句柄。
【dwIoControlCode】
指定操作的控制代码。该值标识要执行的具体操作和要执行操作的设备类型。定义了以下值:
有关每个控制代码的更多详细信息,请参阅其主题。具体来说,每个主题提供有关【lpInBuffer】,【nInBufferSize】,【lpOutBuffer】,【nOutBufferSize】和【lpBytesReturned】参数使用情况的详细信息。
【lpInBuffer】
指向包含执行操作所需数据的缓冲区。
如果【dwIoControlCode】参数指定不需要输入数据的操作,则此参数可以为NULL。
【nInBufferSize】
指定【lpInBuffer】指向的缓冲区的大小(以字节为单位)。
【lpOutBuffer】
指向接收操作输出数据的缓冲区。
如果【dwIoControlCode】参数指定不产生输出数据的操作,则此参数可以为NULL。
【nOutBufferSize】
指定【lpOutBuffer】指向的缓冲区的大小(以字节为单位)。
【lpBytesReturned】
指向由【lpOutBuffer】指向的缓冲区中存储的数据的大小(以字节为单位)的变量的指针。
如果【lpOverlapped的】为NULL,则【lpBytesReturned】不能为NULL。即使操作不产生输出数据,【lpOutBuffer】也可以为NULL,DeviceIoControl函数使用【lpBytesReturned】指向的变量。在这样的操作之后,变量的值是没有意义的。
如果【lpOverlapped的】不为NULL,则【lpBytesReturned】可以为NULL。如果这是一个重叠操作,您可以通过调用GetOverlappedResult获取返回的字节数。如果【hDevice】与I / O完成端口相关联,则可以通过调用GetQueuedCompletionStatus获取返回的字节数。
【lpOverlapped的】
指向OVERLAPPED结构。
如果使用FILE_FLAG_OVERLAPPED标志打开【hDevice】,则此参数必须指向一个有效的OVERLAPPED结构。在这种情况下,DeviceIoControl作为重叠(异步)操作执行。如果使用FILE_FLAG_OVERLAPPED打开设备,并且【lpOverlapped的】为NULL,则该函数以不可预测的方式失败。
如果未指定FILE_FLAG_OVERLAPPED标志而打开【hDevice】,则此参数将被忽略,并且DeviceIoControl函数在操作完成或发生错误之前不会返回。
返回值
如果函数成功,返回值不为零。
如果函数失败,返回值为零。要获取扩展错误信息,请调用GetLastError.
备注
如果使用FILE_FLAG_OVERLAPPED打开【hDevice】,并且【lpOverlapped的】参数指向OVERLAPPED结构,DeviceIoControl将作为重叠(异步)操作执行。在这种情况下,OVERLAPPED结构必须包含通过调用CreateEvent函数创建的手动重置事件对象的句柄。有关手动复位事件对象的更多信息,请参阅同步.
如果重叠操作无法立即完成,则函数返回FALSE,GetLastError??返回ERROR_IO_PENDING,表示操作在后台执行。当这种情况发生时,操作系统将OVERLAPPED结构中的事件对象设置为DeviceIoControl返回之前的非信号状态。当操作完成后,系统将事件对象设置为信号状态。调用线程可以使用任何等待函数等待事件对象发信号,然后使用GetOverlappedResult函数来确定操作的结果。GetOverlappedResult功能报告操作的成功或失败以及【lpOutBuffer】缓冲区中返回的字节数。
也可以看看
CreateEvent, CreateFile, GetOverlappedResult, GetQueuedCompletionStatus, OVERLAPPED