https://blog.csdn.net/li_wen01/article/details/80137566
前言:
最近需要對Windows中的設備進行編程操作,其中涉及到非常重要的函數DeviceIoControl,在使用的時候也比較的復雜,國內這一塊中文資料比較少,在學習之余順便將其翻譯出來,以供參考,如有錯誤,歡迎指正。lcb0281@163點com
MSDN原文地址:DeviceIoControl function
DeviceIoControl 將控制代碼直接發送到指定的設備驅動程序,使相應的設備執行相應的操作。
句法:
-
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
-
);
參數:
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
Wen Lee
2018.04.28