IoCreateFileEx 函式 (ntddk.h)
IoCreateFileEx 例程會建立新的檔案或目錄,或開啟現有的檔案、裝置、目錄或磁碟區,併為呼叫者提供檔案物件的句柄。 檔系統篩選驅動程式 (舊版篩選驅動程式) 會呼叫此例程。
語法
NTSTATUS IoCreateFileEx(
[out] PHANDLE FileHandle,
[in] ACCESS_MASK DesiredAccess,
[in] POBJECT_ATTRIBUTES ObjectAttributes,
[out] PIO_STATUS_BLOCK IoStatusBlock,
[in, optional] PLARGE_INTEGER AllocationSize,
[in] ULONG FileAttributes,
[in] ULONG ShareAccess,
[in] ULONG Disposition,
[in] ULONG CreateOptions,
[in, optional] PVOID EaBuffer,
[in] ULONG EaLength,
[in] CREATE_FILE_TYPE CreateFileType,
[in, optional] PVOID InternalParameters,
[in] ULONG Options,
[in, optional] PIO_DRIVER_CREATE_CONTEXT DriverContext
);
參數
[out] FileHandle
如果呼叫成功,則為接收檔案句柄之變數的指標。 驅動程序必須在不再使用句柄時,立即關閉 ZwClose 句柄。
[in] DesiredAccess
旗標的位掩碼(請參閱 ACCESS_MASK),指定呼叫者對檔案或目錄所需的存取類型。 這個系統定義的 DesiredAccess 旗標會決定下列檔案物件的特定訪問許可權。
DesiredAccess 旗標 | 意義 |
---|---|
刪除 | 檔案可以刪除。 |
FILE_READ_DATA | 您可以從檔案讀取數據。 |
FILE_READ_ATTRIBUTES | FileAttributes 旗標,如下所述,可以讀取。 |
FILE_READ_EA | 可以讀取與檔案相關聯的擴充屬性 (EAS)。 |
READ_CONTROL | 可以讀取與檔案相關聯的訪問控制清單(ACL)和擁有權資訊。 |
FILE_WRITE_DATA | 數據可以寫入檔案。 |
FILE_WRITE_ATTRIBUTES | FileAttributes 旗標可以寫入。 |
FILE_WRITE_EA | 與檔案相關聯的EA可以寫入。 |
FILE_APPEND_DATA | 數據可以附加至檔案。 |
WRITE_DAC | 您可以撰寫與檔案相關聯的任意訪問控制清單(DACL)。 |
WRITE_OWNER | 您可以撰寫與檔案相關聯的擁有權資訊。 |
同步 | 呼叫端可以等候傳回的 FileHandle 設定為 Signaled 狀態,以同步處理 I/O 作業的完成。 如果設定 CreateOptions FILE_SYNCHRONOUS_IO_ALERT 或FILE_SYNCHRONOUS_IO_NONALERT旗標,則必須設定此旗標。 |
FILE_EXECUTE | 數據可以使用系統分頁 I/O 從檔案讀取到記憶體。 |
或者,對於任何不代表目錄的檔案物件,您可以指定下列一或多個泛型ACCESS_MASK旗標。 STANDARD_RIGHTS_XXX旗標是預先定義的系統值,用來在系統對象上強制執行安全性。 您也可以將這些泛型旗標與上表的其他旗標結合。
所需的檔案值存取權 | 對應至 DesiredAccess 旗標 |
---|---|
GENERIC_READ | STANDARD_RIGHTS_READ、FILE_READ_DATA、FILE_READ_ATTRIBUTES、FILE_READ_EA、SYNCHRONIZE。 |
GENERIC_WRITE | STANDARD_RIGHTS_WRITE、FILE_WRITE_DATA、FILE_WRITE_ATTRIBUTES、FILE_WRITE_EA、FILE_APPEND_DATA、SYNCHRONIZE。 |
GENERIC_EXECUTE | STANDARD_RIGHTS_EXECUTE、SYNCHRONIZE、FILE_READ_ATTRIBUTES、FILE_EXECUTE。 |
針對目錄(已設定 FILE_DIRECTORY_FILE CreateOptions 旗標),您可以指定下列一或多個ACCESS_MASK旗標,也可以與先前所述的任何相容旗標合併。
想要存取目錄值 | 意義 |
---|---|
FILE_LIST_DIRECTORY | 目錄中的檔案可以列出。 |
FILE_TRAVERSE | 目錄可以周遊;也就是說,它可以是檔案路徑名稱的一部分。 |
FILE_READ_DATA、FILE_WRITE_DATA、FILE_EXECUTE 和 FILE_APPEND_DATA DesiredAccess 旗標與建立或開啟目錄檔案不相容。
[in] ObjectAttributes
InitializeObjectAttributes 例程已初始化之 OBJECT_ATTRIBUTES 結構的指標。 如果呼叫端正在系統進程內容中執行,這個參數可以 NULL。 否則,呼叫端必須在呼叫中將 OBJ_KERNEL_HANDLE 屬性設定為 InitializeObjectAttributes。 檔案對象的這個結構成員包括下列專案。
成員 | 價值 |
---|---|
ULONG 長度 | 提供 ObjectAttributes 數據的位元元組數目。 這個值必須至少 sizeof(OBJECT_ATTRIBUTES) 。 |
PUNICODE_STRING ObjectName | 緩衝 Unicode 字串的指標,其中包含要建立或開啟之檔名。 這個值必須是完整檔案規格,除非它是與 RootDirectory所指定目錄相對的檔名。 例如,“\Device\Floppy1\myfile.dat” 或 “??\B:\myfile.dat“ 可以是完整檔案規格,只要磁碟驅動器驅動程式和過度載入檔系統即可。 (注意:“??” 會將 “\DosDevices” 取代為 Win32 物件命名空間的名稱。“\DosDevices” 仍可運作,但物件管理員會更快翻譯 “??” |
HANDLE RootDirectory | 先前呼叫 ioCreateFileEx取得之目錄的選擇性句柄。 如果此值 NULL,則 ObjectName 成員必須是包含目標檔案完整路徑的完整檔案規格。 如果這個值不是非NULL,則 ObjectName 成員會指定相對於這個目錄的檔名。 |
PSECURITY_DESCRIPTOR SecurityDescriptor | 要套用至檔案的選擇性安全性描述項。 這類安全性描述元指定的 ACL 只會在建立檔案時套用至檔案。 如果在建立檔案時 NULL 值,則放置於檔案上的 ACL 與文件系統相依;大部分的文件系統都會從父目錄檔案傳播這類 ACL 的一部分,並結合呼叫端的預設 ACL。 |
ULONG 屬性 | 一組旗標,可控制檔案對象屬性。 如果呼叫端正在系統進程內容中執行,這個參數可以是零。 否則,呼叫端必須設定 OBJ_KERNEL_HANDLE 旗標。 呼叫端也可以選擇性地設定 OBJ_CASE_INSENSITIVE 旗標,這表示名稱查閱程式代碼應該忽略 ObjectName 的情況,而不是執行完全相符的搜尋。 |
[out] IoStatusBlock
IO_STATUS_BLOCK 類型的變數指標,該變數會接收最終完成狀態和要求作業的相關信息。 從 IoCreateFileEx傳回時,變數 Information 成員包含下列其中一個值:
FILE_CREATED
FILE_OPENED
FILE_OVERWRITTEN
FILE_SUPERSEDED
FILE_EXISTS
FILE_DOES_NOT_EXIST
[in, optional] AllocationSize
選擇性地指定檔案的初始配置大小,以位元組為單位。 除非檔案正在建立、覆寫或取代,否則非零值沒有任何作用。
[in] FileAttributes
只有在檔案建立、取代或在某些情況下覆寫時,才會套用明確指定的屬性。 根據預設,這個值是FILE_ATTRIBUTE_NORMAL,可由任何其他旗標或相容旗標的組合(透過位 OR 運算)覆寫。 可能 FileAttributes 旗標包含下列專案。
FileAttributes 旗標 | 意義 |
---|---|
FILE_ATTRIBUTE_NORMAL | 應該建立具有標準屬性的檔案。 |
FILE_ATTRIBUTE_READONLY | 應該建立唯讀檔案。 |
FILE_ATTRIBUTE_HIDDEN | 應該建立隱藏的檔案。 |
FILE_ATTRIBUTE_SYSTEM | 應該建立系統檔案。 |
FILE_ATTRIBUTE_ARCHIVE | 檔案應標示為封存盤。 |
FILE_ATTRIBUTE_TEMPORARY | 應該建立暫存盤。 |
[in] ShareAccess
指定呼叫端想要的檔案共用存取類型,例如零或一個,或下列旗標的組合。 若要要求獨佔存取權,請將此參數設定為零。 如果在 Options 參數中指定IO_IGNORE_SHARE_ACCESS_CHECK旗標,I/O 管理員會忽略 shareAccess 參數。 不過,檔案系統仍可能會執行存取檢查。 因此,請務必指定您想要用於此參數的共用模式,即使您使用 IO_IGNORE_SHARE_ACCESS_CHECK 旗標也一樣。 若要協助您避免共用違規錯誤,請指定下列所有共用存取旗標。
ShareAccess 旗標 | 意義 |
---|---|
FILE_SHARE_READ | 檔案可以由其他線程的檔案建立呼叫開啟以供讀取存取。 |
FILE_SHARE_WRITE | 檔案可以開啟以供其他線程的檔案建立呼叫進行寫入存取。 |
FILE_SHARE_DELETE | 檔案可以由其他線程的檔案建立呼叫開啟以刪除存取權。 |
設備驅動器和中繼驅動程式通常會將 ShareAccess 設定為零,這可讓呼叫端獨佔存取開啟的檔案。
[in] Disposition
值,決定檔案已經存在時應該如何處理檔案。 處置 可以是下列其中一項。
價值 | 意義 |
---|---|
FILE_SUPERSEDE | 如果檔案已經存在,請將它取代為指定的檔案。 如果不存在,請建立指定的檔案。 |
FILE_CREATE | 如果檔案已經存在,則要求失敗,且不會建立或開啟指定的檔案。 如果不存在,請建立指定的檔案。 |
FILE_OPEN | 如果檔案已經存在,請開啟它,而不是建立新的檔案。 如果不存在,請失敗要求,且不會建立新的檔案。 |
FILE_OPEN_IF | 如果檔案已經存在,請加以開啟。 如果不存在,請建立指定的檔案。 |
FILE_OVERWRITE | 如果檔案已經存在,請加以開啟並加以覆寫。 如果不存在,請失敗要求。 |
FILE_OVERWRITE_IF | 如果檔案已經存在,請加以開啟並加以覆寫。 如果不存在,請建立指定的檔案。 |
[in] CreateOptions
指定要在建立或開啟檔案時套用的選項,做為下列旗標的兼容組合。
CreateOptions 旗標 | 意義 |
---|---|
FILE_DIRECTORY_FILE(0x00000001) | 正在建立或開啟的檔案是目錄檔案。 使用此旗標,Disposition 參數必須設定為其中一個FILE_CREATE、FILE_OPEN或FILE_OPEN_IF。 與這個旗標相容的 createOptions 旗標如下所示:FILE_SYNCHRONOUS_IO_ALERT、FILE_SYNCHRONOUS_IO_NONALERT、FILE_WRITE_THROUGH、FILE_OPEN_FOR_BACKUP_INTENT和FILE_OPEN_BY_FILE_ID。 |
FILE_WRITE_THROUGH (0x00000002) | 將數據寫入檔案的系統服務、檔案系統和驅動程式必須實際將數據傳輸到檔案,才能將任何要求的寫入作業視為完成。 |
FILE_SEQUENTIAL_ONLY (0x00000004) | 對檔案的所有存取都是循序的。 |
FILE_NO_INTERMEDIATE_BUFFERING(0x00000008) | 無法在驅動程式的內部緩衝區中快取或緩衝處理檔案。 此旗標與 desiredAccess FILE_APPEND_DATA 旗標不相容。 |
FILE_SYNCHRONOUS_IO_ALERT (0x00000010) | 檔案上的所有作業都會同步執行。 代表呼叫端的任何等候,都受限於警示的過早終止。 此旗標也會讓 I/O 系統維護檔案位置內容。 如果已設定此旗標,也必須設定 DesiredAccess SYNCHRONIZE 旗標,讓 I/O 管理員使用檔案物件做為同步處理物件。 |
FILE_SYNCHRONOUS_IO_NONALERT(0x00000020) | 檔案上的所有作業都會同步執行。 系統等候同步處理 I/O 佇列和完成,不受警示限制。 此旗標也會讓 I/O 系統維護檔案位置內容。 如果已設定此旗標,也必須設定 DesiredAccess SYNCHRONIZE 旗標,讓 I/O 管理員使用檔案物件做為同步處理物件。 |
FILE_NON_DIRECTORY_FILE (0x00000040) | 開啟的檔案不得為目錄檔案,否則此呼叫會失敗。 正在開啟的檔案物件可以代表數據檔;邏輯、虛擬或實體裝置;或磁碟區。 |
FILE_CREATE_TREE_CONNECTION (0x00000080) | 建立此檔案的樹狀結構連線,以便透過網路開啟它。 |
FILE_COMPLETE_IF_OPLOCKED(0x00000100) | 如果目標檔案為 oplocked,而不是封鎖呼叫端的線程,請立即以替代成功程式代碼完成此作業。 如果檔案為 oplocked,另一個呼叫端已可透過網路存取檔案。 |
FILE_NO_EA_KNOWLEDGE (0x00000200) | 如果開啟之現有檔案上的擴充屬性表示呼叫端必須瞭解擴充屬性才能正確解譯檔案,則失敗此要求,因為呼叫端無法瞭解如何處理擴充屬性。 |
FILE_OPEN_REMOTE_INSTANCE(0x00000400) | 保留供系統使用;請勿使用 。 |
FILE_RANDOM_ACCESS (0x00000800) | 對檔案的存取可以是隨機的,因此文件系統或作系統不應對檔案執行任何循序的預先讀取作業。 |
FILE_DELETE_ON_CLOSE(0x00001000) | 將最後一個句柄傳遞給 FltClose 時,請刪除檔案。 |
FILE_OPEN_BY_FILE_ID (0x00002000) | 檔案正依標識碼開啟。 檔名包含裝置的名稱,以及用來開啟檔案的64位標識碼。 |
FILE_OPEN_FOR_BACKUP_INTENT(0x000004000) | 檔案正在開啟以供備份意圖使用;因此,系統應該檢查特定訪問許可權,並授與呼叫端對檔案的適當存取權,然後再檢查輸入 DesiredAccess 與檔案的安全性描述元。 |
FILE_NO_COMPRESSION (0x00008000) | 隱藏父目錄中FILE_ATTRIBUTE_COMPRESSED的繼承。 這允許在標示為壓縮的目錄中建立非壓縮檔。 |
FILE_OPEN_REQUIRING_OPLOCK (0x00010000) | 檔案正在開啟,而檔案上的機會鎖定 (oplock) 會要求為單一不可部分完成的作業。 文件系統在執行建立作業之前會檢查 oplock,如果建立作業會中斷現有的 oplock,則建立作業會失敗,且傳回碼為 STATUS_CANNOT_BREAK_OPLOCK。 此旗標適用於 Windows 7、Windows Server 2008 R2 和更新版本的 Windows作系統。 |
FILE_DISALLOW_EXCLUSIVE (0x00020000) | 開啟現有的檔案時,如果未指定FILE_SHARE_READ,而且文件系統存取檢查不會授與呼叫端對檔案的寫入許可權,則此開啟失敗並STATUS_ACCESS_DENIED。 這是 Windows 7 之前的預設行為。 |
FILE_SESSION_AWARE (0x00040000) | 檔案或裝置正以會話感知開啟。 如果未指定此旗標,則會話 0 中執行的處理程式無法開啟個別會話裝置(例如使用 RemoteFX USB 重新導向的裝置)。 此旗標對不在會話 0 中的呼叫端沒有任何作用。 只有伺服器版本的 Windows 才支援此旗標。 Windows Server 2012 之前不支援此旗標。 |
FILE_RESERVE_OPFILTER (0x00100000) | 此旗標可讓應用程式要求篩選機會鎖定 (oplock) 以防止其他應用程式收到共享違規。 如果已經有開啟的句柄,建立要求將會失敗,並STATUS_OPLOCK_NOT_GRANTED。 如需詳細資訊,請參閱下列一節。 |
FILE_OPEN_REPARSE_POINT (0x00200000) | 使用重新分析點開啟檔案,並略過檔案的一般重新分析點處理。 如需詳細資訊,請參閱下列一節。 |
FILE_OPEN_NO_RECALL (0x00400000) | 指示任何執行離線記憶體或虛擬化的篩選條件,不要因為開啟而重新叫用檔案的內容。 |
FILE_OPEN_FOR_FREE_SPACE_QUERY (0x00800000) | 此旗標會指示文件系統擷取與呼叫線程相關聯的使用者。 使用傳回句柄對 FltQueryVolumeInformation 或 ZwQueryVolumeInformationFile 的任何後續呼叫,都會假設擷取的使用者,而不是當時的呼叫使用者,以便計算呼叫端可用的可用空間。 這適用於下列 FsInformationClass 值:FileFsSizeInformation、FileFsFullSizeInformation 和 FileFsFullSizeInformationEx。 |
[in, optional] EaBuffer
FILE_FULL_EA_INFORMATION 類型之呼叫端提供的變數指標,其中包含要套用至檔案的擴充屬性 (EA) 資訊。 針對裝置和中繼驅動程式,此參數必須 NULL。
[in] EaLength
EaBuffer的長度,以位元組為單位。 對於設備驅動器和中繼驅動程式,此參數必須是零。
[in] CreateFileType
驅動程式必須將此參數設定為 CreateFileTypeNone。
[in, optional] InternalParameters
驅動程式必須將此參數設定為 NULL。
[in] Options
指定要在建立要求產生期間使用的選項。 您可以使用下列零個或多個位旗標值。
選項 旗標 | 意義 |
---|---|
IO_FORCE_ACCESS_CHECK | I/O 管理員必須根據檔案的安全性描述元檢查建立要求。 如需詳細資訊,請參閱。 |
IO_IGNORE_SHARE_ACCESS_CHECK | I/O 管理員在建立檔案對象之後,不應該對檔案對象執行共用存取檢查。 不過,檔案系統可能仍會執行這些檢查。 |
IO_STOP_ON_SYMLINK | 如果在開啟或建立檔案時遇到連接點、符號連結或全域重新分析點,I/O 管理員會傳回STATUS_STOPPED_ON_SYMLINK。 此外,IoStatusBlock->Information中會傳回REPARSE_DATA_BUFFER結構。 呼叫端負責釋放 REPARSE_DATA_BUFFER 結構。 |
IO_OPEN_TARGET_DIRECTORY | 開啟檔案的父目錄。 |
[in, optional] DriverContext
IoInitializeDriverCreateContext 例程先前初始化之 IO_DRIVER_CREATE_CONTEXT 結構的選擇性指標。 IO_DRIVER_CREATE_CONTEXT 結構可用來將其他參數傳遞至 IoCreateFileEx 和 FltCreateFileEx2 例程。 如需詳細資訊,請參閱下列一節。
傳回值
IoCreateFileEx 會傳回STATUS_SUCCESS或適當的 NTSTATUS 值,例如下列其中一項。
傳回碼 | 描述 |
---|---|
STATUS_INVALID_DEVICE_OBJECT_PARAMETER | IoCreateFileEx 如果 DriverContext 參數未 NULL,而且指定的裝置物件未附加至檔案或目錄名稱中所指定磁碟區的文件系統驅動程式堆疊,則會傳回此狀態值。 此裝置物件是由 IO_DRIVER_CREATE_CONTEXT 結構的 DeviceObjectHint 成員所指定。 如需詳細資訊,請參閱 IO_DRIVER_CREATE_CONTEXT。 |
STATUS_MOUNT_POINT_NOT_RESOLVED | IoCreateFileEx 如果 DriverContext 參數未 NULL,而且檔案或目錄名稱包含的裝入點會解析為附加指定裝置物件以外的磁碟區,則會傳回此狀態值。 此裝置物件是由 IO_DRIVER_CREATE_CONTEXT 結構的 DeviceObjectHint 成員所指定。 如需詳細資訊,請參閱 IO_DRIVER_CREATE_CONTEXT。 |
STATUS_OBJECT_PATH_SYNTAX_BAD | IoCreateFileEx 如果 ObjectAttributes 參數未包含 RootDirectory 成員,但OBJECT_ATTRIBUTES 結構中的 ObjectName 成員是空字符串或不包含OBJECT_NAME_PATH_SEPARATOR字元,則會傳回此狀態值。 這表示對象路徑的語法不正確。 |
STATUS_STOPPED_ON_SYMLINK | 如果已設定 Options 參數旗 IO_STOP_ON_SYMLINK 標,且開啟或建立檔案時遇到符號連結,則 ioCreateFileEx 會傳回此狀態值。 |
如果 IoCreateFileEx 例程傳回錯誤狀態,呼叫端可以檢查 IoStatusBlock 參數,找到失敗原因的其他資訊。
IoCreateFileEx 可能會傳回STATUS_FILE_LOCK_CONFLICT做為傳回值 ,或在 IoStatusBlock 參數所指向之IO_STATUS_BLOCK結構 成員中傳回STATUS_FILE_LOCK_CONFLICT。 只有當 NTFS 記錄檔已滿,而且 IoCreateFileEx 嘗試處理這種情況時,才會發生錯誤。
言論
IoCreateFileEx 例程類似於 IoCreateFile 例程和 IoCreateFileSpecifyDeviceObjectHint 例程,但提供額外的功能,包括存取額外的建立參數 (ECP),裝置物件提示, 和交易資訊,透過 IoCreateFileEx 例程的 DriverContext 參数。 如需這些結構型參數的詳細資訊,請參閱 IO_DRIVER_CREATE_CONTEXT。
文件系統篩選驅動程式會呼叫 IoCreateFileEx,只將建立要求傳送至指定的裝置物件、其下方連結的篩選,以及文件系統。 附加在驅動程式堆疊中指定裝置物件上方的篩選條件不會收到建立要求。 不過,如果 DeviceObjectHint IO_DRIVER_CREATE_CONTEXT 結構的成員(透過 DriverContext 參數傳遞)NULL,則要求會移至堆疊頂端,並由所有篩選和文件系統接收。
如果 I/O 要求未移至驅動程式堆疊的頂端,也就是說,如果 DriverContext 參數未 NULL,且有效的裝置物件是由IO_DRIVER_CREATE_CONTEXT結構的 DeviceObjectHint 成員指定,則適用下列限制:
- 如果傳遞至 IoCreateFileEx 例程的檔名路徑包含裝入點,裝入點必須解析為檔案或目錄所在的相同磁碟區。
IoCreateFileEx 取得的句柄,可供後續呼叫來作檔案內的數據,或是檔案物件的狀態或屬性。 從 IoCreateFileEx 取得的任何句柄,最終都必須透過呼叫 ZwClose來釋放。
有兩種替代方式可指定要建立或開啟的檔名,IoCreateFileEx:
作為完整路徑名稱,提供於 input ObjectAttributes 參數的 ObjectName 成員中。
做為路徑名稱,相對於 RootDirectory 中的句柄,ObjectAttributes 參數的輸入成員。 (此句柄可以代表目錄檔案。
在系統進程以外的進程內容中執行的驅動程式例程,必須為 IoCreateFileEx的 ObjectAttributes 參數設定 OBJ_KERNEL_HANDLE 屬性。 這會限制使用ioCreateFileEx 傳回的句柄, 以內核模式執行的進程。 否則,進程可以存取其內容中的驅動程序執行句柄。 驅動程式可以呼叫 InitializeObjectAttributes 來設定OBJ_KERNEL_HANDLE屬性。
某些 DesiredAccess 旗標和旗標的組合具有下列效果:
若要讓呼叫端等候傳回 FileHandle 設定為 Signaled 狀態,同步處理 I/O 完成,則必須設定 SYNCHRONIZE 旗標。 否則,裝置或中繼驅動程式的呼叫端必須使用事件物件來同步處理 I/O 完成。
如果只設定FILE_APPEND_DATA和 SYNCHRONIZE 旗標,呼叫端只能寫入檔案結尾,而且會忽略寫入檔案的任何位移資訊。 不過,這種寫入作業會視需要自動擴充檔案。
設定檔案的FILE_WRITE_DATA旗標也允許在檔案結尾以外進行寫入。 檔案也會針對這類寫入自動擴充。
如果只設定FILE_EXECUTE和 SYNCHRONIZE 旗標,呼叫端就無法使用傳回的 fileHandle直接讀取或寫入檔案中的任何數據:也就是說,檔案上的所有作業都會透過系統呼叫器進行,以回應指令和數據存取。 裝置和中繼驅動程式不應在 DesiredAccess 中設定FILE_EXECUTE 旗標。
ShareAccess 參數會決定個別線程是否可以同時存取相同的檔案。 如果這兩個檔案開啟者具有以指定方式存取檔案的許可權,就可以成功開啟和共用檔案。 如果 ioCreateFileEx 的原始呼叫者未指定FILE_SHARE_READ、FILE_SHARE_WRITE或FILE_SHARE_DELETE,則無法對檔案執行其他開啟作業:也就是說,原始呼叫端會獲得檔案的獨佔存取權。
若要成功開啟共用檔案,檔案所要求的 DesiredAccess 值必須與 DesiredAccess 和 ShareAccess 規格相容,這些要求尚未發行 ZwClose。 也就是說,指定給指定檔案 IoCreateFileEx 所指定的 DesiredAccess 值,不得與不允許其他檔案開啟者的存取權衝突。
如果在 Options 參數中指定IO_IGNORE_SHARE_ACCESS_CHECK,I/O 管理員會忽略 shareAccess 參數。 不過,檔案系統仍可能會執行存取檢查。 因此,請務必指定您想要 ShareAccess 參數的共用模式,即使使用IO_IGNORE_SHARE_ACCESS_CHECK旗標也一樣。
Disposition 值FILE_SUPERSEDE要求呼叫端具有現有檔案物件的 DELETE 存取權。 如果是的話,成功呼叫 IoCreateFileEx,並在現有檔案上FILE_SUPERSEDE有效地刪除該檔案,然後重新建立它。 這表示,如果檔案已經由另一個線程開啟,線程會指定 ShareAccess 參數並設定FILE_SHARE_DELETE旗標,以開啟檔案。 請注意,這種類型的處置與覆寫檔案的POSIX樣式一致。
處置 值FILE_OVERWRITE_IF和FILE_SUPERSEDE類似。 如果使用現有的檔案呼叫 IoCreateFileEx,且其中任一 處置 值,則會取代檔案。
覆寫檔案在語意上相當於取代作業,但下列除外:
呼叫端必須具有檔案的寫入許可權,而不是刪除存取權。 這表示,如果檔案已由另一個線程開啟,則會使用shareAccess 輸入中設定的 FILE_SHARE_WRITE 旗標開啟檔案。
指定的檔案屬性在邏輯上是 ORed,且檔案上已有這些屬性。 這表示如果檔案已由另一個線程開啟,則後續 的 ioCreateFileEx 呼叫者 無法停用現有的 FileAttributes 旗標,但可以啟用相同檔案的其他旗標。 請注意,此覆寫檔案樣式與 MS-DOS、Windows 3.1 和 OS/2 一致。
CreateOptions FILE_DIRECTORY_FILE 值會指定要建立或開啟的檔案是目錄檔案。 建立目錄檔案時,文件系統會在磁碟上建立適當的結構,以代表該特定文件系統磁碟結構空的目錄。 如果已指定此選項且要開啟的指定檔案不是目錄檔案,或者呼叫者指定 了不一致的 createOptions 或 Disposition 值,則 呼叫 ioCreateFileEx 將會失敗。
CreateOptions FILE_NO_INTERMEDIATE_BUFFERING 旗標可防止文件系統代表呼叫端執行任何中繼緩衝。 指定此值會將呼叫端參數的某些限制放在 Zw.。檔案 例程,包括下列專案:
傳遞 至 ZwReadFile 或 ZwWriteFile 的任何選擇性 ByteOffset 必須是扇區大小的整數(整數倍數)。
傳遞 至 ZwReadFile 或 ZwWriteFile的 長度 必須是扇區大小的整數。 請注意,將讀取作業指定給長度正好是扇區大小的緩衝區,可能會導致在傳輸期間到達檔尾時,將較少的大量位元組傳送至該緩衝區。
緩衝區必須符合基礎裝置的對齊需求。 呼叫 ioCreateFileEx 即可取得這項資訊,以取得代表實體裝置之檔案物件的句柄,然後使用該句柄呼叫 ZwQueryInformationFile。 如需系統FILE_XXX_ALIGNMENT 值的清單,請參閱 DEVICE_OBJECT。
呼叫 ZwSetInformationFile,並將 fileInformationClass 參數設定為 FilePositionInformation 必須指定扇區大小整數的位移。
互斥 CreateOptions、FILE_SYNCHRONOUS_IO_ALERT 和 FILE_SYNCHRONOUS_IO_NONALERT 旗標,指定只要透過傳回 FileHandle所參考的檔案物件,檔案上的所有 I/O 作業都是同步的。 這類檔案上的所有 I/O 都會使用傳回的句柄,跨所有線程串行化。 使用下列任一 CreateOptions 值,必須設定 desiredAccess SYNCHRONIZE 旗標,讓 I/O 管理員將使用該檔案物件做為同步處理物件。 其中一個 CreateOptions 值設定後,I/O 管理員會維護檔案物件的「檔案位置內容」,這是內部、目前的檔案位置位移。 這個位移可用於呼叫 ZwReadFileZwReadFile 和 ZwWriteFile。 也可以藉由呼叫 ZwQueryInformationFile呼叫ZwQueryInformationFile 來查詢其位置,或藉由呼叫 ZwSetInformationFile來設定。
如果 CreateOptions FILE_OPEN_REPARSE_POINT 旗標未指定,且 IoCreateFileEx 嘗試開啟具有重新分析點的檔案,則檔案會進行一般重新分析點處理。 另一方面,如果指定了FILE_OPEN_REPARSE_POINT旗標,一般重新剖析處理 不會發生,而且 IoCreateFileEx 嘗試直接開啟重新分析點檔案。 在任一情況下,如果開啟作業成功,IoCreateFileEx 會傳回STATUS_SUCCESS;否則,例程會傳回NTSTATUS錯誤碼。 IoCreateFileEx 永遠不會傳回STATUS_REPARSE。
CreateOptions FILE_OPEN_REQUIRING_OPLOCK 旗標可消除開啟檔案並要求 oplock 的時間,而該檔案可能會讓第三方開啟檔案並取得共享違規。 應用程式可以在 IoCreateFileEx 上使用 FILE_OPEN_REQUIRING_OPLOCK 旗標,然後要求任何 oplock。 這可確保Oplock擁有者會收到任何稍後造成共用違規之開啟要求的通知。
在 Windows 7 中,如果應用程式使用 FILE_OPEN_REQUIRING_OPLOCK 旗標時檔案上存在其他句柄,則建立作業將會失敗併產生STATUS_OPLOCK_NOT_GRANTED。 從 Windows 8 開始,此限制已不存在。
如果此建立作業會中斷檔案上已經存在的 oplock,則設定 FILE_OPEN_REQUIRING_OPLOCK 旗標會導致建立作業失敗並出現STATUS_CANNOT_BREAK_OPLOCK。 此建立作業不會中斷現有的 oplock。
使用此旗標的應用程式必須在此呼叫成功之後要求 oplock,否則所有稍後嘗試開啟檔案都會遭到封鎖,而不會因一般 oplock 處理而受益。 同樣地,如果此呼叫成功,但稍後的 oplock 要求失敗,則使用此旗標的應用程式必須在偵測到 oplock 要求失敗之後關閉其句柄。
Windows 7、Windows Server 2008 R2 和更新版本的 Windows作系統都提供FILE_OPEN_REQUIRING_OPLOCK旗標。 實作此旗標的Microsoft文件系統為NTFS、FAT和exFAT。
CreateOptions 旗標FILE_RESERVE_OPFILTER,可讓應用程式要求層級 1、批次或篩選 oplock,以防止其他應用程式收到共享違規。 不過,FILE_RESERVE_OPFILTER只適用於篩選作業鎖定。 若要使用它,您必須遵循下列步驟:
發出建立要求,CreateOptions FILE_RESERVE_OPFILTER、完全FILE_READ_ATTRIBUTES的 DesiredAccess,以及剛FILE_SHARE_READ的 ShareAccess |FILE_SHARE_WRITE |FILE_SHARE_DELETE。
如果已經有開啟的句柄,則建立要求會因為STATUS_OPLOCK_NOT_GRANTED而失敗,而下一個要求的 oplock 也會失敗。
如果您以較多的存取權或較少共享開啟,也會導致STATUS_OPLOCK_NOT_GRANTED失敗。
如果建立要求成功,請要求 oplock。
開啟檔案的另一個句柄以執行 I/O。
步驟 3 讓這項作僅適用於篩選作業鎖定。 在步驟 3 中開啟的句柄可以有一個 DesiredAccess,其中包含最多FILE_READ_ATTRIBUTES |FILE_WRITE_ATTRIBUTES |FILE_READ_DATA |FILE_READ_EA |FILE_EXECUTE |SYNCHRONIZE |READ_CONTROL,仍然不會中斷篩選作業鎖定。 不過,任何大於 FILE_READ_ATTRIBUTES 的 DesiredAccess |FILE_WRITE_ATTRIBUTES |SYNCHRONIZE 會中斷層級 1 或批次 oplock,並使這些 oplock 類型的FILE_RESERVE_OPFILTER旗標無用。
針對源自使用者模式的建立要求,如果驅動程式在 IoCreateFileExOptions 參數中設定IO_FORCE_ACCESS_CHECK,則也應該在 ObjectAttributes 參數中設定OBJ_FORCE_ACCESS_CHECK。 如需此旗標的資訊,請參閱 OBJECT_ATTRIBUTES的 屬性 成員。
NTFS 是唯一實作FILE_RESERVE_OPFILTER Microsoft文件系統。
IoCreateFileEx 可用來取得磁碟區的句柄。
要求
要求 | 價值 |
---|---|
目標平臺 | 普遍 |
標頭 | ntddk.h (include Ntddk.h, Ntifs.h, FltKernel.h) |
連結庫 | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | PASSIVE_LEVEL |
另請參閱
FltAllocateExtraCreateParameter
FltAllocateExtraCreateParameterList