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 旗標 意義
DELETE 檔案可以刪除。
FILE_READ_DATA 資料可以從檔案讀取。
FILE_READ_ATTRIBUTES 您可以讀取如下所述的 FileAttributes 旗標。
FILE_READ_EA 您可以讀取與檔案相關聯的擴充屬性 (EA) 。
READ_CONTROL 您可以讀取與檔案相關聯的訪問控制清單 (ACL) 和擁有權資訊。
FILE_WRITE_DATA 資料可以寫入檔案。
FILE_WRITE_ATTRIBUTES FileAttributes 旗標可以寫入。
FILE_WRITE_EA 可以寫入與檔案相關聯的EA。
FILE_APPEND_DATA 數據可以附加至檔案。
WRITE_DAC 您可以寫入與檔案相關聯的 DACL) (任意存取控制清單。
WRITE_OWNER 可以寫入與檔案相關聯的擁有權資訊。
SYNCHRONIZE 呼叫端可以等候傳回的 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。 否則,呼叫端必須在 呼叫 InitializeObjectAttributes 中設定OBJ_KERNEL_HANDLE屬性。 檔案物件之這個結構的成員包括下列專案。

成員
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 傳回時,變數 的信息成員包含 下列其中一個值:

  • 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) 檔案無法在驅動程式的內部緩衝區中快取或緩衝處理。 此旗標與 DesiredAccessFILE_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) 如果目標檔案為 oplock,而不是封鎖呼叫端的線程,請立即以替代成功碼完成此作業。 如果檔案是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,而建立作業將會失敗,並傳回STATUS_CANNOT_BREAK_OPLOCK如果建立作業會中斷現有的 oplock,則會失敗。 此旗標適用於 Windows 7、Windows Server 2008 R2 和更新版本的 Windows 操作系統。
FILE_DISALLOW_EXCLUSIVE (0x00020000) 開啟現有的檔案時,如果未指定FILE_SHARE_READ,而且文件系統存取檢查不會授與呼叫端對檔案的寫入許可權,則此開啟失敗,並STATUS_ACCESS_DENIED。 這是 Windows 7 之前的預設行為。
FILE_SESSION_AWARE (0x00040000) 檔案或裝置正以會話感知開啟。 如果未指定此旗標,則每個會話裝置 (,例如使用 RemoteFX USB 重新導向) 的裝置,無法在會話 0 中執行的進程開啟。 此旗標對不在會話 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 結構可用來將其他參數傳遞至 IoCreateFileExFltCreateFileEx2 例程。 如需詳細資訊,請參閱下列一節。

傳回值

IoCreateFileEx 會傳回STATUS_SUCCESS或適當的NTSTATUS值,例如下列其中一個。

傳回碼 Description
STATUS_INVALID_DEVICE_OBJECT_PARAMETER 如果 DriverContext 參數不是 NULL,且指定的裝置物件未附加至檔案或目錄名稱中指定的磁碟區,IoCreateFileEx 會傳回此狀態值。 此裝置物件是由 IO_DRIVER_CREATE_CONTEXT 結構的 DeviceObjectHint 成員所指定。 如需詳細資訊,請參閱 IO_DRIVER_CREATE_CONTEXT
STATUS_MOUNT_POINT_NOT_RESOLVED 如果 DriverContext 參數不是 NULL,且檔案或目錄名稱包含的裝入點,則 IoCreateFileEx 會傳回此狀態值,該裝入點會解析為附加指定裝置物件的磁碟區以外的磁碟區。 此裝置物件是由 IO_DRIVER_CREATE_CONTEXT 結構的 DeviceObjectHint 成員所指定。 如需詳細資訊,請參閱 IO_DRIVER_CREATE_CONTEXT
STATUS_OBJECT_PATH_SYNTAX_BAD 如果 ObjectAttributes 參數不包含 RootDirectory 成員,但OBJECT_ATTRIBUTES結構中的 ObjectName 成員是空字串或不包含OBJECT_NAME_PATH_SEPARATOR字元,則 IoCreateFileEx 會傳回此狀態值。 這表示對象路徑的語法不正確。
STATUS_STOPPED_ON_SYMLINK 如果已設定 Options 參數旗標 IO_STOP_ON_SYMLINK,且開啟或建立檔案時遇到符號連結,IoCreateFileEx 會傳回此狀態值。

如果 IoCreateFileEx 例程傳回錯誤狀態,呼叫端可藉由檢查 IoStatusBlock 參數來尋找失敗原因的其他資訊。

