Subject: Re: Reading physical disks.
From: "Nirmal Prasad" <[email-masked]>
To: <[email-masked]>
Cc: <[email-masked]>
Date: Mon, 22 Mar 1999 10:38:17 -0500

>> Pls. refer documentation of DevIoControl(..)  
>Coud you please point me where can I find the documentation about this API.I am 
>quite a newbie as to Windows programming.
hi,

u can find info about the api in SDK documentation , if u have msdev u can look up that api call and it lists all the control parameters. but anyway i am sending u the information. I havent tried doing any low-level device specific stuff so i cannot send u any example (sorry about that) :-

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
);
 
Parameters
    hDevice 
    Handle to the device that is to perform the operation. Call the CreateFile function to obtain a device handle. 
    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_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. 

    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 
    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 
    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 GetOverlappedResult. If hDevice is associated with an I/O completion port, you can get the number of bytes returned by calling GetQueuedCompletionStatus. 

    lpOverlapped 
    Pointer to an OVERLAPPED structure. 
    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. 

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.

QuickInfo
  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.

hope this will be of some help to u

Regards 

Nirmal Prasad R.