串行 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 状态块
信息成员设置为零。
Status 成员设置为以下状态值之一:
状态值 | 说明 |
---|---|
STATUS_SUCCESS | 请求已成功完成。 |
STATUS_CANCELLED | 客户端取消了请求。 如果发生设备错误,串行还会取消请求;串行配置为在出现设备错误时取消请求。 |
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
串行将所有其他即插即用请求发送到设备堆栈,而无需进一步处理。
Serial 对即插即用请求执行以下特定于串行的处理:
IRP_MN_QUERY_ID (类型 BusQueryHardwardIDs)
如果串行设备位于多端口 ISA 卡上,则 Serial 会将宽字符字符串“*PNP0502”追加到硬件 ID 字符串。
IRP_MN_FILTER_RESOURCE_REQUIREMENTS
多端口 ISA 上的串行设备卡共享相同的中断状态寄存器和相同的中断。
有关即插即用请求的泛型操作的说明,请参阅即插即用次要 IRP。
IRP_MJ_POWER
IRP_MJ_POWER请求控制电源管理。
发送时间
电源管理器使用电源请求来查询和设置电源状态。
输入参数
请求特定
输出参数
请求特定
I/O 状态块
请求特定
操作
串行支持以下电源请求:
串行向设备堆栈向下发送所有其他电源请求,以便由较低级别的驱动程序完成。
串行是使用串行作为函数驱动程序或较低级别筛选器驱动程序的串行设备堆栈的默认电源策略所有者。
有关这些请求的一般操作的详细信息,请参阅 处理电源 IRP 的规则。
IRP_MJ_QUERY_INFORMATION
IRP_MJ_QUERY_INFORMATION请求查询串行设备的文件结束信息。
发送时间
客户端使用查询信息请求来获取有关在串行设备上打开的文件的标准信息和位置信息。
输入参数
Parameters.QueryFile.FileInformationClass 设置为 FileStandardInformation 或 FilePositionInformation。
输出参数
参数 | 说明 |
---|---|
FileStandardInformation | AssociatedIrp.SystemBuffer 成员指向客户端分配的FILE_STANDARD_INFORMATION结构,Serial 使用该结构来输出标准信息。 |
FilePositionInformation | AssociatedIrp.SystemBuffer 成员指向客户端分配的 FILE_POSITION_INFORMATION 结构,Serial 使用该结构来输出位置信息。 |
I/O 状态块
如果请求成功,则 信息 成员设置为零。
Status 成员设置为以下状态值之一:
状态值 | 说明 |
---|---|
STATUS_SUCCESS | 请求已成功完成。 |
STATUS_CANCELLED | 客户端取消了请求。 如果发生设备错误,串行还会取消请求,串行配置为在出现设备错误时取消请求。 |
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 | 客户端取消了请求。 如果发生设备错误,串行还会取消请求,串行配置为在出现设备错误时取消请求。 |
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 状态块
如果请求成功,则 信息 成员设置为零。
Status 成员设置为以下状态值之一:
状态值 | 说明 |
---|---|
STATUS_SUCCESS | 请求已成功完成。 |
STATUS_CANCELLED | 客户端取消了请求。 如果发生设备错误,串行还会取消请求,串行配置为在出现设备错误时取消请求。 |
STATUS_DELETE_PENDING | 串行正在删除设备。 |
STATUS_INVALID_PARAMETER | 不支持指定的文件结束信息。 |
STATUS_PENDING | 串行已将请求排队等待以后处理。 |
操作
Serial 支持 FileEndOfFileInformation 和 FileAllocationInformation 类型的请求。 但是,串行实际上不会设置文件信息。 文件末尾位置始终设置为零。
IRP_MJ_SYSTEM_CONTROL
IRP_MJ_SYSTEM_CONTROL请求支持 WMI 请求。
发送时间
在串行注册为串行设备的 WMI 提供程序后,WMI 内核模式组件可以随时发送IRP_MJ_SYSTEM_CONTROL请求。 当用户模式数据使用者请求 WMI 数据时,通常会发送 WMI IRP。
输入参数
请求特定
输出参数
请求特定
I/O 状态块
对于 WMI 请求,Serial 将 Status 字段设置为以下值之一:
状态值 | 说明 |
---|---|
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 请求,串行会跳过当前堆栈位置,并将请求向下发送到设备堆栈。
串行注册下表中所述的 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 成员指向客户端分配的写入缓冲区,串行从该缓冲区将数据复制到串行设备。
输出参数
无。
I/O 状态块
信息成员设置为实际从客户端的写入缓冲区复制到串行设备的字节数。
Status 成员设置为以下值之一:
状态值 | 说明 |
---|---|
STATUS_SUCCESS | 请求已成功完成。 |
STATUS_CANCELLED | 客户端取消了请求。 如果发生设备错误,串行还会取消请求;串行配置为在出现设备错误时取消请求。 |
STATUS_DELETE_PENDING | 串行正在删除设备。 |
STATUS_PENDING | 串行将请求排在队列中,供以后处理。 |
STATUS_TIMEOUT | 超过了写入请求允许的总时间。 |
操作
客户端可以使用超时事件来终止写入请求。 但请注意,打开串行设备时,设备上设置的超时事件是未定义的。 内核模式客户端可以使用 IOCTL_SERIAL_INTERNAL_BASIC_SETTINGS 将超时参数设置为零, (不使用超时事件) 和 IOCTL_SERIAL_SET_TIMEOUTS 请求来设置超时参数。 有关读取和写入超时的详细信息,请参阅 设置串行设备的读取和写入超时。