zoukankan      html  css  js  c++  java
  • DeviceIoControl() 介绍和范例(摘自MSDN2008SP1)

    DeviceIoControl Function

    介绍

    Sends a control code directly to a specified device driver, causing the corresponding device to perform the corresponding operation. 

    Syntax

    BOOL WINAPI DeviceIoControl(
      __in         HANDLE hDevice,
      __in         DWORD dwIoControlCode,
      __in_opt     LPVOID lpInBuffer,
      __in         DWORD nInBufferSize,
      __out_opt    LPVOID lpOutBuffer,
      __in         DWORD nOutBufferSize,
      __out_opt    LPDWORD lpBytesReturned,
      __inout_opt  LPOVERLAPPED lpOverlapped
    );

    Parameters

    hDevice

    A handle to the device on which the operation is to be performed. The device is typically a volume, directory, file, or stream. To retrieve a device handle, use the CreateFile function. For more information, see Remarks.

    dwIoControlCode

    The control code for the operation. This value identifies the specific operation to be performed and the type of device on which to perform it.

    For a list of the control codes, see Remarks. The documentation for each control code provides usage details for the lpInBuffer, nInBufferSize, lpOutBuffer, and nOutBufferSize parameters.

    lpInBuffer

    A pointer to the input buffer that contains the data required to perform the operation. The format of this data depends on the value of the dwIoControlCode parameter.

    This parameter can be NULL if dwIoControlCode specifies an operation that does not require input data.

    nInBufferSize

    The size of the input buffer, in bytes.

    lpOutBuffer

    A pointer to the output buffer that is to receive the data returned by the operation. The format of this data depends on the value of the dwIoControlCode parameter.

    This parameter can be NULL if dwIoControlCode specifies an operation that does not return data.

    nOutBufferSize

    The size of the output buffer, in bytes.

    lpBytesReturned

    A pointer to a variable that receives the size of the data stored in the output buffer, in bytes.

    If the output buffer is too small to receive any data, the call fails, GetLastError returns ERROR_INSUFFICIENT_BUFFER, and lpBytesReturned is zero.

    If the output buffer is too small to hold all of the data but can hold some entries, some drivers will return as much data as fits. In this case, the call fails, GetLastError returns ERROR_MORE_DATA, and lpBytesReturned indicates the amount of data received. Your application should call DeviceIoControl again with the same operation, specifying a new starting point.

    If lpOverlapped is NULL, lpBytesReturned cannot be NULL. Even when an operation returns no output data and lpOutBuffer is NULL, DeviceIoControl makes use of lpBytesReturned. After such an operation, the value of lpBytesReturned is meaningless.

    If lpOverlapped is not NULL, lpBytesReturned can be NULL. If this parameter is not NULL and the operation returns data, lpBytesReturned is meaningless until the overlapped operation has completed. To retrieve the number of bytes returned, call GetOverlappedResult. If hDevice is associated with an I/O completion port, you can retrieve the number of bytes returned by calling GetQueuedCompletionStatus.

    lpOverlapped   //360百科的相关解释:http://baike.so.com/doc/6842208.html

    A pointer to an OVERLAPPED structure.

    If hDevice was opened without specifying FILE_FLAG_OVERLAPPED, lpOverlapped is ignored.

    If hDevice was opened with the FILE_FLAG_OVERLAPPED flag, the operation is performed as an overlapped (asynchronous) operation. In this case, lpOverlapped must point to a valid OVERLAPPED structure that contains a handle to an event object. Otherwise, the function fails in unpredictable ways.

    For overlapped operations, DeviceIoControl returns immediately, and the event object is signaled when the operation has been completed. Otherwise, the function does not return until the operation has been completed or an error occurs.

    Return Value

    If the operation completes successfully, the return value is nonzero.

    If the operation fails or is pending, the return value is zero. To get extended error information, call GetLastError.

    范例

    Calling DeviceIoControl

    An application can use the DeviceIoControl function to perform direct input and output operations on, or retrieve information about, a floppy disk drive, hard disk drive, tape drive, or CD-ROM drive. For a list of standard control codes included in the SDK documentation, see the Remarks section of DeviceIoControl.

    The following example demonstrates how to retrieve information about the first physical drive in the system. It uses the CreateFile function to retrieve the device handle to the first physical drive, and then uses DeviceIoControl with the IOCTL_DISK_GET_DRIVE_GEOMETRY control code to fill a DISK_GEOMETRY structure with information about the drive.

    /* The code of interest is in the subroutine GetDriveGeometry. The 
       code in main shows how to interpret the results of the call. */
    
    #include <windows.h>
    #include <winioctl.h>
    #include <stdio.h>
    
    BOOL GetDriveGeometry(DISK_GEOMETRY *pdg)
    {
      HANDLE hDevice;               // handle to the drive to be examined 
      BOOL bResult;                 // results flag
      DWORD junk;                   // discard results
    
      hDevice = CreateFile(TEXT("\\.\PhysicalDrive0"),  // drive 
                        0,                // no access to the drive
                        FILE_SHARE_READ | // share mode
                        FILE_SHARE_WRITE, 
                        NULL,             // default security attributes
                        OPEN_EXISTING,    // disposition
                        0,                // file attributes
                        NULL);            // do not copy file attributes
    
      if (hDevice == INVALID_HANDLE_VALUE) // cannot open the drive
      {
        return (FALSE);
      }
    
      bResult = DeviceIoControl(hDevice,  // device to be queried
          IOCTL_DISK_GET_DRIVE_GEOMETRY,  // operation to perform
                                 NULL, 0, // no input buffer
                                pdg, sizeof(*pdg),     // output buffer
                                &junk,                 // # bytes returned
                                (LPOVERLAPPED) NULL);  // synchronous I/O
    
      CloseHandle(hDevice);
    
      return (bResult);
    }
    
    int main(int argc, char *argv[])
    {
      DISK_GEOMETRY pdg;            // disk drive geometry structure
      BOOL bResult;                 // generic results flag
      ULONGLONG DiskSize;           // size of the drive, in bytes
    
      bResult = GetDriveGeometry (&pdg);
    
      if (bResult) 
      {
        printf("Cylinders = %I64d
    ", pdg.Cylinders);
        printf("Tracks/cylinder = %ld
    ", (ULONG) pdg.TracksPerCylinder);
        printf("Sectors/track = %ld
    ", (ULONG) pdg.SectorsPerTrack);
        printf("Bytes/sector = %ld
    ", (ULONG) pdg.BytesPerSector);
    
        DiskSize = pdg.Cylinders.QuadPart * (ULONG)pdg.TracksPerCylinder *
          (ULONG)pdg.SectorsPerTrack * (ULONG)pdg.BytesPerSector;
        printf("Disk size = %I64d (Bytes) = %I64d (Gb)
    ", DiskSize,
               DiskSize / (1024 * 1024 * 1024));
      } 
      else 
      {
        printf ("GetDriveGeometry failed. Error %ld.
    ", GetLastError ());
      }
    
      return ((int)bResult);
    }
  • 相关阅读:
    Java8新特性简介
    责任链模式
    Bean的生命周期
    APP中https证书有效性验证引发安全问题(例Fiddler可抓https包)
    程序员成长指南
    Go 代码性能优化小技巧
    Go slice 扩容机制分析
    一次 Go 程序 out of memory 排查及反思
    curl 常用操作总结
    Go benchmark 详解
  • 原文地址:https://www.cnblogs.com/sunmaoduo/p/3923844.html
Copyright © 2011-2022 走看看