haihang02
驱动牛犊
驱动牛犊
  • 注册日期2010-11-07
  • 最后登录2012-03-11
  • 粉丝1
  • 关注1
  • 积分16分
  • 威望121点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:3362回复:3

关于一个驱动中,多个设备对象的问题(虚拟串口)

楼主#
更多 发布于:2012-03-10 21:30
我在做一个虚拟串口转网络的驱动,想法是驱动中有两个设备对象,
               一个是正常的串口对象,负责应用程序调用传输数据;
               一个是桥接设备对象,负责与网络数据的交互;
            在驱动中把两个设备对象的数据再同步起来。所有串口的创建,配置以及网络信息的绑定等命令都通过应用层服务程序来实现
现在遇到一个问题:当我在AddDevice中利用IocreateDevice创建第二个设备时,虽然可以用symbollink软件看见我创建的设备,但当应用程序利用createfile(“\\\\.\\symbollinkname”)去打开第二个设备时,不是报错就是蓝屏。
   坛子里边的驱动牛人有不少,这方面经验的人肯定也有,那位高手帮帮小弟,不胜感激。
我的联系方式:qq.83836923   email whh418@163.com  如果有必要我会把程序贴出来
haihang02
驱动牛犊
驱动牛犊
  • 注册日期2010-11-07
  • 最后登录2012-03-11
  • 粉丝1
  • 关注1
  • 积分16分
  • 威望121点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于: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;
    }
对于项目要求来说是否需要挂载这个桥接设备到物理设备呢,如果需要,那么我的处理方式是否正确?

另外请各位大虾随意补充自己对整个项目的看法!
yingzhige
驱动牛犊
驱动牛犊
  • 注册日期2013-05-20
  • 最后登录2013-06-06
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望41点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2013-06-05 10:12
我现在正在学习 虚拟串口 能否交流下
hlz2014
驱动牛犊
驱动牛犊
  • 注册日期2013-04-17
  • 最后登录2013-09-10
  • 粉丝0
  • 关注0
  • 积分12分
  • 威望91点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2013-06-08 10:19
最近在做windows驱动方面的工作,主要涉及虚拟串口和虚拟USB\HID设备驱动方面,有兴趣的话可以多交流交流,QQ:2561217883
游客

返回顶部