IoCreateFileEx 可能會傳回STATUS_FILE_LOCK_CONFLICT做為傳回值,或在IoStatusBlock參數所指向之IO_STATUS_BLOCK結構的 Status 成員中傳回。 只有在NTFS記錄檔已滿,而且 IoCreateFileEx 嘗試處理這種情況時,才會發生此錯誤。

備註

IoCreateFileEx 例程類似於 IoCreateFile 例程和 IoCreateFileSpecifyDeviceObjectHint 例程,但提供額外的功能,包括透過 IoCreateFileEx 例程的 DriverContext 參數存取額外的建立參數 (ECP) 、裝置物件提示和交易資訊。 如需這些結構型參數的詳細資訊,請參閱 IO_DRIVER_CREATE_CONTEXT

文件系統篩選驅動程式會呼叫 IoCreateFileEx ,只將建立要求傳送至指定的裝置物件、其下方連結的篩選,以及文件系統。 附加在驅動程式堆疊中指定裝置物件上方的篩選條件不會收到建立要求。 不過,如果IO_DRIVER_CREATE_CONTEXT結構的 DeviceObjectHint 成員 (通過 DriverContext 參數) 為 NULL,則要求會移至堆疊頂端,而且會由所有篩選和文件系統接收。

如果 I/O 要求未移至驅動程式堆疊的頂端,也就是如果 DriverContext 參數不是 NULL ,且有效的裝置物件是由 IO_DRIVER_CREATE_CONTEXT 結構的 DeviceObjectHint 成員所指定,則適用下列限制:

  • 如果傳遞至 IoCreateFileEx 例程的檔名路徑包含裝入點,裝入點必須解析為檔案或目錄所在的相同磁碟區。

IoCreateFileEx 取得的句柄可供後續呼叫用來操作檔案內的數據,或檔案物件的狀態或屬性。 從 IoCreateFileEx 取得的任何句柄最終都必須藉由呼叫 ZwClose 來釋放。

有兩種替代方式可指定要使用 IoCreateFileEx 建立或開啟的檔名:

  • 做為完整路徑名稱,提供於輸入 ObjectAttributes 參數的 ObjectName 成員中。

  • 作為路徑名稱,相對於輸入 ObjectAttributes 參數之 RootDirectory 成員中的句柄。 (此句柄可以代表目錄檔案。)

在系統進程以外的進程內容中執行的驅動程式例程,必須為IoCreateFileExObjectAttributes 參數設定 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 值必須與尚未與 ZwClose 一起發行之所有先前開啟要求的 DesiredAccessShareAccess 規格相容。 也就是說,指定給IoCreateFileExDesiredAccess 值不得與不允許其他檔案開啟者存取的存取衝突。

如果在 Options 參數中指定IO_IGNORE_SHARE_ACCESS_CHECK,I/O 管理員會忽略 ShareAccess 參數。 不過,檔案系統仍可能會執行存取檢查。 因此,請務必指定 ShareAccess 參數想要的共用模式,即使使用 IO_IGNORE_SHARE_ACCESS_CHECK 旗標也一樣。

處置值FILE_SUPERSEDE要求呼叫端具有現有檔案物件的 DELETE 存取權。 如果是的話,在現有檔案上成功呼叫 IoCreateFileEx 並FILE_SUPERSEDE會有效地刪除該檔案,然後重新建立該檔案。 這表示,如果檔案已經由另一個線程開啟,線程會指定 shareAccess 參數並設定FILE_SHARE_DELETE旗標,以開啟檔案。 請注意,這種類型的處置與覆寫檔案的POSIX樣式一致。

處置值FILE_OVERWRITE_IF和FILE_SUPERSEDE類似。 如果使用現有的檔案和其中一個 Disposition 值呼叫 IoCreateFileEx,則會取代檔案。

覆寫檔案的語意相當於取代作業,但下列情況除外:

  • 呼叫端必須具有檔案的寫入許可權,而不是刪除存取權。 這表示,如果檔案已經由另一個線程開啟,則會開啟檔案,並在輸入 ShareAccess中設定FILE_SHARE_WRITE旗標。

  • 指定的檔案屬性在邏輯上為 ORed,且檔案上已有這些屬性。 這表示如果檔案已經由另一個線程開啟, IoCreateFileEx 的後續呼叫端就無法停用現有的 FileAttributes 旗標,但可以啟用相同檔案的其他旗標。 請注意,此覆寫檔案的樣式與 MS-DOS、Windows 3.1 和 OS/2 一致。

