本文章的前置文章为:
windows 驱动编写原则
windows COM驱动 案例
windows COM驱动的I/O处理
在前面的设计中,主要是对windows提供的VirtualSerial源代码的讲解,但是那个驱动其实是一个空壳驱动,用于学习的,在I/O处理中,也讲述了serial I/O处理的本质,接下来会将这些知识应用到实际中,完整的代码正在审核,审核完成后会上传。
需求
在很多windows 外接的开发板的调试中,日志端口被虚拟成一个RS232的UART,在设备管理器中看起来像这样:
而日志端口的输出往往是这样:
很明显,之前的VirtualSerial驱动不能在一些通用软件(sscom或者UartAssist上使用) ,那么怎么改造它呢?
从驱动中反推应用代码
如果我们在DeviceIoControl代码中,对所有的IOCTL打印的话,那么我们会发现通用软件至少会调用下面的IOCTL:
DeviceIoControl IOCTL_SERIAL_SET_WAIT_MASK IOCTL = 0x1b0044DeviceIoControl IOCTL_SERIAL_SET_QUEUE_SIZE IOCTL = 0x1b0008DeviceIoControl IOCTL_SERIAL_GET_BAUD_RATE IOCTL = 0x1b0050DeviceIoControl IOCTL_SERIAL_GET_LINE_CONTROL IOCTL = 0x1b0054DeviceIoControl IOCTL_SERIAL_GET_CHARS IOCTL = 0x1b0058DeviceIoControl IOCTL_SERIAL_GET_HANDFLOW IOCTL = 0x1b0060DeviceIoControl IOCTL_SERIAL_SET_BAUD_RATE IOCTL = 0x1b0004DeviceIoControl IOCTL_SERIAL_SET_RTS IOCTL = 0x1b0030DeviceIoControl IOCTL_SERIAL_SET_DTR IOCTL = 0x1b0024DeviceIoControl IOCTL_SERIAL_SET_LINE_CONTROL IOCTL = 0x1b000cDeviceIoControl IOCTL_SERIAL_SET_CHARS IOCTL = 0x1b005cDeviceIoControl IOCTL_SERIAL_SET_HANDFLOW IOCTL = 0x1b0064DeviceIoControl IOCTL_SERIAL_GET_MODEMSTATUS IOCTL = 0x1b0068EvtIoDeviceControl IOCTL_SERIAL_WAIT_ON_MASK EvtIoDeviceControl IOCTL_SERIAL_GET_COMMSTATUS
注意,这里屏蔽了CreateFile等函数,因为那个对目前的需求来说并无意义。
仔细观察会发现