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

CreateFile 函式詳細解析

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

CreateFile 
    建立或開啟檔案或I/O裝置。常用的I/O裝置有:檔案,檔案流,目錄,物理磁碟,卷,控制檯緩衝區,磁帶驅動器,通訊資源,郵筒和管道。該函式返回一個控制代碼,該控制代碼可用於根據檔案或裝置以及指定的標誌和屬性訪問檔案或裝置以獲取各種型別的I/O。
    要將此操作作為事務操作執行,這會導致可用於事務I / O的控制代碼,請使用CreateFileTransacted函式。

句法:

HANDLE WINAPI CreateFile(
  _In_     LPCTSTR               lpFileName,
  _In_     DWORD                 dwDesiredAccess,
  _In_     DWORD                 dwShareMode,
  _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes,
  _In_     DWORD                 dwCreationDisposition,
  _In_     DWORD                 dwFlagsAndAttributes,
  _In_opt_ HANDLE                hTemplateFile
);
引數:

lpFileName [in]

    要建立或開啟的檔案或裝置的名稱。 可以在這個名字中使用正斜槓(/)或反斜槓(\)【注意/是轉義符號】。在該函式的ANSI版本中,該名稱僅限於MAX_PATH字元。要將此限制擴充套件為32,767個寬字元,請呼叫該函式的Unicode版本並將“\\?\”新增到路徑中。更多內容請檢視:Naming Files, Paths, and Namespaces.
    有關特殊裝置名稱的資訊,請參閱:Defining an MS-DOS Device Name.
    要建立檔案流,請指定檔案的名稱,冒號,然後指定流的名稱。 有關更多資訊,請參閱File Streams.
    提示:從Windows 10版本1607開始,針對此函式的unicode版本(CreateFileW),您可以選擇刪除MAX_PATH限制而不預先新增“\\?\”
有關詳細資訊,請參閱命名檔案,路徑和名稱空間的“Naming Files, Paths, and Namespaces ”部分。
dwDesiredAccess [in]
    所請求的檔案或裝置訪問許可權,這可以被概括為讀,寫,兩者或非)。最常用的值是GENERIC_READGENERIC_WRITE或兩者(GENERIC_READ | GENERIC_WRITE)。更多內容檢視;Generic Access Rights, File Security and Access Rights, File Access Rights Constants, and ACCESS_MASK.
    如果此引數為零,則應用程式可以查詢某些元資料(如檔案,目錄或裝置屬性),而不訪問該檔案或裝置,即使GENERIC_READ訪問已被拒絕。
    您無法請求與已開啟控制代碼的開啟請求中的dwShareMode引數指定的共享模式衝突的訪問模式。
    有關更多資訊,請參閱本主題的“備註”部分和Creating and Opening Files.
dwShareMode [in]
    檔案或裝置的請求共享模式,可以讀取,寫入,刪除,全部或全部刪除。對屬性或擴充套件屬性的訪問請求不受此標誌的影響。
    如果此引數為零且CreateFile成功,則檔案或裝置無法共享,並且無法再次開啟,直到檔案或裝置的控制代碼關閉。
    你無法請求與在具有開啟控制代碼的現有請求中指定的訪問模式衝突的共享模式。 CreateFile將失敗,GetLastError函式將返回ERROR_SHARING_VIOLATION。
    要啟用程序在另一程序開啟檔案或裝置時共享檔案或裝置,請使用以下一個或多個值的相容組合。有關此引數與dwDesiredAccess引數的有效組合的更多資訊,請檢視Creating and Opening Files.
提示:每個開啟的控制代碼的共享選項在該控制代碼關閉之前保持有效,而與流程上下文無關。
ValueMeaning
0x00000000 防止其他程序在請求刪除,讀取或寫入訪問時開啟檔案或裝置。

FILE_SHARE_DELETE                               

0x00000004

啟用檔案或裝置共享刪除訪問,否則,如果其他程序請求刪除訪問,則無法開啟該檔案或裝置。如果未指定此標誌,但檔案或裝置已被開啟以進行刪除訪問,則該功能失敗。

注意:除訪問許可權允許刪除和重新命名操作

FILE_SHARE_READ

0x00000001

啟用檔案或裝置共享讀訪問,否則,如果其他程序請求讀取訪問許可權,則無法開啟檔案或裝置。如果未指定此標誌,但檔案或裝置已被開啟以進行讀取訪問,則該功能失敗。

FILE_SHARE_WRITE

0x00000002

