阅读:3610回复:3
关于一个驱动中,多个设备对象的问题(虚拟串口)
我在做一个虚拟串口转网络的驱动,想法是驱动中有两个设备对象,
一个是正常的串口对象,负责应用程序调用传输数据; 一个是桥接设备对象,负责与网络数据的交互; 在驱动中把两个设备对象的数据再同步起来。所有串口的创建,配置以及网络信息的绑定等命令都通过应用层服务程序来实现 现在遇到一个问题:当我在AddDevice中利用IocreateDevice创建第二个设备时,虽然可以用symbollink软件看见我创建的设备,但当应用程序利用createfile(“\\\\.\\symbollinkname”)去打开第二个设备时,不是报错就是蓝屏。 坛子里边的驱动牛人有不少,这方面经验的人肯定也有,那位高手帮帮小弟,不胜感激。 我的联系方式:qq.83836923 email whh418@163.com 如果有必要我会把程序贴出来 |
|
沙发#
发布于:2012-03-11 14:16
有相关经验的请出来帮帮小弟,现在我把贴出来
在原有串口驱动的AddDevice例程中,我添加了这段代码来实现第二个设备的创建 PDEVICE_OBJECT bridgeObject; //桥接设备对象 PTESTPORT_DEVICE_EXTENSION bridgeExtension; //桥接设备扩展 UNICODE_STRING BridgeName; //桥接设备名 UNICODE_STRING BridgeSymLinkName; //设备符号名 1. 在原有串口程序adddevice文件最后,加如下代码创建桥接设备 // create device object name BridgeName.Length = 0; BridgeName.MaximumLength = sizeof(L"\\Device\\testPortBridge") + 20; BridgeName.Buffer = (PWCHAR)ExAllocatePoolWithTag(PagedPool,BridgeName.MaximumLength,TESTPORT_POOL_TAG); if (BridgeName.Buffer == NULL) { status = STATUS_INSUFFICIENT_RESOURCES; testPortDebugPrint(DBG_INIT, DBG_ERR, __FUNCTION__"--. STATUS %x", status); return status; } RtlZeroMemory(BridgeName.Buffer, BridgeName.MaximumLength); // RtlAppendUnicodeToString(&ntName, L"\\Device\\testPortDevice"); RtlInitUnicodeString(&BridgeName,L"\\Device\\testPortBridge"); DbgPrint("begin to create the second deviceObject -----> testPortBridge"); //bridgeObject=deviceObject->NextDevice; status = IoCreateDevice( DriverObject, sizeof(TESTPORT_DEVICE_EXTENSION), &BridgeName, FILE_DEVICE_SERIAL_PORT, FILE_DEVICE_SECURE_OPEN, FALSE, &bridgeObject ); if (!NT_SUCCESS(status)) { ExFreePool(BridgeName.Buffer); DbgPrint("IoCreateDevice BridgeName failed"); return status; } //deviceObject->NextDevice=bridgeObject; //使得第二个对象与第一个对象链表地址相连 BridgeSymLinkName.Length = 0; BridgeSymLinkName.MaximumLength = sizeof(L"\\??\\ComBridge") + 20; BridgeSymLinkName.Buffer = (PWCHAR)ExAllocatePoolWithTag(PagedPool,BridgeSymLinkName.MaximumLength,TESTPORT_POOL_TAG); RtlInitUnicodeString(&BridgeSymLinkName,L"\\??\\ComBridge"); status = IoCreateSymbolicLink(&BridgeSymLinkName,&BridgeName); if(!NT_SUCCESS(status)) { IoDeleteSymbolicLink(&BridgeSymLinkName); DbgPrint("IoDeleteSymbolicLink BridgeSymbolicLinkName failed"); return status; } 这段代码加上之后,通过symbollink软件 就能看见\\Device\\testPortBridge 这个设备,以及由其暴露出来的ComBridge, 但是当在应用层想通过createfile("\\\\.\\Combridge"...)去打开这个设备时就报错。 2.然后为了让其挂载在物理设备上,我先对其扩展进行存储加入如下代码: bridgeExtension = (PTESTPORT_DEVICE_EXTENSION)bridgeObject->DeviceExtension; // Zero the memory RtlZeroMemory(bridgeExtension, sizeof(TESTPORT_DEVICE_EXTENSION)); // // save the PDO pointer bridgeExtension->PhysicalDeviceObject = PhysicalDeviceObject; // save our device object bridgeExtension->DeviceObject = bridgeObject; // save device name bridgeExtension->DeviceName = BridgeName; 加入这些直接导致,在对驱动加载到操作系统上时就蓝屏了 3.最后一个问题,看到原本来串口框架中有将串口设备挂在在物理设备上,我也加了如下代码: bridgeExtension->LowerDeviceObject = IoAttachDeviceToDeviceStack( bridgeObject, PhysicalDeviceObject ); if (bridgeExtension->LowerDeviceObject == NULL) { status = STATUS_DEVICE_REMOVED; //IoFreeWorkItem(briceExtension->PowerWorkItem); IoDeleteDevice(bridgeObject); ExFreePool(BridgeName.Buffer); testPortDebugPrint(DBG_INIT, DBG_ERR, __FUNCTION__"--. IoAttachDeviceToDeviceStack failed"); return status; } 对于项目要求来说是否需要挂载这个桥接设备到物理设备呢,如果需要,那么我的处理方式是否正确? 另外请各位大虾随意补充自己对整个项目的看法! |
|
板凳#
发布于:2013-06-05 10:12
我现在正在学习 虚拟串口 能否交流下
|
|
地板#
发布于:2013-06-08 10:19
最近在做windows驱动方面的工作,主要涉及虚拟串口和虚拟USB\HID设备驱动方面,有兴趣的话可以多交流交流,QQ:2561217883
|
|