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, 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
);
Value | Meaning |
---|---|
FSCTL_ALLOW_EXTENDED_DASD_IO | Signals the file system driver not to perform any I/O boundary checks on partition read or write calls. Instead, boundary checks are performed by the device driver. |
FSCTL_DELETE_REPARSE_POINT | Deletes a reparse point for a file or directory. |
FSCTL_DISMOUNT_VOLUME | Dismounts a volume. |
FSCTL_ENABLE_UPGRADE | Enables or disables upgrading an NTFS volume to NTFS version 5. |
FSCTL_GET_COMPRESSION | Obtains the compression state of a file or directory |
FSCTL_GET_HFS_INFORMATION | Returns Macintosh Finder information about the file associated with the input handle. |
FSCTL_GET_REPARSE_POINT | Returns reparse point data for a file or directory. |
FSCTL_LOCK_VOLUME | Locks a volume. |
FSCTL_QUERY_ALLOCATED_RANGES | Scans a file for ranges of the file for which disk space is allocated. |
FSCTL_QUERY_FAT_BPB | Returns the first 36 bytes of a FAT16 or FAT12 volume. |
FSCTL_READ_COMPRESSION | Reserved for future use. |
FSCTL_SET_COMPRESSION | Sets the compression state of a file or directory. |
FSCTL_SET_REPARSE_POINT | Sets a reparse point on a file or directory. |
FSCTL_SET_SPARSE | Marks a file as a sparse file. |
FSCTL_SET_ZERO_DATA | Sets a range of a files bytes to zeroes. |
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.
This parameter can be NULL if the dwIoControlCode parameter specifies an operation that does not require input data.
This parameter can be NULL if the dwIoControlCode parameter specifies an operation that does not produce output data.
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 GetOverlappedResult. If hDevice is associated with an I/O completion port, you can get the number of bytes returned by calling GetQueuedCompletionStatus.
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.
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.
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.
Windows CE: No specific values are defined for the dwIoControlCode parameter. However, the writer of a custom device driver can define IOCTL_XXXX control codes, per the CTL_CODE macro. These control codes can then be advertised, and an application can use these control codes with DeviceIoControl to perform the driver-specific functions.
The lpOverlapped parameter is ignored and should be NULL.
Windows NT: Requires version 3.1 or later.
Windows: Requires Windows 95 or later.
Windows CE: Requires version 1.0 or later.
Header: Declared in winbase.h.
Import Library: Use kernel32.lib.
Device Input and Output Overview, Device Input and Output Functions, CreateEvent, CreateFile, GetOverlappedResult, GetQueuedCompletionStatus, OVERLAPPED