CreateOptions FILE_DIRECTORY_FILE 值會指定要建立或開啟的檔案是目錄檔案。 建立目錄檔案時,文件系統會在磁碟上建立適當的結構,以代表該特定文件系統的磁碟上結構的空白目錄。 如果指定此選項且要開啟的指定檔案不是目錄檔案,或者呼叫端指定了不一致的 CreateOptionsDisposition 值, 則 IoCreateFileEx 的呼叫將會失敗。

CreateOptions FILE_NO_INTERMEDIATE_BUFFERING 旗標可防止文件系統代表呼叫端執行任何中繼緩衝。 指定此值會對 Zw 的呼叫端參數設定特定限制 。檔案 例程,包括下列專案:

  • 任何傳遞至 ZwReadFile 或 ZwWriteFile 的選擇性 ByteOffset 都必須是扇區大小的整數 (整數) 。

  • 傳遞至 ZwReadFileZwWriteFileLength 必須是扇區大小的整數。 請注意,如果傳輸期間到達檔尾,將讀取作業指定至緩衝區的長度完全是扇區大小,可能會導致傳送到該緩衝區的顯著位元組數目較少。

  • 緩衝區必須符合基礎裝置的對齊需求。 呼叫 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 管理員會維護檔案物件的「檔案位置內容」,也就是內部、目前的檔案位置位移。 此位移可用於呼叫 ZwReadFileZwWriteFile。 也可以藉由呼叫 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只適用於篩選 oplock。 若要使用它,您必須遵循下列步驟:

  1. 使用FILE_RESERVE_OPFILTER 的 CreateOptions 、完全FILE_READ_ATTRIBUTES的 DesiredAccess 和完全FILE_SHARE_READ的 ShareAccess 發出建立要求 |FILE_SHARE_WRITE |FILE_SHARE_DELETE。

    • 如果已經有開啟的句柄,則建立要求會因為STATUS_OPLOCK_NOT_GRANTED而失敗,而下一個要求的 oplock 也會失敗。

    • 如果您開啟的存取權較多或較少共用,也會導致STATUS_OPLOCK_NOT_GRANTED失敗。

  2. 如果建立要求成功,請要求 oplock。

  3. 開啟檔案的另一個句柄以執行 I/O。

步驟 3 僅能針對篩選 oplock 進行這項操作。 步驟 3 中開啟的句柄可以有包含最多FILE_READ_ATTRIBUTES的 DesiredAccess |FILE_WRITE_ATTRIBUTES |FILE_READ_DATA |FILE_READ_EA |FILE_EXECUTE |SYNCHRONIZE |READ_CONTROL,但仍不會中斷篩選 oplock。 不過,任何大於 FILE_READ_ATTRIBUTES 的 DesiredAccess |FILE_WRITE_ATTRIBUTES |SYNCHRONIZE 會中斷層級 1 或批次 oplock,並使FILE_RESERVE_OPFILTER旗標不適用於這些 oplock 類型。

針對源自使用者模式的建立要求,如果驅動程式在IoCreateFileExOptions參數中設定IO_FORCE_ACCESS_CHECK,則也應該在ObjectAttributes 參數中設定OBJ_FORCE_ACCESS_CHECK。 如需此旗標的資訊,請參閱OBJECT_ATTRIBUTES的屬性成員。

NTFS 是唯一實作FILE_RESERVE_OPFILTER的 Microsoft 文件系統。

IoCreateFileEx 可用來取得磁碟區的句柄。

規格需求

需求
目標平台 Universal
標頭 ntddk.h (包含 Ntddk.h、Ntifs.h、FltKernel.h)
程式庫 NtosKrnl.lib
Dll NtosKrnl.exe
IRQL PASSIVE_LEVEL

另請參閱

ACCESS_MASK

ACL

DEVICE_OBJECT

FILE_FULL_EA_INFORMATION

FltAcknowledgeEcp

FltAllocateExtraCreateParameter

FltAllocateExtraCreateParameterList

FltClose

FltCreateFileEx2

IO_DRIVER_CREATE_CONTEXT

InitializeObjectAttributes

IoCreateFile

IoCreateFileSpecifyDeviceObjectHint

UNICODE_STRING

ZwClose

ZwCreateFile

ZwQueryInformationFile

ZwReadFile

ZwSetInformationFile

ZwWriteFile