共用方式為


NtCreateNamedPipeFile 函式

建立並開啟特定具名管道之第一個實例的伺服器端控制碼,或現有具名管道的另一個實例。 函式會傳回可用來存取管道的控制碼。

語法

NTSTATUS NtCreateNamedPipeFile(
  [out]          PHANDLE            FileHandle,
  [in]           ULONG              DesiredAccess,
  [in]           POBJECT_ATTRIBUTES ObjectAttributes,
  [out]          PIO_STATUS_BLOCK   IoStatusBlock,
  [in]           ULONG              ShareAccess,
  [in]           ULONG              CreateDisposition,
  [in]           ULONG              CreateOptions,
  [in]           ULONG              NamedPipeType,
  [in]           ULONG              ReadMode,
  [in]           ULONG              CompletionMode,
  [in]           ULONG              MaximumInstances,
  [in]           ULONG              InboundQuota,
  [in]           ULONG              OutboundQuota,
  [in, optional] PLARGE_INTEGER     DefaultTimeout
);

參數

FileHandle [out]

如果呼叫成功,接收檔案控制碼的變數指標。

DesiredAccess [in]

旗標的位元遮罩,指定呼叫端所需的檔案或目錄存取類型。 這個系統定義的 DesiredAccess 旗標會決定下列檔案物件的特定存取權限。

旗標 描述
DELETE 檔案可以刪除。
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 可以寫入與檔案相關聯的擁有權資訊。
SYNCHRONIZE 呼叫端可以等候傳回的 FileHandle 設定為 Signaled 狀態,以同步處理 I/O 作業完成。 如果已設定CreateOptionsFILE_SYNCHRONOUS_IO_ALERTFILE_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_FILECreateOptions旗標設定) 目錄,您可以指定下列一或多個ACCESS_MASK旗標,也可以與先前所述的任何相容旗標結合。

想要存取目錄值 Description
FILE_LIST_DIRECTORY 目錄中的檔案可以列出。
FILE_TRAVERSE 您可以周遊目錄;也就是說,它可以是檔案路徑名稱的一部分。

FILE_READ_DATAFILE_WRITE_DATAFILE_EXECUTEFILE_APPEND_DATADesiredAccess旗標與建立或開啟目錄檔案不相容。

ObjectAttributes [in]

OBJECT_ATTRIBUTES 已由 InitializeObjectAttributes常式初始化之結構的指標。 如果呼叫端是在系統進程內容中執行,這個參數可以是 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 舊呼叫 NtCreateNamedPipeFile取得之目錄的選擇性控制碼。 如果此值為 Null, ObjectName 成員必須是包含目標檔案完整路徑的完整檔案規格。 如果這個值不是 Null, ObjectName 成員會指定相對於這個目錄的檔案名。
PSECURITY_DESCRIPTOR SecurityDescriptor 要套用至檔案的選擇性安全性描述元。 這類安全性描述元指定的 ACL 只會在建立檔案時套用至檔案。 如果建立檔案時值為 Null,則放置於檔案上的 ACL 會相依于檔案系統;大部分的檔案系統都會從與呼叫端的預設 ACL 結合的父目錄檔案傳播這類 ACL 的一部分。
ULONG 屬性 一組旗標,可控制檔案物件屬性。 如果呼叫端正在系統進程內容中執行,這個參數可以是零。 否則,呼叫端必須設定 OBJ_KERNEL_HANDLE 旗標。 呼叫端也可以選擇性地設定 OBJ_CASE_INSENSITIVE 旗標,這表示名稱查閱程式碼應該忽略 ObjectName 的大小寫,而不是執行完全相符的搜尋。

IoStatusBlock [out]

IO_STATUS_BLOCK 別變數的指標,可接收最終完成狀態和所要求作業的相關資訊。 從 NtCreateNamedPipeFile傳回時,變數的 Information 成員包含下列其中一個值:

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

ShareAccess [in]

指定呼叫端想要的檔案共用存取類型,做為零或一,或下列旗標的組合。 若要要求獨佔存取權,請將此參數設定為零。 若要協助您避免共用違規錯誤,請指定下列所有共用存取旗標。

ShareAccess 旗標 Description
FILE_SHARE_READ 檔案可以開啟以供其他執行緒的檔案建立呼叫進行讀取存取。
FILE_SHARE_WRITE 檔案可以開啟以供其他執行緒的檔案建立呼叫進行寫入存取。
FILE_SHARE_DELETE 檔案可以開啟以供其他執行緒的檔案建立呼叫刪除存取。

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

CreateDisposition [in]

值,決定檔案已經存在時應如何處理檔案。 CreateDisposition 可以是下列其中一項:

描述
FILE_SUPERSEDE 如果檔案已經存在,請將它取代為指定的檔案。 如果不存在,請建立指定的檔案。
FILE_CREATE 如果檔案已經存在,請失敗要求,且不會建立或開啟指定的檔案。 如果不存在,請建立指定的檔案。
FILE_OPEN 如果檔案已經存在,請開啟它,而不是建立新的檔案。 如果不存在,請失敗要求,而且不要建立新的檔案。
FILE_OPEN_IF 如果檔案已經存在,請加以開啟。 如果不存在,請建立指定的檔案。
FILE_OVERWRITE 如果檔案已經存在,請加以開啟並加以覆寫。 如果不存在,請失敗要求。
FILE_OVERWRITE_IF 如果檔案已經存在,請加以開啟並加以覆寫。 如果不存在,請建立指定的檔案。

CreateOptions [in]

