r4o5m6e8o@163.c
驱动牛犊
驱动牛犊
  • 注册日期2015-04-22
  • 最后登录2015-04-23
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望31点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2203回复:2

在Windows中 驱动层与用户层 数据交换有哪几种方式?

楼主#
更多 发布于:2015-04-23 15:02
最近在做一个虚拟声卡驱动,目的是把Windows中到达驱动层的数据,全部抓出来,现在已经能获取到数据了。现在问题是如何把数据传到用户层。
 
我所知道的方法:
     第一步.替换 WDMDispatchRoutine 函数,自处理自己的IRP,其余的继续交由原来的函数处理。(这个OK了)
     第二步.在驱动层创建 设备的 SymbolLink 与 设备对象的名字 关联起来(IoCreateSymbolLink),这样才能在用户层打开此设备,得到句柄,才能发起IOCTROL命令。问题就在这里了,我得不到设备名称.我只能得到 内核中的设备句柄。
     分析如下: 在 WDMAddDevice 入口函数,我们可以得到 pDriverObj 和 pPDObj 2个对象。我用DeviceTree查看到 pDriverObj 是本层驱动对象,pPDObj 是在 HDAudBus 这个驱动上的一个对象,在调用完 PcAddAdapterDevice 函数后,pDriverObj->DeviceObject 是本驱动最新创建的设备对象,并且它被Attach到了pPDObj上。   (我看到pDriverObj->DeviceObject == pPDObj->AttachedDevice). 如是我现在有2个DeviceObject了。我在网上看到有个函数可以通过 设备对象得到 设备名,  
status = IoGetDeviceProperty(  pDevObj, DevicePropertyPhysicalDeviceObjectName, lenNameNeed, pResultBuffer, &lenNameNeed );
我传入 pPDObj 确实可以得到设备名,之后我创建  SymbolLink 也成功了,
 
                //////
                // create symLink.
                UNICODE_STRING symLinkName;
                RtlInitUnicodeString( &symLinkName, L"\\??\\AAA1");
                UNICODE_STRING devName;
                RtlInitUnicodeString( &devName, pDevName );
                NTSTATUS status2 = IoCreateSymbolicLink( &symLinkName, &devName );
但是在用户层去打开这个设备却是失败的。
g_hDevice = ::CreateFile( _T("\\\\.\\AAA1"), GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
我猜测pPDObj  并不是我的驱动所创建的,用户层打不开或者找不到也可能是这个原因。
 
然后,我就试图去获取 pDriverObj->DeviceObject  的设备名,可能都是失败。IoGetDeviceProperty 的返回值是 0xC0000010

0xC0000010
STATUS_INVALID_DEVICE_REQUEST

The specified request is not a valid operation for the target device.

 没有SymbolLink,我就无法在用户层打开设备,也就无法调用IOCTRL,所以在这里请教各位大神有什么招。
 
 
 
游客

返回顶部