并口的IOCTL讲解

来源:互联网 发布:刀剑乱舞短刀极化数据 编辑:IT博客网 时间:2018/11/16 13:34

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.