指定建立或開啟檔案時要套用的選項,做為下列旗標的相容組合。

CreateOptions 旗標 Description
FILE_DIRECTORY_FILE (0x00000001) 正在建立或開啟的檔案是目錄檔案。 使用此旗標時,Disposition 參數必須設定為 、 FILE_OPENFILE_OPEN_IFFILE_CREATE 其中一個。 與這個旗標相容的CreateOptions旗標如下所示: FILE_SYNCHRONOUS_IO_ALERT 、、 FILE_SYNCHRONOUS_IO_NONALERTFILE_WRITE_THROUGHFILE_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 系統維護檔案位置內容。 如果設定此旗標,也必須設定DesiredAccessSYNCHRONIZE 旗標,以便 I/O 管理員使用檔案物件做為同步處理物件。
FILE_SYNCHRONOUS_IO_NONALERT (0x00000020) 檔案上的所有作業都會同步執行。 在系統中等候同步處理 I/O 佇列和完成,不受警示約束。 此旗標也會讓 I/O 系統維護檔案位置內容。 如果設定此旗標,也必須設定DesiredAccessSYNCHRONIZE 旗標,以便 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) 的商機鎖定會要求為單一不可部分完成的作業。 檔案系統在執行建立作業之前會檢查 oplocks,如果建立作業會中斷現有的 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) 檔案或裝置正以會話感知開啟。 如果未指定此旗標,則每個會話裝置 (例如使用 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) 此旗標會指示檔案系統擷取與呼叫執行緒相關聯的使用者。 使用傳回的控制碼對 FltQueryVolumeInformationZwQueryVolumeInformationFile 的任何後續呼叫都會假設擷取的使用者,而不是在當時呼叫的使用者,以計算呼叫端可用的可用空間。 這適用于下列 FsInformationClass 值: FileFsSizeInformationFileFsFullSizeInformationFileFsFullSizeInformationEx

NamedPipeType [in]

建立 (位元組類型或訊息類型) 的具名管道類型。

ReadMode [in]

讀取管道 (位元組類型或訊息類型) 的模式。

CompletionMode [in]

指定作業完成的方式。

MaximumInstances [in]

具名管道同時實例的數目上限。

InboundQuota [in]

指定保留給寫入具名管道輸入端的集區配額。

OutboundQuota [in]

指定保留給寫入具名管道輸入端的集區配額。

DefaultTimeout [in, optional]

當等候具名管道的實例時,如果未指定逾時值,則為逾時值的選擇性指標。

傳回

函式值是建立/開啟作業的最終狀態。

備註

若要建立具名管道的實例,使用者必須具有具名管道物件的 FILE_CREATE_PIPE_INSTANCE 存取權。 如果要建立新的具名管道,則從安全性屬性參數 (ACL) 的存取控制清單會定義具名管道的任意存取控制。

具名管道的所有實例都必須指定相同的管道類型 (位元組類型或訊息類型) 、管道存取 (雙工、輸入或輸出) 、實例計數和逾時值。 如果使用不同的值,此函式會失敗,而且 GetLastError傳回ERROR_ACCESS_DENIED

用戶端進程會使用 CreateFileCallNamedPipe 函式連接到具名管道。 具名管道的用戶端會以位元組模式啟動,即使伺服器端處於訊息模式也一樣。 若要避免接收資料時發生問題,也請將用戶端設定為訊息模式。 若要變更管道的模式,管道用戶端必須開啟具有 GENERIC_READFILE_WRITE_ATTRIBUTES存取的 唯讀管道。

管道伺服器不應該執行封鎖讀取作業,直到管道用戶端啟動為止。 否則,可能會發生競爭狀況。 這通常會發生在初始化程式碼,例如 C 執行時間時,需要鎖定並檢查繼承的控制碼時。

每次建立具名管道時,系統會使用非分頁集區建立輸入和輸出緩衝區,這是核心所使用的實體記憶體。 管道實例數目 (以及執行緒和進程等物件,) 您可以建立的管線實例數目受限於可用的非分頁集區。 每個讀取或寫入要求都需要緩衝區中讀取或寫入資料的空間,再加上內部資料結構的額外空間。

輸入和輸出緩衝區大小是諮詢。 保留給具名管道每一端的實際緩衝區大小是系統預設值、系統最小值或最大值,或指定的大小四捨五入到下一個配置界限。 指定的緩衝區大小應該夠小,您的進程不會用盡非分頁集區,但足以容納一般要求。

每當發生管道寫入作業時,系統會先嘗試對管道寫入配額收取記憶體費用。 如果剩餘的管道寫入配額足以滿足要求,則寫入作業會立即完成。 如果剩餘的管道寫入配額太小而無法滿足要求,系統會嘗試擴充緩衝區,以使用保留給進程的非分頁集區來容納資料。 寫入作業會封鎖,直到從管道讀取資料,以便釋放額外的緩衝區配額。 因此,如果您的指定緩衝區大小太小,系統會視需要增加緩衝區,但缺點是作業將會封鎖。 如果作業重迭,則會封鎖系統執行緒;否則,會封鎖應用程式執行緒。

若要釋放具名管道所使用的資源,當不再需要這些資源時,應用程式應該一律關閉控制碼,這可藉由呼叫 CloseHandle 函式或與實例控制碼相關聯的進程結束時完成。 請注意,具名管道的實例可能有一個以上的控制碼與其相關聯。 關閉具名管道實例的最後一個控制碼時,一律會刪除具名管道的實例。

規格需求

需求
標頭 ntioapi.h
程式庫 ntdll.lib