DeviceIoControl
The DeviceIoControl
function sends a control code directly to a specified device driver, causing
the corresponding device to perform the specified operation.
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 of input
buffer |
LPVOID lpOutBuffer, |
// pointer to
buffer to receive output data |
DWORD nOutBufferSize, |
// size of output
buffer |
LPDWORD lpBytesReturned, |
// pointer to
variable to receive output byte count |
LPOVERLAPPED lpOverlapped |
// pointer to
overlapped structure for asynchronous operation |
); |
|
Parameters
hDevice
Handle to the
device that is to perform the operation. Call the CreateFile
dwIoControlCode
Specifies the
control code for the operation. This value identifies the specific operation to
be performed and the type of device on which the operation is to be performed.
The following values are defined:
Value |
Meaning |
FSCTL_DISMOUNT_VOLUME |
Dismounts a
volume. |
FSCTL_GET_COMPRESSION |
Obtains the
compression state of a file or directory |
FSCTL_LOCK_VOLUME |
Locks a
volume. |
FSCTL_READ_COMPRESSION |
Reserved
for future use. |
FSCTL_SET_COMPRESSION |
Sets the
compression state of a file or directory. |
FSCTL_UNLOCK_VOLUME |
Unlocks a
volume. |
FSCTL_WRITE_COMPRESSION |
Reserved
for future use. |
IOCTL_DISK_CHECK_VERIFY |
Obsolete.
Use IOCTL_STORAGE_CHECK_VERIFY |
IOCTL_DISK_EJECT_MEDIA |
Obsolete.
Use IOCTL_STORAGE_EJECT_MEDIA |
IOCTL_DISK_FORMAT_TRACKS |
Formats a
contiguous set of disk tracks. |
IOCTL_DISK_GET_DRIVE_GEOMETRY |
Obtains
information on the physical disk s geometry. |
IOCTL_DISK_GET_DRIVE_LAYOUT |
Provides
information about each partition on a disk. |
IOCTL_DISK_GET_MEDIA_TYPES |
Obsolete.
Use IOCTL_STORAGE_GET_MEDIA_TYPES |
IOCTL_DISK_GET_PARTITION_INFO |
Obtains
disk partition information. |
IOCTL_DISK_LOAD_MEDIA |
Obsolete.
Use IOCTL_STORAGE_LOAD_MEDIA |
IOCTL_DISK_MEDIA_REMOVAL |
Obsolete.
Use IOCTL_STORAGE_MEDIA_REMOVAL |
IOCTL_DISK_PERFORMANCE |
Provides
disk performance information. |
IOCTL_DISK_REASSIGN_BLOCKS |
Maps disk
blocks to spare-block pool. |
IOCTL_DISK_SET_DRIVE_LAYOUT |
Partitions
a disk. |
IOCTL_DISK_SET_PARTITION_INFO |
Sets the
disk partition type. |
IOCTL_DISK_VERIFY |
Performs
logical format of a disk extent. |
IOCTL_SERIAL_LSRMST_INSERT |
Enables or
disables placement of a line and modem status data into the data stream. |
IOCTL_STORAGE_CHECK_VERIFY |
Checks for
change in a removable-media device. |
IOCTL_STORAGE_EJECT_MEDIA |
Ejects
media from a SCSI device. |
IOCTL_STORAGE_GET_MEDIA_TYPES |
Obtains information
about media support. |
IOCTL_STORAGE_LOAD_MEDIA |
Loads media
into a device. |
IOCTL_STORAGE_MEDIA_REMOVAL |
Enables or
disables the media eject mechanism. |
For more
detailed information on each control code, see its topic. In particular, each
topic provides details on the usage of the lpInBuffer, nInBufferSize,
lpOutBuffer, nOutBufferSize, and lpBytesReturned
parameters.
lpInBuffer
Pointer to a
buffer that contains the data required to perform the operation.
This
parameter can be NULL if the dwIoControlCode parameter specifies an
operation that does not require input data.
nInBufferSize
Specifies the
size, in bytes, of the buffer pointed to by lpInBuffer.
lpOutBuffer
Pointer to a
buffer that receives the operation s output data.
This parameter
can be NULL if the dwIoControlCode parameter specifies an operation that
does not produce output data.
nOutBufferSize
Specifies the
size, in bytes, of the buffer pointed to by lpOutBuffer.
lpBytesReturned
Pointer to a
variable that receives the size, in bytes, of the data stored into the buffer
pointed to by lpOutBuffer.
If lpOverlapped
is NULL, lpBytesReturned cannot be NULL. Even when an operation produces
no output data, and lpOutBuffer can be NULL, the DeviceIoControl
function makes use of the variable pointed to by lpBytesReturned. After
such an operation, the value of the variable is without meaning.
If lpOverlapped
is not NULL, lpBytesReturned can be NULL. If this is an overlapped
operation, you can get the number of bytes returned by calling GetOverlappedResultH734VJ.
lpOverlapped
Pointer to an
OVERLAPPED
If hDevice
was opened with the FILE_FLAG_OVERLAPPED flag, this parameter must point to a
valid OVERLAPPED structure. In this case, DeviceIoControl is
performed as an overlapped (asynchronous) operation. If the device was opened
with FILE_FLAG_OVERLAPPED and lpOverlapped is NULL, the function fails
in unpredictable ways.
If hDevice
was opened without specifying the FILE_FLAG_OVERLAPPED flag, this parameter is
ignored and the DeviceIoControl function does not return until the
operation has been completed, or an error occurs.
Return Values
If the
function succeeds, the return value is nonzero.
If the
function fails, the return value is zero. To get extended error information,
call GetLastError
Remarks
If hDevice
was opened with FILE_FLAG_OVERLAPPED and the lpOverlapped parameter
points to an OVERLAPPED structure, DeviceIoControl is performed
as an overlapped (asynchronous) operation. In this case, the OVERLAPPED
structure must contain a handle to a manual-reset event object created by a
call to the CreateEvent function. For more information on manual-reset
event objects, see Synchronization
If the
overlapped operation cannot be completed immediately, the function returns
FALSE, and GetLastError returns ERROR_IO_PENDING, indicating that the
operation is executing in the background. When this happens, the operating
system sets the event object in the OVERLAPPED structure to the
nonsignaled state before DeviceIoControl returns. The system then sets
the event object to the signaled state when the operation has been completed.
The calling thread can use any of the wait functions to wait for the event
object to be signaled, and then use the GetOverlappedResult function to
determine the results of the operation. The GetOverlappedResult function
reports the success or failure of the operation and the number of bytes returned
in the lpOutBuffer buffer.
See Also