共用方式為


NtCreateFile 函式 (ntifs.h)

NtCreateFile 例程會建立新的檔案或開啟現有的檔案。

語法

__kernel_entry NTSYSCALLAPI NTSTATUS NtCreateFile(
  [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              CreateDisposition,
  [in]           ULONG              CreateOptions,
  [in, optional] PVOID              EaBuffer,
  [in]           ULONG              EaLength
);

參數

[out] FileHandle

HANDLE 變數的指標,可接收檔案的句柄。

[in] DesiredAccess

指定 ACCESS_MASK 值,這個值會決定對物件的要求存取權。

除了針對所有類型的物件定義的 標準 訪問許可權之外,呼叫者還可以指定下列任何 特定 訪問許可權:也就是說,檔案特有的許可權。

ACCESS_MASK旗標 允許呼叫端執行此動作
FILE_READ_DATA 從檔案讀取數據。
FILE_READ_ATTRIBUTES 讀取檔案的屬性。 如需詳細資訊,請參閱 FileAttributes 參數的描述。
FILE_READ_EA 讀取檔案的擴充屬性 (EAS)。 此旗標與裝置和中繼驅動程序無關。
FILE_WRITE_DATA 將數據寫入檔案。
FILE_WRITE_ATTRIBUTES 寫入檔案的屬性。 如需詳細資訊,請參閱 FileAttributes 參數的描述。
FILE_WRITE_EA 變更檔案的擴充屬性 (EAS)。 此旗標與裝置和中繼驅動程序無關。
FILE_APPEND_DATA 將數據附加至檔案。
FILE_EXECUTE 使用系統分頁 I/O 將資料從檔案讀取到記憶體。 此旗標與裝置和中繼驅動程序無關。

注意

當您建立或開啟目錄時,請勿指定FILE_READ_DATA、FILE_WRITE_DATA、FILE_APPEND_DATA或FILE_EXECUTE。

呼叫端也可以指定下列 泛型 訪問許可權(適用於所有物件類型的許可權,其中每個泛型訪問許可權的意義都專屬於物件類型)。 檔案物件的一般訪問許可權會對應至特定的訪問許可權,如下表所示。 (請注意,「對應」表示「對應至」,並不表示泛型許可權的值「等於」其特定許可權對應之位 OR 的值。 I/O 管理員會定義實際的對應。

一般存取權 對應至這些特定的訪問許可權
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、FILE_EXECUTE、FILE_READ_ATTRIBUTES 和 SYNCHRONIZE。 此值與裝置和中繼驅動程序無關。
GENERIC_ALL FILE_ALL_ACCESS

注意

一般 訪問許可權只能指定給檔案;無法為目錄指定它們。

當呼叫 NtCreateFile 時,某些 CreateOptions 旗標需要在 DesiredAccess 中設定特定存取旗標。 如需這些詳細數據,請參閱 CreateOptions 參數。

例如,如果您為檔案物件指定GENERIC_READ,例程會將此值對應至特定訪問許可權的FILE_GENERIC_READ位掩碼。 在上表中,針對 GENERIC_READ 列出的特定訪問許可權會對應至FILE_GENERIC_READ位掩碼中包含的存取旗標(但不等於)。

如果檔案實際上是目錄,呼叫端也可以指定下列一般訪問許可權。

DesiredAccess 旗標 允許呼叫端執行此動作
FILE_LIST_DIRECTORY 列出目錄中的檔案。
FILE_TRAVERSE 換句話說,周遊目錄,將目錄包含在檔案的路徑中。

如需存取權限的詳細資訊,請參閱 ACCESS_MASK存取權限

[in] ObjectAttributes

指定物件名稱和其他屬性之 OBJECT_ATTRIBUTES 結構的指標。 使用 InitializeObjectAttributes 來初始化這個結構。 如果呼叫端未在系統線程內容中執行,則呼叫 InitializeObjectAttributes時,它必須設定OBJ_KERNEL_HANDLE屬性。

[out] IoStatusBlock

IO_STATUS_BLOCK 結構的指標,這個結構會接收最終完成狀態,以及所要求作業的其他資訊。 特別是,Information 成員會收到下列其中一個值:

  • FILE_CREATED
  • FILE_OPENED
  • FILE_OVERWRITTEN
  • FILE_SUPERSEDED
  • FILE_EXISTS
  • FILE_DOES_NOT_EXIST

[in, optional] AllocationSize

LARGE_INTEGER的指標,其中包含已建立或覆寫之檔案的初始配置大小,以位元組為單位。 如果 AllocationSizeNULL,則不會指定配置大小。 如果未建立或覆寫任何檔案,則會忽略 allocationSize

[in] FileAttributes

指定一或多個FILE_ATTRIBUTE_XXX 旗標,代表當您建立或覆寫檔案時要設定的檔案屬性。 呼叫端通常會指定FILE_ATTRIBUTE_NORMAL,以設定預設屬性。 如需有效的 FILE_ATTRIBUTE_XXX 旗標清單,請參閱 Microsoft Windows SDK 檔案中的 CreateFile 例程。 如果未建立或覆寫任何檔案 ,則會忽略 FileAttributes

[in] ShareAccess

共用存取的類型,指定為零或下列旗標的任何組合。

ShareAccess 旗標 允許其他線程執行此動作
FILE_SHARE_READ 讀取檔案
FILE_SHARE_WRITE 寫入檔案
FILE_SHARE_DELETE 刪除檔案

裝置和中繼驅動程式通常會將 shareAccess 設定為零,這可讓呼叫端獨佔存取開啟的檔案。

[in] CreateDisposition

指定檔案不存在或不存在時要執行的動作。 CreateDisposition 可以是下表中的其中一個值。

CreateDisposition 如果檔案存在,則採取動作 如果檔案不存在,則採取動作
FILE_SUPERSEDE 取代檔案。 建立檔案。
FILE_CREATE 傳回錯誤。 建立檔案。
FILE_OPEN 開啟檔案。 傳回錯誤。
FILE_OPEN_IF 開啟檔案。 建立檔案。
FILE_OVERWRITE 開啟檔案,並加以覆寫。 傳回錯誤。
FILE_OVERWRITE_IF 開啟檔案,並加以覆寫。 建立檔案。

[in] CreateOptions

指定驅動程式建立或開啟檔案時要套用的選項。 使用下表中的一或多個旗標。

CreateOptions 旗標 意義
FILE_DIRECTORY_FILE(0x00000001) 檔案是目錄。 相容的 CreateOptions 旗標是FILE_SYNCHRONOUS_IO_ALERT、FILE_SYNCHRONOUS_IO_NONALERT、FILE_WRITE_THROUGH、FILE_OPEN_FOR_BACKUP_INTENT和FILE_OPEN_BY_FILE_ID。 CreateDisposition 參數必須設定為 FILE_CREATE、FILE_OPEN 或 FILE_OPEN_IF。
FILE_WRITE_THROUGH (0x00000002) 將數據寫入檔案的系統服務、檔案系統驅動程式和驅動程式,必須實際將數據傳輸到檔案,才能將任何要求的寫入作業視為完成。
FILE_SEQUENTIAL_ONLY (0x00000004) 對檔案的所有存取都是循序的。
FILE_NO_INTERMEDIATE_BUFFERING(0x00000008) 無法在驅動程式的內部緩衝區中快取或緩衝處理檔案。 此旗標與 DesiredAccess 參數FILE_APPEND_DATA旗標不相容。
FILE_SYNCHRONOUS_IO_ALERT (0x00000010) 檔案上的所有作業都會同步執行。 代表呼叫端的任何等候,都受限於警示的過早終止。 此旗標也會讓 I/O 系統維護檔案位置指標。 如果已設定此旗標,則 SYNCHRONIZE 旗標必須在 DesiredAccess 參數中設定。
FILE_SYNCHRONOUS_IO_NONALERT(0x00000020) 檔案上的所有作業都會同步執行。 在同步處理 I/O 佇列和完成的系統中等候不會受限於警示。 此旗標也會讓 I/O 系統維護檔案位置內容。 如果已設定此旗標,則 SYNCHRONIZE 旗標必須在 DesiredAccess 參數中設定。
FILE_NON_DIRECTORY_FILE (0x00000040) 檔案 目錄。 要開啟的檔案物件可以代表數據檔;邏輯、虛擬或實體裝置;或磁碟區。 從 Windows 11 版本 24H2 開始,NTFS 現在會在開啟 $INDEX_ALLOCATION 屬性時接受此旗標。
FILE_CREATE_TREE_CONNECTION (0x00000080) 建立此檔案的樹狀結構連線,以便透過網路開啟它。 裝置和中繼驅動程式不會使用此旗標。
FILE_COMPLETE_IF_OPLOCKED(0x00000100) 如果目標檔案為 oplocked,而不是封鎖呼叫端的線程,請立即以替代的成功程式代碼STATUS_OPLOCK_BREAK_IN_PROGRESS完成此作業。 如果檔案為 oplocked,另一個呼叫端就已經可以存取該檔案。 裝置和中繼驅動程式不會使用此旗標。
FILE_NO_EA_KNOWLEDGE (0x00000200) 如果開啟現有檔案的擴充屬性 (EAS) 表示呼叫端必須瞭解 EA 才能正確解譯檔案,NtCreateFile 應該傳回錯誤。 此旗標與裝置和中繼驅動程序無關。
FILE_OPEN_REMOTE_INSTANCE(0x00000400) 保留供系統使用;請勿使用 。
FILE_RANDOM_ACCESS (0x00000800) 檔案的存取權可以是隨機的,因此檔系統驅動程式或系統不應執行任何循序的預先讀取作業。
FILE_DELETE_ON_CLOSE(0x00001000) 當最後一個檔案句柄傳遞至 NtClose時,系統會刪除檔案。 如果設定此旗標,必須在 desiredAccess 參數 設定 DELETE 旗標。
FILE_OPEN_BY_FILE_ID (0x00002000) ObjectAttributes 所指定的檔名 參數包含檔案的二進位 8 位元組或 16 位元組檔案參考編號或物件識別符,視檔系統而定。 或者,後面接著反斜杠字元的裝置名稱可能會繼續這些二進位值。 如需其他詳細數據和範例,請參閱。
FILE_OPEN_FOR_BACKUP_INTENT(0x00004000) 檔案正在開啟以供備份意圖使用。 因此,系統應該檢查特定訪問許可權,並授與呼叫端對檔案的適當存取權,然後再檢查 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 開始,即可使用此旗標。
FILE_DISALLOW_EXCLUSIVE (0x00020000) 開啟現有的檔案時,如果未指定FILE_SHARE_READ,而且文件系統存取檢查不會授與呼叫端對檔案的寫入許可權,則此開啟失敗並STATUS_ACCESS_DENIED。 這是 Windows 7 之前的預設行為。 從 Windows 7 和 Windows Server 2008 R2 開始,即可使用此旗標。
FILE_SESSION_AWARE (0x00040000) 開啟檔案或裝置的用戶端會感知會話,並在必要時驗證每個會話存取權。 從 Windows 8 開始,即可使用此旗標。
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。
FILE_CONTAINS_EXTENDED_CREATE_INFORMATION (0x10000000) EaBuffer 參數解譯為 EXTENDED_CREATE_INFORMATION實例。 從 Windows 11 版本 22H2 開始,即可使用此旗標。

[in, optional] EaBuffer

針對裝置和中繼驅動程式,此參數必須是 NULL 指標。

[in] EaLength

針對裝置和中繼驅動程式,此參數必須是零。

傳回值

NtCreateFile 會在成功時傳回STATUS_SUCCESS,或在失敗時傳回適當的 NTSTATUS 錯誤碼。 在後者的情況下,呼叫端可以藉由檢查 IoStatusBlock 參數來判斷失敗的原因。

注意

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

言論

NtCreateFile 提供呼叫端可用來操作檔案數據的句柄,或檔案物件的狀態和屬性。 如需詳細資訊,請參閱在驅動程式中使用檔案

FileHandle 指向的句柄不再使用後,驅動程式必須呼叫 NtClose 關閉它。

如果呼叫端未在系統線程內容中執行,則必須確保所建立的任何句柄都是私人句柄。 否則,進程可以存取其內容中的驅動程序執行句柄。 如需詳細資訊,請參閱 物件句柄

有兩種替代方式可指定要建立或開啟的檔名,NtCreateFile

  • 作為完整路徑名稱,提供於輸入 ObjectAttributes ObjectName 成員中。
  • 做為路徑名稱,相對於 RootDirectory 輸入 ObjectAttributes中句柄所表示的目錄檔案。

DesiredAccess 參數中設定特定旗標會導致下列效果:

  • 若要讓呼叫端等候傳回 FileHandle來同步處理 I/O 完成,必須設定 SYNCHRONIZE 旗標。 否則,裝置或中繼驅動程式的呼叫端必須使用事件物件來同步處理 I/O 完成。
  • 如果呼叫端只設定FILE_APPEND_DATA和 SYNCHRONIZE 旗標,它就只能寫入檔案結尾,而且忽略對檔案寫入作業的任何位移資訊。 此檔案會視需要自動擴充此類型的作業。
  • 設定檔案的FILE_WRITE_DATA旗標,也可讓呼叫端寫入檔案結尾之外。 同樣地,檔案會視需要自動擴充。
  • 如果呼叫端只設定FILE_EXECUTE和 SYNCHRONIZE 旗標,就無法使用傳回的 FileHandle 直接讀取或寫入檔案中的任何數據。 也就是說,檔案上的所有作業都會透過系統呼叫器來回應指示和數據存取作業。 裝置和中繼驅動程序不應該設定FILE_EXECUTE旗標。

ShareAccess 參數會決定個別線程是否可以同時存取相同的檔案。 前提是這兩個呼叫端都有適當的訪問許可權,就可以成功開啟和共用檔案。 如果 ntCreateFile 的原始呼叫者未指定FILE_SHARE_READ、FILE_SHARE_WRITE或FILE_SHARE_DELETE,則沒有其他呼叫端可以開啟檔案,也就是說,原始呼叫端會被授與獨佔存取權。

若要成功開啟共用檔案,DesiredAccess 旗標必須與尚未透過 發行之所有先前開啟作業的 DesiredAccessShareAccess 旗標兼容。 也就是說,指定給指定檔案 NtCreateFile 所指定 DesiredAcce ss,不得與不允許其他檔案開啟者存取的存取權衝突。

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

CreateDisposition 值FILE_OVERWRITE_IF和FILE_SUPERSEDE類似。 如果 NtCreateFile 是以現有的檔案呼叫,而且其中一個 CreateDisposition 值,則會取代檔案。

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

  • 呼叫端必須具有檔案的寫入許可權,而不是刪除存取權。 這表示,如果檔案已由另一個線程開啟,則會使用shareAccess輸入 中設定的 FILE_SHARE_WRITE 旗標開啟檔案。
  • 指定的檔案屬性在邏輯上是 ORed,且檔案上已有這些屬性。 這表示,如果檔案已由另一個線程開啟,則 NtCreateFile 的後續呼叫者 無法停用現有的 FileAttributes 旗標,但可以啟用相同檔案的其他旗標。 請注意,此覆寫檔案樣式與 MS-DOS、Microsoft Windows 3.1 和 OS/2 一致。

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

FILE_NO_INTERMEDIATE_BUFFERING CreateOptions 旗標可防止文件系統代表呼叫端執行任何中繼緩衝。 指定此旗標會將下列限制放在呼叫者參數的其他 ZwXxx檔案 例程。

  • 傳遞至 NtReadFileNtWriteFile 的任何選擇性 ByteOffset 必須是扇區大小的倍數。
  • 傳遞 至 NtReadFileNtWriteFile長度 必須是扇區大小的整數。 請注意,將讀取作業指定給長度正好是扇區大小的緩衝區,可能會導致在傳輸期間到達檔尾時,將較少的大量位元組傳送至該緩衝區。
  • 緩衝區必須符合基礎裝置的對齊需求。 若要取得這項資訊,請呼叫 NtCreateFile 以取得代表實體裝置的檔案物件的句柄,並將該句柄傳遞至 NtQueryInformationFile。 如需系統FILE_XXX_ALIGNMENT 值的清單,請參閱 DEVICE_OBJECT
  • 呼叫 NtSetInformationFile並將 fileInformationClass 參數設定為 FilePositionInformation 必須指定扇區大小的倍數位移。

FILE_SYNCHRONOUS_IO_ALERT和FILE_SYNCHRONOUS_IO_NONALERT CreateOptions 旗標(互斥)指定檔案上的所有 I/O 作業都會同步,只要透過傳回 FileHandle所參考的檔案物件執行作業即可。 這類檔案上的所有 I/O 都會使用傳回的句柄,跨所有線程串行化。 如果設定這其中一個 CreateOptions 旗標,則 SYNCHRONIZE DesiredAccess 旗標也必須設定為強制 I/O 管理員使用檔案物件做為同步處理物件。 在這些情況下,I/O 管理員會追蹤目前的檔案位置位移,您可以傳遞至 ntReadFile NtWriteFile。 呼叫 NtQueryInformationFileNtSetInformationFile 以取得或設定這個位置。

如果 CreateOptions FILE_OPEN_REPARSE_POINT 旗標 未指定,且 NtCreateFile 嘗試開啟具有重新分析點的檔案,則檔案會發生一般重新分析點處理。 另一方面,如果指定了FILE_OPEN_REPARSE_POINT旗標,則一般重新剖析處理 不會發生,而且 NtCreateFile 嘗試直接開啟重新分析點檔案。 在任一情況下,如果開啟作業成功,NtCreateFile 會傳回STATUS_SUCCESS;否則,例程會傳回NTSTATUS錯誤碼。 NtCreateFile 永遠不會傳回STATUS_REPARSE。

CreateOptions FILE_OPEN_REQUIRING_OPLOCK 旗標會消除開啟檔案並要求 oplock 之間的時間,這可能會讓第三方開啟檔案並取得共享違規。 應用程式可以在 NtCreateFile 上使用 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。

使用此FILE_OPEN_REQUIRING_OPLOCK旗標的應用程式必須在此呼叫成功之後要求 oplock,否則所有後續嘗試開啟檔案都會遭到封鎖,而不會因正常 oplock 處理而受益。 同樣地,如果此呼叫成功,但後續的 oplock 要求失敗,則使用此旗標的應用程式必須在偵測到 oplock 要求失敗之後關閉其句柄。 應用程式在要求oplock之前,不得對檔案執行任何其他文件系統作業(除了關閉檔句柄之外),否則可能會發生死結。

注意

Windows 7、Windows Server 2008 R2 和更新版本的 Windows 操作系統都提供FILE_OPEN_REQUIRING_OPLOCK旗標。 在 Windows 7 中實作此旗標的Microsoft文件系統為 NTFS、FAT 和 exFAT。

CreateOptions 旗標FILE_RESERVE_OPFILTER可讓應用程式要求層級 1、Batch 或 Filter oplock,以防止其他應用程式收到共享違規。 不過,FILE_RESERVE_OPFILTER只適用於篩選作業鎖定。 若要使用它,您必須完成下列步驟:

  1. 發出 CreateOptions FILE_RESERVE_OPFILTER、DesiredAccess 完全FILE_READ_ATTRIBUTES的 createOptions 和 ShareAccess FILE_SHARE_READ |FILE_SHARE_WRITE |FILE_SHARE_DELETE。
    • 如果已經有開啟的句柄,則建立要求會因為STATUS_OPLOCK_NOT_GRANTED而失敗,而下一個要求的 oplock 也會失敗。
    • 如果您以較多的存取權或較少共享開啟,也會導致STATUS_OPLOCK_NOT_GRANTED失敗。
  2. 如果建立要求成功,請要求 oplock。
  3. 開啟檔案的另一個句柄以執行 I/O。

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

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

針對 CreateOptions FILE_OPEN_BY_FILE_ID 旗標,範例裝置名稱的格式如下:

\??\C:\<FileID>
\device\HardDiskVolume1\<ObjectID>

其中 FileID 為 8 個字節,ObjectID 為 16 個字節:

  • 在NTFS上,這可以是8位元組或16位元組的參考編號或對象標識碼。 16 位元組的參考編號與以零填補的8位元組數位相同。
  • 在 ReFS 上,這可以是 8 位元組或 16 位元組的參考編號。 16 位元組的數位與8位元組的數字無關。 不支援物件識別碼。
  • FAT、ExFAT、UDFS 和 CDFS 檔案系統不支援FILE_OPEN_BY_FILE_ID旗標。

這個數位是由特定文件系統所指派,且專屬於特定文件系統。 因為檔名字段部分會包含二進位 Blob,所以假設這是有效的 Unicode 字串,而且更重要的是可能不是 Null 終止的字串,不正確。

NtCreateFile 的呼叫者必須在 IRQL = PASSIVE_LEVEL,且 啟用特殊核心 APC

注意

如果呼叫此函式是在使用者模式中發生,您應該使用名稱 「NtCreateFile」 而不是 「ZwCreateFile“。

對於內核模式驅動程式的呼叫,NtXxxZwXxx 版本的 Windows 原生系統服務例程,在處理和解譯輸入參數的方式上可能會有不同的行為。 如需 nt NtXxxZwXxx 例程之間關聯性的詳細資訊,請參閱 使用 Nt 和 Zw 版本的原生系統服務例程

要求

要求 價值
最低支援的用戶端 Windows 2000
目標平臺 普遍
標頭 ntifs.h (包括 Wdm.h、Ntddk.h、Ntifs.h)
連結庫 NtosKrnl.lib
DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL (請參閱一節)
DDI 合規性規則 HwStorPortProhibitedDDIs, PowerIrpDDis

另請參閱

ACCESS_MASK

DEVICE_OBJECT

EXTENDED_CREATE_INFORMATION

IO_STATUS_BLOCK

InitializeObjectAttributes

NtClose

NtOpenFile

NtQueryInformationFile

NtReadFile

NtSetInformationFile

NtWriteFile