1. 程式人生 > >DeviceIoControl 函式詳細解析

DeviceIoControl 函式詳細解析

前言:

    最近需要對Windows中的裝置進行程式設計操作,其中涉及到非常重要的函式DeviceIoControl,在使用的時候也比較的複雜,國內這一塊中文資料比較少,在學習之餘順便將其翻譯出來,以供參考,如有錯誤,歡迎指正。[email protected]點com 

    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]
    操作的控制程式碼,該值標識要執行的特定操作以及執行該操作的裝置的型別,有關控制程式碼的列表,請參考備註。每個控制程式碼的文件都提供了lpInBuffernInBufferSizelpOutBuffernOutBufferSize引數的使用細節。
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,錯誤程式碼234lpBytesReturned指示接收到的資料量。您的應用程式應該再次使用相同的操作呼叫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_READFILE_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


其他連結:

                                                                                                                          Wen Lee

                                                                                                                         2018.04.28

相關推薦

DeviceIoControl 函式詳細解析

前言:    最近需要對Windows中的裝置進行程式設計操作,其中涉及到非常重要的函式DeviceIoControl,在使用的時候也比較的複雜,國內這一塊中文資料比較少,在學習之餘順便將其翻譯出來,以供參考,如有錯誤,歡迎指正。[email protected]點

《機器學習實戰》(第二章)中函式詳細解析

本文是針對《機器學習實戰》內函式的解析。並以頁數呈現。 P19:numpy.tile(A,rep)函式 當rep為數字時,生成一個一維重複rep次的list。 當rep為元組(m,n)時,生成一個m行並且每行重複n次的矩陣。 import numpy as np a1

thinkphp U方法 U函式詳細解析

U方法用於完成對URL地址的組裝,特點在於可以自動根據當前的URL模式和設定生成對應的URL地址,格式為:U('地址','引數','偽靜態','是否跳轉','顯示域名'); 在模板中使用U方法而不是固定寫死URL地址的好處在於,一旦你的環境變化或者引數設定改變,你不需要更改模

CreateFile 函式詳細解析

前言:    在Windows程式設計中CreateFile函式是用得非常多的,由於它的引數比較多比較複雜,在使用的時候容易出現問題,在學習了MSDN的官方文件後打算將其原文翻譯出來,以供參考,如有錯誤,歡迎指正:[email protected]點comCreat

C/C++——strcpy函式的 幾種 實現 和 詳細 解析

C/C++——strcpy函式的實現 和解析 題目:      已知strcpy函式的原型是:         &nb

詳細解析PHP常用的加密函式,crypt()、md5()和sha1()

資料加密的原理就是對原來明文的檔案或資料按照某種演算法進行處理,使其成為不可讀的一段程式碼,通常稱為“密文”。 一、crypt() crypt()函式可以完成單向加密功能,語法是: string crypt(string str[,string salt]) 其中,str是需要加密

select函式詳細用法解析

1.表頭檔案 #include #include #include 2.函式原型 int select(int n,fd_set * readfds,fd_set * writefds,fd_set * exceptfds,struct timeval * timeo

C++中函式模板的用法詳細解析

一、函式模板的產生原因: 函式的過載可以實現一個函式名多用,將功能相同或者類似函式用同一個名來定義。這樣可以簡化函式的呼叫形式,但是程式中,仍然需要分別定義每一個函式。那麼有什麼辦法可以讓我們少寫

PHP取整函式:ceil,floor,round,intval的區別詳細解析

以下是對PHP中的取整函式:ceil,floor,round,intval的區別進行了詳細的介紹,需要的朋友可以過來參考下 我們經常用到的PHP取整函式,主要是:ceil,floor,round,intval。 ceil -- 進一法取整 說明 float ceil

select函式詳細用法解析(轉自:zhenhuaqin)

1.表頭檔案 #include <unistd.h> #include <stdlib.h> #include <fcntl.h> #include <sys/select.h> 2.函式原型 int s

this 指向詳細解析(箭頭函式

箭頭函式有幾個使用注意點。(1)函式體內的this物件,就是定義時所在的物件,而不是使用時所在的物件。(2)不可以當作建構函式,也就是說,不可以使用new命令,否則會丟擲一個錯誤。(3)不可以使用arguments物件,該物件在函式體內不存在。如果要用,可以用Rest引數代替。(4)不可以使用yield命令,

redis配置詳細解析

keep turn name sort out 配置文件 trac lte eid # redis 配置文件示例 # 當你需要為某個配置項指定內存大小的時候,必須要帶上單位, # 通常的格式就是 1k 5gb 4m 等: # # 1k => 1000 bytes

CDN原理詳細解析

cdn dns負載均衡 文件分發網絡 1.用戶向瀏覽器輸入www.web.com這個域名,瀏覽器第一次發現本地沒有dns緩存,則向網站的DNS服務器請求;2.網站的DNS域名解析器設置了CNAME,指向了www.web.51cdn.com,請求指向了CDN網絡中的智能DNS負載均衡系統;3.智能D

2017年軟考各科最新真題詳細解析資料集錦

軟考真題 軟考答案 軟考真題答案 軟考真題資料 軟考真題視頻 作為51CTO學院的軟考培訓講師,本著對廣大學員負責的態度,在每年同學們參加完軟考考試,我都會盡早的給大家發布各科的真題詳細解析資料。一方面是為了參加軟考考試的同學對自己考試情況做一個準確評估;另一方面是為未來參加軟考考試的學員

redis.conf配置詳細解析

tip soft notify cross following 模板 guarantee use fast # redis 配置文件示例 # 當你需要為某個配置項指定內存大小的時候,必須要帶上單位, # 通常的格式就是 1k 5gb 4m 等醬紫: # # 1k =&

前端【響應式】開發詳細解析

響應式設計 針對 標簽 ipad rem img ons 微信公眾 dev 一、響應式設計需要解決的問題是什麽? 針對目前大家常見的固定布局、自適應布局都是一種反應遲鈍的web設計,當Web頁面需要在各種顯示屏顯示時,他們就顯得力不從心了。因此,我們就需要相應設計。 優勢:

vue-cli中的build.js配置文件詳細解析

刪除 .json directory 內置 tostring file 環境配置 輸出 pin 轉載自:https://www.cnblogs.com/ye-hcj/p/7096341.html這是vue-cli腳手架工具的生產環境配置入口 package.json中的"b

find命令的詳細解析

結果 查找 mod 選項 groupdel sbin 記得 分享 提前 1.find功能 實時查找工具,通過遍歷指定路徑完成文件查找 特點:查找速度略慢 (因為是實時查找,需要經歷每個路徑才能完成查找)???精確查找???可能只搜索用戶具備讀取和執行權限的目錄 (沒有權限

Linux內存使用方法詳細解析

滿足 trac 不可 drs color 很遺憾 地址空間 多少 root 我是一名程序員,那麽我在這裏以一個程序員的角度來講解Linux內存的使用。 一提到內存管理,我們頭腦中閃出的兩個概念,就是虛擬內存,與物理內存。這兩個概念主要來自於linux內核的支持。 Linu

intel漏洞詳細解析

ops OS moved arm 間接 有效 clas 代碼 ati 1. CVE-2017-5754(Meltdown):惡意數據緩存加載即采用特定指令,探測內核訪問不到的內存內容。通過本地運行特定程序的方式讀取系統運行的CPU緩存,獲得當前運行系統緩存的所有信息 比喻: