DeviceIoControl

【勇芳软件工作室】汉化HomePreviousNext

DeviceIoControl功能将控制代码直接发送到指定的设备驱动程序,使相应的设备执行指定的操作。

BOOL DeviceIoControl(

HANDLE 【hDevice】,//处理感兴趣的设备
DWORD 【dwIoControlCode】,//控制要执行的操作代码
LPVOID 【lpInBuffer】,//指向缓冲区的指针,以提供输入数据
DWORD 【nInBufferSize】,//输入缓冲区的大小
LPVOID 【lpOutBuffer】,//指向缓冲区的指针以接收输出数据
DWORD 【nOutBufferSize】,//输出缓冲区的大小
LPDWORD 【lpBytesReturned】,//指向变量的指针,以接收输出字节数
LPOVERLAPPED 【lpOverlapped的】//指向异步操作的重叠结构的指针
); 

参数

【hDevice】

处理要执行操作的设备。调用CreateFile函数获取设备句柄。

【dwIoControlCode】

指定操作的控制代码。该值标识要执行的具体操作和要执行操作的设备类型。定义了以下值:

含义
FSCTL_DISMOUNT_VOLUME卸下一个卷。
FSCTL_GET_COMPRESSION获取文件或目录的压缩状态
FSCTL_LOCK_VOLUME锁定音量。
FSCTL_READ_COMPRESSION留作将来使用。
FSCTL_SET_COMPRESSION设置文件或目录的压缩状态。
FSCTL_UNLOCK_VOLUME解锁一个卷。
FSCTL_WRITE_COMPRESSION留作将来使用。
IOCTL_DISK_CHECK_VERIFY已过时。使用IOCTL_STORAGE_CHECK_VERIFY
IOCTL_DISK_EJECT_MEDIA已过时。使用IOCTL_STORAGE_EJECT_MEDIA
IOCTL_DISK_FORMAT_TRACKS格式化一组连续的磁道。
IOCTL_DISK_GET_DRIVE_GEOMETRY获取物理磁盘几何信息。
IOCTL_DISK_GET_DRIVE_LAYOUT提供有关磁盘上每个分区的信息。
IOCTL_DISK_GET_MEDIA_TYPES已过时。使用IOCTL_STORAGE_GET_MEDIA_TYPES
IOCTL_DISK_GET_PARTITION_INFO获取磁盘分区信息。
IOCTL_DISK_LOAD_MEDIA已过时。使用IOCTL_STORAGE_LOAD_MEDIA
IOCTL_DISK_MEDIA_REMOVAL已过时。使用IOCTL_STORAGE_MEDIA_REMOVAL
IOCTL_DISK_PERFORMANCE提供磁盘性能信息。
IOCTL_DISK_REASSIGN_BLOCKS将磁盘块映射到备用池。
IOCTL_DISK_SET_DRIVE_LAYOUT分区磁盘
IOCTL_DISK_SET_PARTITION_INFO设置磁盘分区类型。
IOCTL_DISK_VERIFY执行磁盘范围的逻辑格式。
IOCTL_SERIAL_LSRMST_INSERT启用或禁用将线路和调制解调器状态数据放置到数据流中。
IOCTL_STORAGE_CHECK_VERIFY检查可移动媒体设备中的更改。
IOCTL_STORAGE_EJECT_MEDIA从SCSI设备弹出媒体。
IOCTL_STORAGE_GET_MEDIA_TYPES获取有关媒体支持的信息。
IOCTL_STORAGE_LOAD_MEDIA将媒体载入设备。
IOCTL_STORAGE_MEDIA_REMOVAL启用或禁用媒体弹出机制。

有关每个控制代码的更多详细信息,请参阅其主题。具体来说,每个主题提供有关【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