DeviceIoControl 函數詳細解析


https://blog.csdn.net/li_wen01/article/details/80137566

前言:

    最近需要對Windows中的設備進行編程操作,其中涉及到非常重要的函數DeviceIoControl,在使用的時候也比較的復雜,國內這一塊中文資料比較少,在學習之余順便將其翻譯出來,以供參考,如有錯誤,歡迎指正。lcb0281@163點com 

 

MSDN原文地址:DeviceIoControl function 

    DeviceIoControl 將控制代碼直接發送到指定的設備驅動程序,使相應的設備執行相應的操作。

句法:

  1.  
    BOOL WINAPI DeviceIoControl(
  2.  
    _In_ HANDLE hDevice,
  3.  
    _In_ DWORD dwIoControlCode,
  4.  
    _In_opt_ LPVOID lpInBuffer,
  5.  
    _In_ DWORD nInBufferSize,
  6.  
    _Out_opt_ LPVOID lpOutBuffer,
  7.  
    _In_ DWORD nOutBufferSize,
  8.  
    _Out_opt_ LPDWORD lpBytesReturned,
  9.  
    _Inout_opt_ LPOVERLAPPED lpOverlapped
  10.  
    );

參數:

hDevice [in]
    需要執行操作的設備句柄。該設備通常是卷,目錄,文件或流,使用 CreateFile 函數打開獲取設備句柄。具體的見備注
dwIoControlCode [in]
    操作的控制代碼,該值標識要執行的特定操作以及執行該操作的設備的類型,有關控制代碼的列表,請參考備注。每個控制代碼的文檔都提供了lpInBuffer,nInBufferSize,lpOutBuffer和nOutBufferSize參數的使用細節。
lpInBuffer [in, optional]
    (可選)指向輸入緩沖區的指針。這些數據的格式取決於dwIoControlCode參數的值。如果dwIoControlCode指定不需要輸入數據的操作,則此參數可以為NULL。
nInBufferSize [in]
    輸入緩沖區以字節為單位的大小。單位為字節。
lpOutBuffer [out, optional]
    (可選)指向輸出緩沖區的指針。這些數據的格式取決於dwIoControlCode參數的值。如果dwIoControlCode指定不返回數據的操作,則此參數可以為NULL。
nOutBufferSize [in]
    輸出緩沖區以字節為單位的大小。單位為字節。
lpBytesReturned [out, optional]
    (可選)指向一個變量的指針,該變量接收存儲在輸出緩沖區中的數據的大小。如果輸出緩沖區太小,無法接收任何數據,則GetLastError返回ERROR_INSUFFICIENT_BUFFER,錯誤代碼122(0x7a),此時lpBytesReturned是零。
    如果輸出緩沖區太小而無法保存所有數據,但可以保存一些條目,某些驅動程序將返回盡可能多的數據,在這種情況下,調用失敗,GetLastError返回ERROR_MORE_DATA,錯誤代碼234,lpBytesReturned指示接收到的數據量。您的應用程序應該再次使用相同的操作調用DeviceIoControl,指定一個新的起點。
    如果lpOverlapped為NULL,則lpBytesReturned不能為NULL。 即使操作沒有返回輸出數據並且lpOutBuffer為NULL,DeviceIoControl也會使用lpBytesReturned。在這樣的操作之后,lpBytesReturned的值是沒有意義的。
    如果lpOverlapped不為NULL,則lpBytesReturned可以為NULL。 如果此參數不為NULL並且操作返回數據,則在重疊操作完成之前,lpBytesReturned是無意義的。要檢索返回的字節數,請調用GetOverlappedResult,如果hDevice與I / O完成端口相關聯,則可以檢索通過調用GetQueuedCompletionStatus返回的字節數。
lpOverlapped [in, out, optional]
    (可選)指向OVERLAPPED結構的指針,
  如果在未指定FILE_FLAG_OVERLAPPED的情況下打開hDevice,則忽略lpOverlapped。
  如果使用FILE_FLAG_OVERLAPPED標志打開hDevice,則該操作將作為重疊(異步)操作執行。在這種情況下,lpOverlapped必須指向包含事件對象句柄的有效OVERLAPPED結構。 否則,該功能將以不可預知的方式失敗。
    對於重疊操作,DeviceIoControl會立即返回,並在操作完成時通知事件對象。 否則,該功能在操作完成或發生錯誤之前不會返回。


返回值:
    如果操作成功完成,DeviceIoControl將返回一個非零值。

    如果操作失敗或正在等待,則DeviceIoControl返回零。 要獲得擴展的錯誤信息,請調用GetLastError。

 

備注:
    要檢索設備句柄,必須使用設備名稱或與設備關聯的驅動程序名稱來調用CreateFile函數。 要指定設備名稱,請使用以下格式:
  \\.\DeviceName

DeviceIoControl可以接受特定設備的句柄。 對於硬盤來說,可能為以下幾種形式:

  對於物理驅動器x,形式為 \\.\PhysicalDriveX ,編號從0開始,例如:

名稱 含義
\\.\PhysicalDrive0   打開第一個物理驅動器
\\.\PhysicalDrive1 打開第二個物理驅動器

對於邏輯分區(卷),形式為 \\.\X: ,例如:

名稱                          含義
\\.\A:  打開A盤(軟驅)
\\.\C: 打開C盤(磁盤邏輯分區)

    調用CreateFile打開設備驅動程序的句柄時,應指定FILE_SHARE_READ和FILE_SHARE_WRITE訪問標志。但是,當您打開通信資源(如串行端口)時,必須指定獨占訪問權限。 打開設備句柄時使用其他CreateFile參數,如下所示:
     (a)fdwCreate參數必須指定OPEN_EXISTING。
     (b)hTemplateFile參數必須為NULL。

    (c)fdwAttrsAndFlags參數可指定FILE_FLAG_OVERLAPPED,以指示返回的句柄可用於重疊(異步)I / O操作。

 

有關支持的控制代碼列表,請參閱以下主題:
    Communications Control Codes
    Device Management Control Codes
    Directory Management Control Codes
    Disk Management Control Codes
    File Management Control Codes
    Power Management Control Codes
    Volume Management Control Codes


實例:
    有關使用DeviceIoControl的示例,請參閱調用DeviceIoControl


其他鏈接:

    CreateEvent
    CreateFile
    Device Input and Output Control (IOCTL)
    GetOverlappedResult
    GetQueuedCompletionStatus

    OVERLAPPED

 

                                                                                                                          Wen Lee

                                                                                                                         2018.04.28


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM