IoCreateFileSpecifyDeviceObjectHint 函式 (ntddk.h)
IoCreateFileSpecifyDeviceObjectHint 例程是由文件系統篩選驅動程式用來將建立要求傳送至指定裝置對象和文件系統下方的篩選條件。
語法
NTSTATUS IoCreateFileSpecifyDeviceObjectHint(
[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] PVOID DeviceObject
);
參數
[out] FileHandle
如果這個呼叫成功,則為接收檔案物件的句柄的變數指標。
[in] DesiredAccess
旗標的位掩碼,指定呼叫端對檔案或目錄所需的存取類型。 系統定義的 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 | 您可以寫入與檔案相關聯的擴充屬性。 |
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 從檔案讀取記憶體。 |
IoCreateFileSpecifyDeviceObjectHint 的呼叫端可以針對任何不代表目錄檔案的檔案物件,指定下列一或一個組合,可能是 ORed 與上述DesiredAccess 旗標列表中的其他兼容旗標:
DesiredAccess 至檔案值 | 對應至 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。 |
STANDARD_RIGHTS_XXX 是預先定義的系統值,用來在系統對象上強制執行安全性。
如果已設定 FILE_DIRECTORY_FILE CreateOptions 旗標, IoCreateFileSpecifyDeviceObjectHint 的呼叫端可以指定下列其中一或多個組合,可能是 ORed 與上述DesiredAccess 旗標清單中的一或多個相容旗標。
DesiredAccess 至目錄值 | 意義 |
---|---|
FILE_LIST_DIRECTORY | 目錄中的檔案可以列出。 |
FILE_TRAVERSE | 目錄可以周遊:也就是說,它可以是檔案路徑名稱的一部分。 |
FILE_READ_DATA、FILE_WRITE_DATA、FILE_EXECUTE和 FILE_APPEND_DATA DesiredAccess 旗標與建立或開啟目錄檔案不相容。
[in] ObjectAttributes
已由 InitializeObjectAttributes 例程初始化之OBJECT_ATTRIBUTES結構的指標。 如果呼叫端在系統進程內容中執行,此參數 (ObjectAttributes) 可以是 NULL。 否則,呼叫端必須在呼叫 InitializeObjectAttributes 例程中設定OBJ_KERNEL_HANDLE屬性。 檔案物件的OBJECT_ATTRIBUTES結構成員包括下列專案。
成員 | 值 |
---|---|
ULONGLength | 指定提供的 ObjectAttributes 數據位元組數目。 此值必須至少 為大小 (OBJECT_ATTRIBUTES) 。 |
PUNICODE_STRING ObjectName | 緩衝 Unicode 字串的指標,用來命名要建立或開啟的檔案。 此值必須是完整檔案規格,除非它是 相對於 RootDirectory 所指定目錄的檔名。 例如,\Device\Floppy1\myfile.dat 或 \??\B:\myfile.dat可能是完整的檔案規格,前提是磁碟驅動器和過度載入文件系統。 (請注意??將 \DosDevices 取代為 Win32 物件命名空間的名稱。\DosDevices 仍可運作,但 \??物件管理員.) 會更快速地翻譯 |
HANDLERootDirectory | 選擇性地指定先前呼叫 IoCreateFileSpecifyDeviceObjectHint取得之目錄的句柄。 如果此值為 NULL,ObjectName 成員必須是包含目標檔案完整路徑的完整檔案規格。 如果此值不是 NULL,ObjectName 成員會指定相對於這個目錄的檔名。 |
PSECURITY_DESCRIPTOR SecurityDescriptor | 選擇性地指定要套用至檔案的安全性描述元。 這類安全性描述元指定的 ACL 只會在建立檔案時套用至檔案。 如果建立檔案時值為 NULL ,則放置於檔案上的 ACL 會相依於文件系統;大部分文件系統都會從與呼叫端的預設 ACL 結合的父目錄檔案傳播這類 ACL 的一部分。 |
ULONGAttributes | 一組旗標,可控制檔案對象屬性。 如果呼叫端正在系統進程內容中執行,這個參數可以是零。 否則,呼叫端必須設定OBJ_KERNEL_HANDLE旗標。 呼叫端也可以選擇性地設定OBJ_CASE_INSENSITIVE旗標,這表示名稱查閱程式代碼應該忽略 ObjectName 的大小寫,而不是執行完全相符的搜尋。 |
[out] IoStatusBlock
IO_STATUS_BLOCK 結構的指標 ,可接收最終完成狀態和所要求作業的相關信息。 從 IoCreateFileSpecifyDeviceObjectHint 傳回時, Information 成員包含下列其中一個值:
FILE_CREATED
FILE_OPENED
FILE_OVERWRITTEN
FILE_SUPERSEDED
FILE_EXISTS
FILE_DOES_NOT_EXIST
[in, optional] AllocationSize
選擇性地指定檔案的初始配置大小,以位元組為單位。 除非檔案正在建立、覆寫或取代,否則非零值沒有任何作用。
[in] FileAttributes
只有在檔案建立、取代或在某些情況下覆寫時,才會套用明確指定的屬性。 根據預設,此值FILE_ATTRIBUTE_NORMAL,可由任何其他旗標或相容旗標的 ORed 組合覆寫。 可能的 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 管理員會忽略此參數。 不過,檔案系統仍可能會執行存取檢查。 因此,請務必指定您想要用於此參數的共用模式,即使使用 IO_IGNORE_SHARE_ACCESS_CHECK 旗標也一樣。 若要避免共用違規錯誤的最大機率,請指定下列所有共用存取旗標。
ShareAccess 旗標 | 意義 |
---|---|
FILE_SHARE_READ | 您可以開啟檔案供其他線程讀取存取。 |
FILE_SHARE_WRITE | 您可以開啟檔案以供其他線程進行寫入存取。 |
FILE_SHARE_DELETE | 您可以開啟檔案以供其他線程刪除存取。 |
[in] Disposition
指定值,根據檔案是否已存在,決定要採取的動作。 此值可以是下列任何描述的值。
處置值 | 意義 |
---|---|
FILE_SUPERSEDE | 如果檔案已經存在,請將它取代為指定的檔案。 如果沒有,請建立指定的檔案。 |
FILE_CREATE | 如果檔案已經存在,請失敗要求,且不會建立或開啟指定的檔案。 如果沒有,請建立指定的檔案。 |
FILE_OPEN | 如果檔案已經存在,請開啟它,而不是建立新的檔案。 如果沒有,請失敗要求,且不會建立新的檔案。 |
FILE_OPEN_IF | 如果檔案已經存在,請加以開啟。 如果沒有,請建立指定的檔案。 |
FILE_OVERWRITE | 如果檔案已經存在,請加以開啟並加以覆寫。 如果沒有,請失敗要求。 |
FILE_OVERWRITE_IF | 如果檔案已經存在,請加以開啟並加以覆寫。 如果沒有,請建立指定的檔案。 |
[in] CreateOptions
指定要在建立或開啟檔案時套用的選項。 這些選項會指定為下列旗標的兼容組合。
CreateOptions 旗標 | 意義 |
---|---|
FILE_DIRECTORY_FILE | 正在建立或開啟的檔案是目錄檔案。 如果設定此旗標, 則 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_NON_DIRECTORY_FILE | 正在開啟的檔案不得為目錄檔案,否則此呼叫將會失敗。 正在開啟的檔案對象必須代表數據檔。 |
FILE_WRITE_THROUGH | 將數據寫入檔案的系統服務、FSD 和驅動程式必須實際將數據傳輸到檔案,才能將任何要求的寫入作業視為完成。 |
FILE_SEQUENTIAL_ONLY | 對檔案的所有存取都是循序的。 |
FILE_RANDOM_ACCESS | 檔案的存取權可以是隨機的,因此 FSD 或系統不應該對檔案執行任何循序的預先讀取作業。 |
FILE_NO_INTERMEDIATE_BUFFERING | 檔案無法在驅動程式的內部緩衝區中快取或緩衝處理。 此旗標與 DesiredAccess FILE_APPEND_DATA 旗標不相容。 |
FILE_SYNCHRONOUS_IO_ALERT | 檔案上的所有作業都會同步執行。 任何代表呼叫端的等候,都受限於警示的提前終止。 此旗標也會讓 I/O 系統維護檔案位置內容。 如果已設定此旗標,則也必須設定 DesiredAccess SYNCHRONIZE 旗標。 |
FILE_SYNCHRONOUS_IO_NONALERT | 檔案上的所有作業都會同步執行。 等候存在於系統中以同步處理 I/O 佇列和完成,不受警示限制。 此旗標也會讓 I/O 系統維護檔案位置內容。 如果已設定此旗標,則也必須設定 DesiredAccess SYNCHRONIZE 旗標。 |
FILE_CREATE_TREE_CONNECTION | 建立此檔案的樹狀結構連線,以透過網路開啟它。 |
FILE_COMPLETE_IF_OPLOCKED | 如果目標檔案為 oplock,而不是封鎖呼叫端的線程,請立即以替代成功碼完成此作業。 如果檔案是oplocked,另一個呼叫端已經可以透過網路存取該檔案。 |
FILE_NO_EA_KNOWLEDGE | 如果開啟現有檔案上的擴充屬性表示呼叫端必須瞭解 EA 才能正確解譯檔案,請失敗此要求,因為呼叫端無法瞭解如何處理 EA。 |
FILE_OPEN_REPARSE_POINT | 使用重新分析點開啟檔案,並略過檔案的一般重新分析點處理。 如需詳細資訊,請參閱下面的<備註>一節。 |
FILE_DELETE_ON_CLOSE | 將最後一個句柄傳遞給 ZwClose 時,請刪除檔案。 |
FILE_OPEN_BY_FILE_ID | ObjectAttributes 參數中指定的檔名包含檔案的 8 位元組檔案參考編號。 這個數位是由文件系統指派,而且是文件系統特定的。 如果檔案是重新分析點,檔名也會包含裝置的名稱。 注意:FAT 檔系統不支援FILE_OPEN_BY_FILE_ID。 |
FILE_OPEN_FOR_BACKUP_INTENT | 檔案正針對備份意圖開啟,因此,系統應該檢查特定訪問許可權,並在檢查輸入 DesiredAccess 給檔案之前,先將適當的存取權授與呼叫者,再針對檔案的安全性描述元檢查輸入。 |
FILE_OPEN_REQUIRING_OPLOCK | 檔案正在開啟,而檔案上的作業鎖定 (作業) 要求為單一不可部分完成的作業。 文件系統會在執行建立作業之前檢查 oplock,如果建立會中斷現有的 oplock,則建立作業會失敗,且傳回碼為 STATUS_CANNOT_BREAK_OPLOCK。 |
FILE_RESERVE_OPFILTER | 此旗標可讓應用程式要求篩選機會鎖定 (oplock) ,以防止其他應用程式收到共享違規。 如果已經有開啟的句柄,則建立要求會因為STATUS_OPLOCK_NOT_GRANTED而失敗。 如需詳細資訊,請參閱接下來的<備註>一節。 |
[in, optional] EaBuffer
呼叫端提供的 FILE_FULL_EA_INFORMATION結構化緩衝區指標,其中包含要套用至檔案的擴充屬性 (EA) 資訊。
[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 管理員在建立檔案物件之後,不應該對檔案物件執行共用存取檢查。 不過,檔案系統可能仍會執行這些檢查。 |
[in, optional] DeviceObject
要傳送建立要求之裝置物件的指標。 裝置物件必須是文件系統驅動程式堆疊中檔案或目錄所在磁碟區的篩選或檔案系統裝置物件。 這個參數是選擇性的,而且可以是 NULL。 如果此參數為 NULL,則會將要求傳送至驅動程式堆疊頂端的裝置物件。
傳回值
IoCreateFileSpecifyDeviceObjectHint 會傳回STATUS_SUCCESS或適當的 NTSTATUS 值,例如下列其中一項:
傳回碼 | Description |
---|---|
STATUS_INVALID_DEVICE_OBJECT_PARAMETER | 指定的 DeviceObject 不會附加至檔案或目錄名稱中所指定磁碟區的檔案系統驅動程式堆疊。 如果名稱包含裝入點以外的重新分析點,也可能會發生此錯誤。 |
STATUS_MOUNT_POINT_NOT_RESOLVED | 檔案或目錄名稱包含裝入點,該裝入點會解析為附加指定 DeviceObject 的磁碟區。 |
STATUS_OBJECT_PATH_SYNTAX_BAD |
IoCreateFileSpecifyDeviceObjectHint 可能會傳回STATUS_FILE_LOCK_CONFLICT做為傳回值,或在 IoStatusBlock 參數所指向之IO_STATUS_BLOCK結構的 Status 成員中傳回。 只有在NTFS記錄檔已滿,且 IoCreateFileSpecifyDeviceObjectHint 嘗試處理這種情況時,才會發生此錯誤。
備註
文件系統篩選驅動程式會使用此例程,只將建立要求傳送至指定裝置物件和文件系統下方的篩選條件。 附加在驅動程式堆疊中指定裝置物件上方的篩選不會收到建立要求。
Windows Vista IoCreateFileEx 例程類似於 IoCreateFileSpecifyDeviceObjectHint 例程,但提供比 IoCreateFileSpecifyDeviceObjectHint 例程更高的功能,包括存取額外的建立參數 (ECP) 和交易資訊。
如果您使用 IoCreateFileEx 例程,而不是 IoCreateFileSpecifyDeviceObjectHint 例程,請注意,IoCreateFileSpecifyDeviceObjectHint 例程的 DriverContext 參數已移至 IO_DRIVER_CREATE_CONTEXT 結構的 DeviceObjectHint 成員。 IO_DRIVER_CREATE_CONTEXT 結構會透過其 DriverContext 參數傳遞至 IoCreateFileEx 例程。
文件系統篩選驅動程式會呼叫 IoCreateFileSpecifyDeviceObjectHint ,只將建立要求傳送至指定的裝置物件、其下方附加的篩選,以及文件系統。 附加在驅動程式堆疊中指定裝置物件上方的篩選不會收到建立要求。 IoCreateFileSpecifyDeviceObjectHint 所建立之檔案物件上的任何清除或關閉要求也是如此。
有兩種替代方式可用來指定要使用 IoCreateFileSpecifyDeviceObjectHint 建立或開啟的檔名:
作為完整路徑名稱,在輸入 ObjectAttributes 的 ObjectName 成員中提供
做為路徑名稱,相對於輸入 ObjectAttributes之 RootDirectory 成員中句柄所代表的目錄檔案
從 IoCreateFileSpecifyDeviceObjectHint 取得的任何句柄最終都必須藉由呼叫 ZwClose 來釋放。
在系統進程以外的進程內容中執行的驅動程式例程必須為IoCreateFileSpecifyDeviceObjectHint的 ObjectAttributes 參數設定 OBJ_KERNEL_HANDLE 屬性。 這會限制 使用IoCreateFileSpecifyDeviceObjectHint 所傳回的句柄,以核心模式執行的進程。 否則,進程可以在其內容中執行驅動程式的句柄來存取。
某些 DesiredAccess 旗標和旗標組合具有下列效果:
若要讓呼叫端等候傳回的 FileHandle 設定為 Signaled 狀態,以同步處理 I/O 完成,必須設定 SYNCHRONIZE 旗標。
如果只設定FILE_APPEND_DATA和SYNCHRONIZE旗標,則呼叫端只能寫入檔案結尾,而且會忽略寫入檔案的任何位移資訊。 不過,此類型的寫入作業將視需要自動擴充檔案。
設定檔案的FILE_WRITE_DATA旗標也可允許寫入超過檔案結尾的寫入。 此檔案也會針對這種類型的寫入自動擴充。
如果只設定FILE_EXECUTE和 SYNCHRONIZE 旗標,則呼叫端無法使用傳回的 FileHandle 直接讀取或寫入檔案中的任何數據;也就是說,檔案上的所有作業都會透過系統呼叫器進行,以回應指示和數據存取。
ShareAccess 參數會判斷個別線程是否可以同時存取相同的檔案。 如果這兩個檔案開啟者具有以指定方式存取檔案的許可權,則可以成功開啟和共用檔案。 如果 IoCreateFileSpecifyDeviceObjectHint 的原始呼叫端未指定FILE_SHARE_READ、FILE_SHARE_WRITE或FILE_SHARE_DELETE,則無法對檔案執行其他開啟作業:也就是說,原始呼叫端會獲得檔案的獨佔存取權。
為了讓共用檔案成功開啟,要求之 DesiredAccess 至檔案必須與先前所有尚未與 ZwClose 發行的 DesiredAccess 和 ShareAccess 規格相容。 也就是說,指定給 IoCreateFileSpecifyDeviceObjectHint 的 DesiredAccess 對於指定的檔案,不得與其他檔案開啟者不允許的存取衝突。
如果在 Options 參數中指定IO_IGNORE_SHARE_ACCESS_CHECK,I/O 管理員會忽略 ShareAccess 參數。 不過,檔案系統仍可能會執行存取檢查。 因此,請務必指定 ShareAccess 參數想要的共用模式,即使使用 IO_IGNORE_SHARE_ACCESS_CHECK 旗標也一樣。
處置值FILE_SUPERSEDE要求呼叫端具有現有檔案物件的 DELETE 存取權。 如果是的話,成功呼叫 IoCreateFileSpecifyDeviceObjectHint ,並在現有檔案上FILE_SUPERSEDE會有效地刪除該檔案,然後重新建立檔案。 這表示如果檔案已經由另一個線程開啟,它會指定 shareAccess 參數並設定FILE_SHARE_DELETE旗標,以開啟檔案。 請注意,這種類型的處置與覆寫檔案的POSIX樣式一致。
處置值FILE_OVERWRITE_IF和FILE_SUPERSEDE類似。 如果 IoCreateFileSpecifyDeviceObjectHint 是以現有的檔案和其中一個 處置 值呼叫,則會取代檔案。
覆寫檔案的語意相當於取代作業,但下列情況除外:
呼叫端必須具有檔案的寫入許可權,而不是刪除存取權。 這表示如果檔案已經由另一個線程開啟,它會開啟檔案,並在輸入 ShareAccess 中設定FILE_SHARE_WRITE旗標。
指定的檔案屬性在邏輯上為 ORed,且檔案上已有這些屬性。 這表示如果檔案已由另一個線程開啟, IoCreateFileSpecifyDeviceObjectHint 的後續呼叫端就無法停用現有的 FileAttributes 旗標,但可以啟用相同檔案的其他旗標。
CreateOptions FILE_DIRECTORY_FILE 值會指定要建立或開啟的檔案是目錄檔案。 建立目錄檔案時,文件系統會在磁碟上建立適當的結構,以代表該特定文件系統的磁碟上結構的空白目錄。 如果指定此選項且要開啟的指定檔案不是目錄檔案,或者呼叫端指定了不一致的 CreateOptions 或 Disposition 值, 則 IoCreateFileSpecifyDeviceObjectHint 的呼叫將會失敗。
CreateOptions FILE_NO_INTERMEDIATE_BUFFERING 旗標可防止文件系統代表呼叫端執行任何中繼緩衝。 指定此值會將呼叫端參數的某些限制放在其他 Zw。檔案 例程,包括下列專案:
任何傳遞至 ZwReadFile 或 ZwWriteFile 的位元組位移值都必須是基礎裝置的扇區大小的倍數。
傳遞至 ZwReadFile 或 ZwWriteFile 的 Length 必須是扇區大小的倍數。 請注意,如果傳輸期間到達檔尾,將讀取作業指定至緩衝區的長度與扇區大小完全相同,可能會導致傳送到該緩衝區的顯著位元組數目較少。
緩衝區必須符合基礎裝置的對齊需求。 您可以呼叫 IoCreateFileSpecifyDeviceObjectHint 來取得此資訊,以取得代表實體裝置的檔案物件句柄,然後使用該句柄呼叫 ZwQueryInformationFile 。 如需系統FILE_XXX_ALIGNMENT值的清單,請參閱 DEVICE_OBJECT。
呼叫 ZwSetInformationFile 並將 FileInformationClass 參數設定為 FilePositionInformation ,必須指定扇區大小的倍數位移。
互斥 的 CreateOptions,FILE_SYNCHRONOUS_IO_ALERT和FILE_SYNCHRONOUS_IO_NONALERT,只要透過傳回 的 FileHandle 所參考的檔案對象發生 I/O 作業,就會指定檔案上的所有 I/O 作業都是同步的。 這類檔案上的所有 I/O 都會使用傳回的句柄,跨所有線程串行化。 使用上述任一 CreateOptions 時,必須設定 DesiredAccess SYNCHRONIZE 旗標,讓 I/O 管理員將使用檔案對象作為同步處理物件。 其中一個 CreateOptions 設定後,I/O 管理員會維護檔案物件的「檔案位置內容」,也就是內部、目前的檔案位置位移。 此位移可用於呼叫 ZwReadFile 和 ZwWriteFile。 其位置也可以藉由呼叫 ZwQueryInformationFile 來查詢,或藉由呼叫 ZwSetInformationFile 來設定。
如果未指定 CreateOptions FILE_OPEN_REPARSE_POINT 旗標, 且 IoCreateFileSpecifyDeviceObjectHint 嘗試開啟具有重新分析點的檔案,則會發生檔案的正常重新分析點處理。 另一方面,如果指定FILE_OPEN_REPARSE_POINT旗標,則不會發生一般重新分析處理, 而且 IoCreateFileSpecifyDeviceObjectHint 會嘗試直接開啟重新分析點檔案。 在任一情況下,如果開啟作業成功, IoCreateFileSpecifyDeviceObjectHint 會傳回STATUS_SUCCESS;否則,例程會傳回NTSTATUS錯誤碼。 IoCreateFileSpecifyDeviceObjectHint 永遠不會傳回STATUS_REPARSE。
CreateOptions FILE_OPEN_REQUIRING_OPLOCK 旗標可排除開啟檔案和要求 oplock 之間的時間,這可能會讓第三方開啟檔案並取得共享違規。 應用程式可以在 IoCreateFileSpecifyDeviceObjectHint 上使用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。 若要使用它,您必須完成下列步驟:
使用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失敗。
如果建立要求成功,請要求 oplock。
開啟檔案的另一個句柄以執行 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 文件系統。
IoCreateFileSpecifyDeviceObjectHint 無法用來取得磁碟區的句柄。
如果傳遞至 IoCreateFileSpecifyDeviceObjectHint 的檔名路徑包含重新分析點,重新分析點必須解析為檔案或目錄所在的相同磁碟區。 如果沒有,則會傳回錯誤STATUS_INVALID_DEVICE_OBJECT_PARAMETER或STATUS_MOUNT_POINT_NOT_RESOLVED。
規格需求
需求 | 值 |
---|---|
目標平台 | Universal |
標頭 | ntddk.h (包含 Ntddk.h、Ntifs.h、FltKernel.h) |
程式庫 | NtosKrnl.lib |
Dll | NtosKrnl.exe |
IRQL | PASSIVE_LEVEL |