啟用檔案或裝置共享寫訪問,否則,如果其他程序請求寫訪問許可權,則無法開啟該檔案或裝置。如果未指定此標誌,但檔案或裝置已開啟以進行寫入訪問或具有寫入訪問的檔案對映,則該功能將失敗。
lpSecurityAttributes [in, optional]
    指向SECURITY_ATTRIBUTES結構的指標,該結構包含兩個獨立但相關的資料成員:一個可選的安全描述符以及一個布林值,該值確定返回的控制代碼是否可以被子程序繼承。
    該引數可以是NULL。
    如果此引數為NULL,則由CreateFile返回的控制代碼不能由應用程式可能建立的任何子程序繼承,並且與返回控制代碼關聯的檔案或裝置將獲得預設安全描述符。
    該結構的lpSecurityDescriptor成員為檔案或裝置指定SECURITY_DESCRIPTOR。如果此成員為NULL,則與返回控制代碼關聯的檔案或裝置將被分配一個預設安全描述符。
    CreateFile在開啟現有檔案或裝置時會忽略lpSecurityDescriptor成員,但會繼續使用bInheritHandle成員。
    該結構的bInheritHandle成員指定是否可以繼承返回的控制代碼。
dwCreationDisposition [in]
    採取存在或不存在的檔案或裝置的操作。
    對於檔案以外的裝置,此引數通常設定為OPEN_EXISTING。

    該引數必須是以下值之一,不能組合:

ValueMeaning

CREATE_ALWAYS

2

始終建立一個新檔案。

如果指定的檔案存在並且是可寫的,則該函式覆蓋檔案,函式成功,並且最後的錯誤程式碼被設定為ERROR_ALREADY_EXISTS(183)。

如果指定的檔案不存在並且是有效的路徑,則會建立一個新檔案,該函式成功,並且最後一個錯誤程式碼被設定為零。

CREATE_NEW
1
只有在不存在的情況下才建立一個新檔案。
如果指定的檔案存在,則該函式失敗,並且最後的錯誤程式碼被設定為ERROR_FILE_EXISTS(80)。
如果指定的檔案不存在並且是可寫位置的有效路徑,則會建立一個新檔案。
OPEN_ALWAYS
4
總是開啟一個檔案。
如果指定的檔案存在,則函式成功並且最後的錯誤程式碼被設定為ERROR_ALREADY_EXISTS(183)。
如果指定的檔案不存在並且是可寫位置的有效路徑,則該函式將建立一個檔案,並將最後一個錯誤程式碼設定為零。
OPEN_EXISTING
3
只有存在檔案或裝置時才打開。
如果指定的檔案或裝置不存在,則該函式將失敗,並且最後一個錯誤程式碼將設定為ERROR_FILE_NOT_FOUND(2)。
TRUNCATE_EXISTING           
5
開啟一個檔案並截斷它,以便它的大小為零位元組,只要它存在。
如果指定的檔案不存在,則該函式失敗,並且最後的錯誤程式碼被設定為ERROR_FILE_NOT_FOUND(2)。
呼叫程序必須開啟GENERIC_WRITE位設定為dwDesiredAccess引數的一部分的檔案。
dwFlagsAndAttributes [in]
    檔案或裝置屬性和標誌FILE_ATTRIBUTE_NORMAL是檔案最常用的預設值。
   此引數可以包含可用檔案屬性的任意組合(FILE_ATTRIBUTE_ *)。 所有其他檔案屬性都會覆蓋FILE_ATTRIBUTE_NORMAL。
    此引數還可以包含用於控制檔案或裝置快取行為,訪問模式和其他特殊用途標誌的標誌組合(FILE_FLAG_ *)。 這些與任何FILE_ATTRIBUTE_ *值結合使用。
    此引數還可以通過指定SECURITY_SQOS_PRESENT標誌來包含安全服務質量(SQOS)資訊。
    當CreateFile開啟現有檔案時,它通常將檔案標誌與現有檔案的檔案屬性組合在一起,並忽略作為dwFlagsAndAttributes的一部分提供的任何檔案屬性。
    官方文件中還有列出很多檔案和裝置屬性和標誌的表格,內容太多不再列出,建議參考原文。
hTemplateFile [in, optional]
    具有GENERIC_READ訪問許可權的模板檔案的有效控制代碼。模板檔案為正在建立的檔案提供檔案屬性和擴充套件屬性。
    該引數可以是NULL。
    開啟現有檔案時,CreateFile將忽略此引數。

    開啟新的加密檔案時,該檔案從其父目錄繼承自主訪問控制列表。

返回值:
    如果函式成功,則返回值是指定檔案,裝置,命名管道或郵件插槽的開啟控制代碼。

    如果該函式失敗,則返回值為INVALID_HANDLE_VALUE。 要獲得擴充套件的錯誤資訊,請呼叫GetLastError。

備註:

    CreateFile最初是專門為檔案互動而開發的,但後來被擴充套件和增強,以包括Windows開發人員可用的大多數其他型別的I / O裝置和機制。本節試圖涵蓋開發人員在不同上下文和不同I / O型別中使用CreateFile時可能遇到的各種問題

......未完,還有


相關推薦

CreateFile 函式詳細解析

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

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

本文是針對《機器學習實戰》內函式的解析。並以頁數呈現。 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地址的好處在於,一旦你的環境變化或者引數設定改變,你不需要更改模

DeviceIoControl 函式詳細解析

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

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緩存,獲得當前運行系統緩存的所有信息 比喻: