FltCreateFile 函式 (fltkernel.h)

迷你篩選驅動程式會呼叫 FltCreateFile 來建立新的檔案或開啟現有的檔案。

語法

NTSTATUS FLTAPI FltCreateFile(
  [in]           PFLT_FILTER        Filter,
  [in, optional] PFLT_INSTANCE      Instance,
  [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,
  [in]           ULONG              Flags
);

參數

[in] Filter

呼叫端的不透明篩選指標。

[in, optional] Instance

要傳送建立要求之迷你篩選驅動程序實例的不透明實例指標。 實例必須附加至檔案或目錄所在的磁碟區。 這個參數是選擇性的,而且可以是 NULL。 如果此參數為 NULL,要求會傳送至磁碟區文件系統驅動程式堆疊頂端的裝置物件。 如果是非 NULL,則只會將要求傳送至附加在指定實例下方的迷你篩選驅動程序實例。

[out] FileHandle

呼叫端配置變數的指標,如果 呼叫 FltCreateFile 成功,則會接收檔句柄。

[in] DesiredAccess

旗標的位掩碼,指定呼叫端所需的檔案或目錄存取類型。 如需此參數的詳細資訊和旗標值清單,請參閱IoCreateFileExDesiredAccess 參數。

[in] ObjectAttributes

已使用 InitializeObjectAttributes 初始化之不透明OBJECT_ATTRIBUTES結構的指標。 如需詳細資訊和每個結構成員的描述,請參閱IoCreateFileExObjectAttributes 參數。

[out] IoStatusBlock

接收最終完成狀態和所要求作業相關信息 之IO_STATUS_BLOCK 結構的指標。 如需此參數的詳細資訊,請參閱IoCreateFileExIoStatusBlock參數。

[in, optional] AllocationSize

選擇性地指定檔案數據流的初始配置大小,以位元組為單位。 除非正在建立、覆寫或取代檔案,否則非零值沒有任何作用。

[in] FileAttributes

指定一或多個FILE_ATTRIBUTE_XXX 旗標,代表如果您要建立、取代或覆寫檔案時所要設定的檔案屬性。 如需詳細資訊和旗標清單,請參閱IoCreateFileExFileAttributes參數。

[in] ShareAccess

指定呼叫端所需的檔案共用存取類型、零或一個,或旗標的組合。 如需詳細資訊和旗標清單,請參閱IoCreateFileExShareAccess參數。

[in] CreateDisposition

指定值,根據檔案是否已經存在,決定要採取的動作。 如需可能的值清單,請參閱IoCreateFileExDisposition 參數。

[in] CreateOptions

指定要在建立或開啟檔案時套用的選項。 此參數是IoCreateFileEx的 CreateOptions 參數所列出的旗標相容組合。

[in, optional] EaBuffer

呼叫端提供的 FILE_FULL_EA_INFORMATION結構化緩衝區指標,其中包含要套用至檔案的擴充屬性 (EA) 資訊。

[in] EaLength

EaBuffer 的長度,以位元組為單位。

[in] Flags

指定要在建立要求期間使用的選項。 如需可能的選項清單,請參閱IoCreateFileExOptions參數。

傳回值

FltCreateFile 會傳回STATUS_SUCCESS或適當的 NTSTATUS 值。 如需可能的傳回碼清單,請參閱IoCreateFileEx的傳回一節。

注意

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

備註

在 Microsoft Windows Update Windows 2000 SP4 和 Windows Server 2003 SP1 之前的 Windows 版本上, minifilter 驅動程式應該呼叫 FltCreateFile,而不是 IoCreateFileIoCreateFileSpecifyDeviceObjectHintZwCreateFile,以取得檔案句柄以搭配 ZwXxx I/O 例程使用,例如 ZwReadFileZwQueryInformationFile

在適用於 Windows 2000 SP4、Windows Server 2003 SP1 和更新版本的 Microsoft Windows Update 匯總套件上,迷你篩選驅動程式可以使用 FltCreateFileEx 來取得檔案對象指標,以便與 FltXxx 檔案例程搭配使用,例如 FltReadFileFltWriteFile。 在舊版 Windows 上,從 FltCreateFile 取得的句柄可以藉由呼叫 ObReferenceObjectByHandle 來轉換成檔案對象指標,如下所示:

status = ObReferenceObjectByHandle(
           handle,                 //Handle
           0,                      //DesiredAccess
           NULL,                   //ObjectType
           KernelMode,             //AccessMode
           &handleFileObject,      //Object
           NULL);                  //HandleInformation</pre>

FltCreateFile 只會將建立要求傳送至附加在指定迷你篩選驅動程序實例和文件系統下方的實例。 上面附加的指定實例和實例不會收到建立要求。 如果未指定任何實例,則要求會移至堆疊頂端,並由所有實例和文件系統接收。

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

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

FltCreateFile 取得的任何句柄最終都必須藉由呼叫 FltClose 來釋放。

未在系統進程內容中執行的驅動程式例程必須為 FltCreateFileObjectAttributes 參數設定OBJ_KERNEL_HANDLE屬性。 設定此屬性會將 FltCreateFile 所傳回的句柄,限制為在內核模式中執行的進程。 否則,進程可以在其內容中執行驅動程式的句柄來存取。

注意

請勿使用非 NULL 最上層 IRP 值呼叫此例程,因為這可能會導致系統死結。

請勿在停用的 FsRtlEnterFileSystemKeEnterCriticalRegion (停用 APC 來呼叫此例程,因為這可能會導致線程死結。

某些 DesiredAccess 旗標和旗標組合具有下列效果:

  • 若要讓呼叫端等候傳回的 FileHandle 設定為 Signaled 狀態,以同步處理 I/O 完成,必須設定 SYNCHRONIZE 旗標。

  • 如果只設定FILE_APPEND_DATA和SYNCHRONIZE旗標,則呼叫端只能寫入檔案結尾,而且會忽略寫入檔案的任何位移資訊。 不過,此檔案會視需要自動擴充此類型的寫入作業。

  • 設定檔案的FILE_WRITE_DATA旗標也可允許寫入超過檔案結尾的寫入。 此檔案也會針對這種類型的寫入自動擴充。

  • 如果只設定FILE_EXECUTE和 SYNCHRONIZE 旗標,呼叫端就無法使用傳回的 FileHandle ,直接讀取或寫入檔案中的任何數據。 也就是說,檔案上的所有作業都必須使用系統分頁 I/O 來讀取或寫入檔案數據。

ShareAccess 參數會判斷個別線程是否可以同時存取相同的檔案。 如果這兩個檔案開啟者都具備以指定方式存取檔案的許可權,則可以成功開啟和共用檔案。 如果 FltCreateFile 的原始呼叫端未指定FILE_SHARE_READ、FILE_SHARE_WRITE或FILE_SHARE_DELETE,則無法對檔案執行其他開啟作業,因為原始呼叫端具有檔案的獨佔存取權。

若要成功開啟共用檔案,要求的 DesiredAccess 與檔案的 DesiredAccess 和所有先前尚未透過 FltClose 發行的 ShareAccess 規格相容。 也就是說,為指定檔案指定給 FltCreateFileDesiredAccess 不得與其他檔案開啟者不允許的存取發生衝突。

注意

如果在 Flags 參數中指定IO_IGNORE_SHARE_ACCESS_CHECK,I/O 管理員會忽略 ShareAccess 參數。 不過,檔案系統仍可能會執行存取檢查。 因此,請務必指定 ShareAccess 參數想要的共用模式,即使使用 IO_IGNORE_SHARE_ACCESS_CHECK 旗標也一樣。 此外,請注意,指定IO_IGNORE_SHARE_ACCESS_CHECK時,文件系統不會追蹤目前開啟所需的存取權或共用存取。 因此,相同檔案上的後續開啟呼叫可能會成功。

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

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

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

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

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

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

  • 傳遞至 ZwReadFileZwWriteFile 的任何位元移值都必須是扇區大小的倍數。
  • 傳遞至 ZwReadFileZwWriteFileLength 必須是扇區大小的倍數。 請注意,如果傳輸期間到達檔尾,將讀取作業指定至緩衝區的長度與扇區大小完全相同,可能會導致傳送到該緩衝區的顯著位元組較少。
  • 緩衝區必須符合基礎儲存裝置的對齊需求。 您可以呼叫 FltCreateFile 以取得代表實體裝置的檔案物件的句柄,然後使用該句柄呼叫 ZwQueryInformationFile ,並將 FileAlignmentInformation 指定為 FileInformationClass。 如需系統FILE_XXX_ALIGNMENT值的詳細資訊,這些值定義於 ntifs.h 中,請參閱 DEVICE_OBJECT初始化裝置物件
  • 呼叫 ZwSetInformationFile 並將 FileInformationClass 參數設定為 FilePositionInformation 時,必須指定扇區大小的倍數位移。

CreateOptions FILE_SYNCHRONOUS_IO_ALERT和FILE_SYNCHRONOUS_IO_NONALERT,其名稱建議互斥,請指定正在針對同步 I/O 開啟檔案。 這表示,只要檔案上傳回的 FileHandle 所參考的檔案物件發生,檔案上的所有 I/O 作業都會同步。 這類檔案上的所有 I/O 都會使用傳回的句柄,跨所有線程串行化。 其中一個 CreateOptions 設定後,I/O 管理員會在檔案物件的 CurrentByteOffset 字段中維護目前的檔案位置位移。 這個位移可用於對 ZwReadFileZwWriteFile 的呼叫。 您也可以呼叫 ZwQueryInformationFileZwSetInformationFile 來查詢或設定它。

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

CreateOptions FILE_OPEN_REQUIRING_OPLOCK 旗標會消除開啟檔案並要求作業鎖定之間的時間,這可能會讓第三方開啟檔案並取得共享違規。 應用程式可以使用 FltCreateFile 上的 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旗標。 在 Windows 7 中實作此旗標的 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 僅能針對篩選作業鎖定進行這項操作。 在步驟 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 或批次 oplock,並讓FILE_RESERVE_OPFILTER旗標不適用於這些 oplock 類型。

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

Minifilter 驅動程序必須使用 FltSetInformationFile,而不是 ZwSetInformationFile 來重新命名檔案。

注意

如果您嘗試開啟磁碟區,但只指定 DesiredAccess 參數的下列旗標組合, FltCreateFile 將會開啟與文件系統無關的句柄,而該句柄與磁碟區的儲存裝置直接存取權無關。

  • FILE_READ_ATTRIBUTES
  • READ_CONTROL
  • WRITE_DAC
  • WRITE_OWNER
  • SYNCHRONIZE

您不得使用 FltCreateFile 來開啟直接存取磁碟區儲存裝置的句柄,否則您將流失系統資源。 如果您想要開啟直接存取存儲設備的句柄,請改為呼叫 IoCreateFileExIoCreateFileSpecifyDeviceObjectHintZwCreateFile 函式。

規格需求

需求
最低支援的用戶端 適用於 SP4、Windows XP SP2、Windows Server 2003 SP1 的 Windows 2000 Update 匯總 1
目標平台 Universal
標頭 fltkernel.h (包括 FltKernel.h)
程式庫 Fltmgr.lib
IRQL PASSIVE_LEVEL

另請參閱

ACCESS_MASK

ACL

DEVICE_OBJECT

FILE_FULL_EA_INFORMATION

FltClose

FltCreateFileEx

FltCreateFileEx2

FltReadFile

FltWriteFile

InitializeObjectAttributes

IoCreateFile

IoCreateFileSpecifyDeviceObjectHint

ObReferenceObjectByHandle

SECURITY_DESCRIPTOR

UNICODE_STRING

ZwCreateFile

ZwQueryInformationFile

ZwReadFile

ZwSetInformationFile

ZwWriteFile