序列 IRP 主要函式代碼
本主題記載序列 IRP 主要函式程式碼。
標頭:Wdm.h (包含 Wdm.h 或 Ntddk.h)
IRP_MJ_CREATE
IRP_MJ_CREATE要求會開啟序列裝置。
何時傳送
用戶端必須先開啟序列裝置,才能存取埠或連線到埠的裝置。
輸入參數
無。
輸出參數
無。
I/O 狀態區塊
[資訊] 欄位設定為零。
[ 狀態 ] 欄位會設定為下列其中一個值:
狀態值 | 描述 |
---|---|
STATUS_SUCCESS | 已成功開啟序列裝置。 |
STATUS_ACCESS_DENIED | 裝置已經開啟。 |
STATUS_DELETE_PENDING | 序列正在移除裝置。 |
STATUS_INSUFFICIENT_RESOURCES | 裝置未處於 隨插即用 啟動狀態,或驅動程式無法配置內部數據結構。 |
STATUS_NOT_A_DIRECTORY | 序列裝置無法開啟為目錄。 |
STATUS_PENDING | 序列已將要求排入佇列以供稍後處理。 |
STATUS_SHARED_IRQ_BUSY | 指派給裝置的中斷正由另一個開啟的裝置使用。 |
作業
必須先開啟序列裝置,才能使用它。 序列裝置是獨佔裝置;在任何指定的時間,只能在埠上開啟一個檔案。
IRP_MJ_DEVICE_CONTROL
IRP_MJ_DEVICE_CONTROL要求會操作序列埠。
何時傳送
用戶端會使用裝置控制要求來:
- 取得埠的相關信息
- 取得和設定快取器
- 取得和設定作業模式
如需 Serial 所支援之裝置控制要求的描述,請參閱 ntddser.h 標頭。
輸入參數
要求特定
輸出參數
要求特定
I/O 狀態區塊
要求特定
作業
要求特定
IRP_MJ_FLUSH_BUFFERS
IRP_MJ_FLUSH_BUFFER要求會排清序列裝置的內部寫入緩衝區。
何時傳送
用戶端會使用排清要求來判斷 Serial 何時完成用戶端在排清要求之前傳送的所有寫入要求。
輸入參數
無。
輸出參數
無。
I/O 狀態區塊
Information 成員會設定為零。
Status 成員會設定為下列其中一個狀態值:
狀態值 | 描述 |
---|---|
STATUS_SUCCESS | 要求已順利完成。 |
STATUS_CANCELLED | 用戶端已取消要求。 如果發生裝置錯誤,序列也會取消要求,而 Serial 設定為在發生裝置錯誤時取消要求。 |
STATUS_DELETE_PENDING | 驅動程式正在移除裝置。 |
STATUS_PENDING | 序列已將要求排入佇列以供稍後處理。 |
作業
序列佇列並開始處理寫入和排清要求的順序,以接收要求的順序。 序列會在呼叫 IoCompleteRequest 之後完成排清要求,以取得在排清要求之前收到的所有寫入要求。 不過,完成排清要求並不表示裝置堆疊中的其他驅動程式已完成所有先前啟動的寫入要求。 例如,篩選驅動程式可能仍在處理寫入要求。 客戶端必須在用戶端嘗試釋放或重複使用寫入要求的 IRP 之前,檢查裝置堆疊中的所有驅動程式是否已完成寫入要求。
IRP_MJ_INTERNAL_DEVICE_CONTROL
IRP_MJ_INTERNAL_DEVICE_CONTROL要求會在序列裝置上設定內部作業模式。
何時傳送
用戶端會使用內部裝置控制要求來:
- 取得和重設基本設定
- 控制等候/喚醒作業
如需內部裝置控制要求的描述,請參閱 ntddser.h 標頭。
輸入參數
要求特定
輸出參數
要求特定
I/O 狀態區塊
要求特定
作業
要求特定
IRP_MJ_PNP
IRP_MJ_PNP要求支援 隨插即用。
何時傳送
PnP 管理員會傳送IRP_MJ_PNP要求來查詢裝置,以及啟動、停止和移除裝置。
輸入參數
要求特定
輸出參數
要求特定
I/O 狀態區塊
要求特定
作業
序列支援下列 隨插即用 要求:
- IRP_MN_CANCEL_REMOVE_DEVICE
- IRP_MN_CANCEL_STOP_DEVICE
- IRP_MN_FILTER_RESOURCE_REQUIREMENTS
- IRP_MN_QUERY_CAPABILITIES
- IRP_MN_QUERY_DEVICE_RELATIONS
- IRP_MN_QUERY_ID
- IRP_MN_QUERY_PNP_DEVICE_STATE
- IRP_MN_QUERY_REMOVE_DEVICE
- IRP_MN_QUERY_RESOURCE_REQUIREMENTS
- IRP_MN_QUERY_STOP_DEVICE
- IRP_MN_REMOVE_DEVICE
- IRP_MN_START_DEVICE
- IRP_MN_STOP_DEVICE
- IRP_MN_SURPRISE_REMOVAL
序列會在裝置堆疊下傳送所有其他 隨插即用 要求,而不需進一步處理。
序列會針對 隨插即用 要求執行下列序列特定處理:
IRP_MN_QUERY_ID (類型 BusQueryHardwardIDs)
如果序列裝置位於多埠 ISA 記憶卡上,則 Serial 會將寬字元字串 「*PNP0502」 附加至硬體識別碼的字串。
IRP_MN_FILTER_RESOURCE_REQUIREMENTS
多埠 ISA 記憶卡上的序列裝置會共用相同的中斷狀態緩存器和相同的中斷。
如需 隨插即用 要求的一般作業描述,請參閱 隨插即用 次要 IRP。
IRP_MJ_POWER
IRP_MJ_POWER要求控制電源管理。
何時傳送
電源管理員會使用電源要求來查詢和設定電源狀態。
輸入參數
要求特定
輸出參數
要求特定
I/O 狀態區塊
要求特定
作業
序列支援下列電源要求:
序列會將裝置堆疊的所有其他電源要求向下傳送,以由較低層級的驅動程式完成。
序列是序列裝置堆疊的預設電源原則擁有者,其使用 Serial 作為函式驅動程式或較低層級的篩選驅動程式。
如需這些要求的泛型作業詳細資訊,請參閱 處理電源 IRP 的規則。
IRP_MJ_QUERY_INFORMATION
IRP_MJ_QUERY_INFORMATION要求會查詢序列裝置的檔案結束資訊。
何時傳送
用戶端會使用查詢資訊要求來取得在序列裝置上開啟之檔案的標準資訊和位置資訊。
輸入參數
Parameters.QueryFile.FileInformationClass 設定為 FileStandardInformation 或 FilePositionInformation。
輸出參數
參數 | Description |
---|---|
FileStandardInformation | AssociatedIrp.SystemBuffer 成員會指向串行用來輸出標準資訊的用戶端配置FILE_STANDARD_INFORMATION結構。 |
FilePositionInformation | AssociatedIrp.SystemBuffer 成員會指向用戶端配置的FILE_POSITION_INFORMATION結構,而 Serial 會用來輸出位置資訊。 |
I/O 狀態區塊
如果要求成功, 信息 成員會設定為零。
Status 成員會設定為下列其中一個狀態值:
狀態值 | 描述 |
---|---|
STATUS_SUCCESS | 要求已順利完成。 |
STATUS_CANCELLED | 用戶端已取消要求。 如果發生裝置錯誤,序列也會取消要求,而 Serial 設定為在發生裝置錯誤時取消要求。 |
STATUS_DELETE_PENDING | 序列正在移除裝置。 |
STATUS_INVALID_PARAMETER | 不支援要求的資訊。 |
STATUS_PENDING | 序列已將要求排入佇列以供稍後處理。 |
作業
Serial 支援 FileStandardInformation 和 FilePositionInformation 類型的要求。
標準檔案資訊一律會視情況設定為零或 FALSE。 位置資訊一律設定為零。
IRP_MJ_READ
IRP_MJ_READ要求會將數據從序列裝置傳輸到用戶端。
何時傳送
每當客戶端讀取序列裝置上的數據時,用戶端就會使用讀取要求。
輸入參數
Parameters.Read.Length 成員會設定為要傳送至用戶端讀取緩衝區的位元組數目。
輸出參數
AssociatedIrp.SystemBuffer 成員會指向用戶端配置的讀取緩衝區,而 Serial 會複製序列裝置上讀取的數據。
I/O 狀態區塊
信息成員會設定為傳送至用戶端讀取緩衝區的位元組數目。
Status 成員會設定為下列其中一個值:
狀態值 | 描述 |
---|---|
STATUS_SUCCESS | 要求已順利完成。 |
STATUS_CANCELLED | 用戶端已取消要求。 如果發生裝置錯誤,序列也會取消要求,而 Serial 設定為在發生裝置錯誤時取消要求。 |
STATUS_DELETE_PENDING | 序列正在移除裝置。 |
STATUS_PENDING | 序列已將要求排入佇列,以供稍後處理。 |
STATUS_TIMEOUT | 完成要求的時間超過總逾時值或時間間隔逾時值。 |
作業
用戶端可以使用逾時事件來終止讀取要求。 不過請注意,開啟序列裝置時,裝置的逾時設定是未定義的。 內核模式用戶端可以使用 IOCTL_SERIAL_INTERNAL_BASIC_SETTINGS 將逾時參數設定為零, (不使用逾時事件) 。 使用者模式和內核模式用戶端可以使用 IOCTL_SERIAL_SET_TIMEOUTS 要求來設定逾時參數。
如需讀取和寫入逾時的詳細資訊,請參閱 設定序列裝置的讀取和寫入逾時。
IRP_MJ_SET_INFORMATION
IRP_MJ_SET_INFORMATION要求會設定序列裝置的檔案結尾資訊。
何時傳送
用戶端會使用集合資訊要求來變更在序列裝置上開啟之檔案的目前檔尾位置。
輸入參數
Parameters.SetFile.FileInformationClass 成員會設定為 FileEndOfFileInformation 或 FileAllocationInformation。
輸出參數
無。
I/O 狀態區塊
如果要求成功, Information 成員會設定為零。
Status 成員會設定為下列其中一個狀態值:
狀態值 | 描述 |
---|---|
STATUS_SUCCESS | 要求已順利完成。 |
STATUS_CANCELLED | 用戶端已取消要求。 如果發生裝置錯誤,序列也會取消要求,而且如果發生裝置錯誤,則 Serial 會設定為取消要求。 |
STATUS_DELETE_PENDING | 序列正在移除裝置。 |
STATUS_INVALID_PARAMETER | 不支援指定的檔尾資訊。 |
STATUS_PENDING | 序列已將要求排入佇列,以供稍後處理。 |
作業
Serial 支援 FileEndOfFileInformation 和 FileAllocationInformation 類型的要求。 不過,Serial 不會實際設定檔案資訊。 檔尾位置一律設定為零。
IRP_MJ_SYSTEM_CONTROL
IRP_MJ_SYSTEM_CONTROL要求支援 WMI 要求。
何時傳送
WMI 核心模式元件可以在串行登錄為序列裝置的 WMI 提供者之後,隨時傳送IRP_MJ_SYSTEM_CONTROL要求。 當使用者模式數據取用者要求 WMI 數據時,通常會傳送 WMI IRP。
輸入參數
要求特定
輸出參數
要求特定
I/O 狀態區塊
針對 WMI 要求,Serial 會將 [狀態] 欄位設定為下列其中一個值:
狀態值 | 描述 |
---|---|
STATUS_SUCCESS | 要求已順利完成。 |
STATUS_BUFFER_TOO_SMALL | 輸出緩衝區的大小,以位元組為單位,小於要求資訊的必要大小。 |
STATUS_INSUFFICIENT_RESOURCES | 系統資源不足,無法儲存串行埠名稱。 |
STATUS_INVALID_DEVICE_REQUEST | 要求無效。 |
STATUS_WMI_GUID_NOT_FOUND | 不支援 WMI GUID。 |
作業
序列會使用 WmiSystemControl 來處理 WMI 系統控制要求。 序列會註冊下列類型的 WMI 連結庫回呼例程, WmiSystemControl 會呼叫此例程來處理傳送至裝置的 WMI 要求:
序列不支援任何其他系統控制要求。 針對非 WMI 要求,Serial 會略過目前的堆疊位置,並將要求向下傳送到裝置堆疊。
序列會註冊下表所述的 WMI GUIDS。
序列 WMI GUID 相關聯的數據結構
SERIAL_PORT_WMI_NAME_GUID | USHORT 後面接著 WCSTR |
---|---|
SERIAL_PORT_WMI_COMM_GUID | SERIAL_WMI_COMM_DATA |
SERIAL_PORT_WMI_HW_GUID | SERIAL_WMI_HW_DATA |
SERIAL_PORT_WMI_PERF_GUID | SERIAL_WMI_PERF_DATA |
SERIAL_PORT_WMI_PROPERTIES_GUID | WMI_SERIAL_PORT_PROPERTIES |
序列裝置的 WMI 名稱是裝置 隨插即用 登錄機碼下 PortName 專案值的值。
IRP_MJ_WRITE
IRP_MJ_WRITE要求會將數據從用戶端傳輸到序列裝置。
何時傳送
每當客戶端將數據寫入序列裝置時,就會使用寫入要求。
輸入參數
Parameters.Write.Length 成員會設定為要從用戶端配置的寫入緩衝區複製到序列裝置的位元元組數目。
AssociatedIrp.SystemBuffer 成員會指向用戶端配置的寫入緩衝區,其中 Serial 會將數據複製到序列裝置。
輸出參數
無。
I/O 狀態區塊
信息成員會設定為實際從用戶端寫入緩衝區複製到序列裝置的位元元組數目。
Status 成員會設定為下列其中一個值:
狀態值 | 描述 |
---|---|
STATUS_SUCCESS | 要求已順利完成。 |
STATUS_CANCELLED | 用戶端已取消要求。 如果發生裝置錯誤,序列也會取消要求,而且如果發生裝置錯誤,則 Serial 會設定為取消要求。 |
STATUS_DELETE_PENDING | 序列正在移除裝置。 |
STATUS_PENDING | 序列已將要求排入佇列,以供稍後處理。 |
STATUS_TIMEOUT | 超過寫入要求所允許的總時間。 |
作業
用戶端可以使用逾時事件來終止寫入要求。 不過請注意,開啟序列裝置時,裝置上設定的逾時事件是未定義的。 內核模式用戶端可以使用 IOCTL_SERIAL_INTERNAL_BASIC_SETTINGS 將逾時參數設定為零, (不會) 使用逾時事件,以及設定逾時參數 IOCTL_SERIAL_SET_TIMEOUTS 要求。 如需讀取和寫入逾時的詳細資訊,請參閱 設定序列裝置的讀取和寫入逾時。