Not pending:直接处理
1.IOCTL_PAR_QUERY_LOCATION
获取设备链接名,形式为LPTn
Symblicname形式为/DosDevice/LPTn
若输出缓冲区小于Location字节长度,则返回STATUS_BUFFER_TOO_SMALL,否则,返回Location
2. IOCTL_SERIAL_GET_TIMEOUTS
获取超时结构,超时结构保存在设备扩展中,由设置超时的IOCTL来设置。
3. IOCTL_PAR_IS_PORT_FREE
查询该IRP处理时,该并口是否是FREE状态
通过设备扩展中的bAllocated变量来判断,并返回TRUE/FALSE信息
若bAllocated= TURE,代表没有其他人用于该并口,该并口是FREE状态的,返回FALSE信息到systembuffer
若bAllocated= FALSE,则再通过对该并口的分配与释放操作来判断是否有其他设备占有该并口
首先,先分配该并口TryAllocatePort
若成功则释放该并口FreePort,返回TRUE信息
若失败则返回FALSE
bAllocated:
当并口设备被select后,该变量被置为TRUE
当并口设备被deselect后,该变量被置为FALSE
4. IOCTL_PAR_GET_READ_ADDRESS
获取读地址IOCTL_PAR_SET_READ_ADDRESS为ECP或者EPP设置读地址
保存在Pdx->ReverseInterfaceAddress
5. IOCTL_PAR_GET_WRITE_ADDRESS
获取写地址IOCTL_PAR_SET_WRITE_ADDRESS为ECP或者EPP设置写地址
保存在Pdx->ForwardInterfaceAddress
6. IOCTL_IEEE1284_GET_MODE
获取此时使用的读写模式
根据Pdx->IdxReverseProtocol在arpReverse中提取读模式
根据Pdx->IdxForwardProtocol在afpForward中提取读模式
7. IOCTL_PAR_GET_DEFAULT_MODES
获取默认模式读为空写为兼容模式CENTRONICS
8. IOCTL_PAR_ECP_HOST_RECOVERY
设置是否允许ECPHw模式端口的恢复操作
保存在Pdx->bIsHostRecoverSupported变量
当ECP模式在设置读写读地址的时候,若是通过测试ECR发现设备有错误,则需要回复ECP端口设置。
Pending:需要挂起之后再处理
9. IOCTL_PAR_SET_INFORMATION
应用程序发送该IRP,用于重置或初始化并口
该IRP在缓冲区中带来一个PAR_SET_INFORMATION的结构数据,指明要初始化
通过向Pdx->Controller地址写入初始化值,让并口设备进行初始化。
若设备初始化失败,则返回具体的失败原因到status。
STATUS_DEVICE_OFF_LINE
STATUS_DEVICE_NOT_CONNECTED
STATUS_DEVICE_PAPER_EMPTY
STATUS_DEVICE_POWERED_OFF
10. IOCTL_PAR_QUERY_INFORMATION
应用程序查询并口设备的状态 应用程序在缓冲区传过来一个PAR_QUERY_INFORMATION结构空间
获取状态寄存器,通过状态寄存器获取设备的状态
将设备状态保存到PAR_QUERY_INFORMATION结构中,返回给应用程序。
11. IOCTL_SERIAL_SET_TIMEOUTS
设置超时
12. IOCTL_PAR_QUERY_DEVICE_ID
应用程序发送该IRP用于查询设备的ID
驱动将在缓冲区中填入:
ID号、一个NULL字节
I/O Status Block:
设置状态Status
STATUS_SUCCESS
STATUS_BUFFER_TOO_SMALL
STATUS_IO_DEVICE_ERROR
若查询成功,Information设置为ID+NULL长度,
若查询失败,Information设置为0
在NIBBLE MODE模式下获取设备ID,在ID后面还追加一个NULL
13.IOCTL_PAR_QUERY_RAW_DEVICE_ID
应用程序发送该IRP用于查询设备的ID以及该ID的长度
驱动将在缓冲区中填入:
ID的长度(两个字节)、ID号、一个NULL字节
I/OStatus Block: 设置状态到Status
STATUS_SUCCESS
STATUS_BUFFER_TOO_SMALL
STATUS_IO_DEVICE_ERROR
若查询成功,Information设置为2个字节+ID+NULL长度,
若查询失败,Information设置为0
14.IOCTL_PAR_QUERY_DEVICE_ID_SIZE
应用程序发送该IRP用于查询设备的ID的长度(加上一个NULL) 缓冲区指向一个PAR_DEVICE_ID_SIZE_INFORMATION结构内存 驱动查询ID长度成功后,讲长度保存到改结构中I/O Status Block: 设置状态到Status
STATUS_SUCCESS
若查询成功,Information设置为PAR_DEVICE_ID_SIZE_INFORMATION长度,
若查询失败,Information设置为0
在NIBBLEMODE模式下获取设备ID
15. IOCTL_PAR_SET_READ_ADDRESS
应用程序发送该IRP,用于设置读地址。
驱动从缓冲区中提取读地址信息,保存到设备扩展的ReverseInterfaceAddress变量中
并设置设备扩展的SetReverseAddress变量为TRUE,表示读地址被设置。
16. IOCTL_PAR_SET_WRITE_ADDRESS
应用程序发送该IRP,用于设置写地址。 驱动从缓冲区中提取写地址信息, 保存到设备扩展的ForwardInterfaceAddress变量中
并设置设备扩展的SetReverseAddress变量为TRUE,表示读地址被设置。
17. IOCTL_PAR_GET_DEVICE_CAPS
应用程序发送该IRP,用于设定并口驱动不能使用的模式,并获取并口驱动支持的模式。
在输入缓冲区中,应用程序保存着禁止的模式信息,驱动提取信息,保存到设备扩展中。
在输出缓冲区,驱动遍历所有模式,并将支持的模式保存到设备扩展与缓冲区。
I/O Status Block: 设置状态到Status
STATUS_SUCCESS
Information设置为USHORT长度,
18. IOCTL_IEEE1284_NEGOTIATE
应用程序发送该IRP,用于与设备进行协商,决定使用何种输入输出模式。
应用程序提供一些输入输出方式供驱动选择,驱动从中挑选出速度最快、并且并口设备与电脑都支持的模式。
有一下模式,速度依次递减:
BOUNDED_ECP_REVERSE = REVERSE_FASTEST, // 0
ECP_HW_REVERSE_NOIRQ, //1
EPP_HW_REVERSE, // 2
EPP_SW_REVERSE, // 3
ECP_SW_REVERSE, . // 4
BYTE_MODE, //5
NIBBLE_MODE, //6
CHANNELIZED_NIBBLE_MODE, // 7
应用程序在缓冲区中传入一个PARCLASS_NEGOTIATION_MASK结构,保存着可供选择的输入输出模式。
驱动提取信息,判断这些模式是否支持, 当提供选择的输入输出模式都不被支持,驱动则设置模式为FORWARD_NONE与REVERSE_NONE。
若协商成功,则保存选中的模式到缓冲区的PARCLASS_NEGOTIATION_MASK结构内存中,并返回STATUS_SUCCESS到STATUS,设置Information的长度为PARCLASS_NEGOTIATION_MASK长度。
若协商失败,则返回失败状态到STATUS,并设置Information为0.