Windows XP下USB转串口驱动编码实现分析

简介:        USB转COM驱动的编写实现有很多中方法,最近在网络上看到一个最常用的方式,即是虚拟一个COM口,在COM初试的时候进行打开一个USB设备.

       USB转COM驱动的编写实现有很多中方法,最近在网络上看到一个最常用的方式,即是虚拟一个COM口,在COM初试的时候进行打开一个USB设备.

       当USB串COM口驱动处理Write和Read 等IRQ的时候,其实是去读写USB 设备驱动,读写方式是直接采用ZwReadFile和ZwWriteFile函数.但是真正的实现也不是这么简单,真实的实现是开辟一个线程和一段较大的缓冲区,线程用于适时读取USB设备的数据并保存在缓冲区当中.当上层应用程序向这个虚拟的COM口发送READ IRP(IRP_MJ_READ)的时候,则直接从这段缓冲区中读取数据返回即可.当然还不要忘记处理超时的问题处理.

       因此USB转COM驱动在INF文件加载的时候实际上需要加载两个驱动程序,一个是USB驱动,对应与USB设备的VID和PID,另外一个就是COM虚拟驱动程序,需要对应设置COM口号.如下将对关键代码列出;

  • 创建COM口设备对象

status = IoCreateDevice(DriverObject, sizeof(VCP4USB_DEVICE_EXTENSION), &ntDeviceName, FILE_DEVICE_SERIAL_PORT, 0, TRUE, // exclusive &fdo);

  • 获取USB设备名称用于打开设备

status = IoGetDeviceInterfaces(pGuid, NULL, 0, &pSymLink); DPrint(DBG_OTHER, ("IoGetDeviceInterface return %d/n", status)); if ((status == STATUS_INVALID_DEVICE_REQUEST) || (*pSymLink == NULL)) return STATUS_UNSUCCESSFUL; pCur = pSymLink; instanceCur = 0; status = STATUS_INVALID_INFO_CLASS; while (*pCur != NULL) { p = pCur; for (size = 0; *p != NULL; size ++) p ++; DPrint(DBG_OTHER, ("No.%d: size=%d/n", instanceCur, size)); DPrint(DBG_OTHER, ("name:%ws/n", pCur)); if (instance == instanceCur) { if (RtlCompareMemory(pCur, pPrefix, prefixLength) == prefixLength) { DPrint(DBG_OTHER, ("Find OK/n")); devName->MaximumLength = size * sizeof(WCHAR); devName->Buffer = (PWSTR)ExAllocatePool(NonPagedPool, (size + 1) * sizeof(WCHAR)); if (devName->Buffer == NULL) { DPrint(DBG_OTHER, ("Allocate devName error./n")); status = STATUS_INSUFFICIENT_RESOURCES; break; } RtlCopyMemory(devName->Buffer, pCur, (size+1) * sizeof(WCHAR)); RtlInitUnicodeString(devName, devName->Buffer); status = STATUS_SUCCESS; break; // find ok and break } } pCur += size + 1; // skip last NULL instanceCur ++; if (instanceCur >= 2) // for debug break; } ExFreePool(pSymLink); return status;

  •     打开USB设备端口 

curStatus = GetUsbDeviceName(&usbDeviceName, &GUID_CLASS_XXXX_BULK, &XXXX_SYMLINK_CMPSTR, XXXX_SYMLINK_STRLEN, 0); if (!hRead) rdStatus = createFile(&hRead, &usbDeviceName, L"//PIPE0", 6, GENERIC_READ); if (!hWrite) wtStatus = createFile(&hWrite, &usbDeviceName, L"//PIPE1", 6, GENERIC_WRITE);

    其他的驱动程序处理都是常规处理,在这里就不多做介绍!

目录
相关文章
|
2月前
|
数据安全/隐私保护 虚拟化 Windows
如何在 VM 虚拟机中安装 Windows XP 操作系统保姆级教程(附链接)
如何在 VM 虚拟机中安装 Windows XP 操作系统保姆级教程(附链接)
|
23天前
|
安全 测试技术 Windows
LabVIEW版本、硬件驱动和Windows版本之间兼容性
LabVIEW版本、硬件驱动和Windows版本之间兼容性
25 2
|
1月前
|
网络安全 C++ Windows
【Windows驱动开发】(主机)VS2017+(虚拟机)win10系统------双机调试
【Windows驱动开发】(主机)VS2017+(虚拟机)win10系统------双机调试
|
1月前
|
Windows
【Windows驱动开发】注册表的基本操作(创建、打开、修改、读取、枚举)(附源码)
【Windows驱动开发】注册表的基本操作(创建、打开、修改、读取、枚举)(附源码)
|
1月前
|
Windows
【Windows内核驱动函数(1)】IoCreateSymbolicLink()-----创建符号链接函数
【Windows内核驱动函数(1)】IoCreateSymbolicLink()-----创建符号链接函数
|
1月前
|
应用服务中间件 Windows
Windows下CMD和Tomcat设置编码为UTF-8
解决CMD和Tomcat中文乱码问题:通过修改注册表永久设置CMD编码为UTF-8,路径 `\HKEY_CURRENT_USER\Console\%SystemRoot%_system32_cmd.exe`,修改CodePage为65001。Tomcat日志乱码时,在 `\HKEY_CURRENT_USER\Console` 下新建Tomcat项,添加DWORD值PageCode,值设为65001。
|
29天前
|
机器学习/深度学习 前端开发 Linux
技术心得:分析Windows的死亡蓝屏(BSOD)机制
技术心得:分析Windows的死亡蓝屏(BSOD)机制
|
2月前
|
监控 安全 网络协议
windows服务器权限分析
windows服务器权限分析
44 1
windows服务器权限分析
|
2月前
|
存储 安全 数据安全/隐私保护
【Windows manage-bde 命令】BitLocker 2.0:一步步解锁您的加密驱动器
【Windows manage-bde 命令】BitLocker 2.0:一步步解锁您的加密驱动器
629 0
|
2月前
|
安全 Linux 开发工具
Linux与Windows系统的差异分析
Linux与Windows系统的差异分析
55 0