阅读:2633回复:2
在Windows中 驱动层与用户层 数据交换有哪几种方式?
最近在做一个虚拟声卡驱动,目的是把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
没有SymbolLink,我就无法在用户层打开设备,也就无法调用IOCTRL,所以在这里请教各位大神有什么招。 |
|||
沙发#
发布于:2015-04-25 10:15
你的设备支持irp_mj_create吗?
|
|
|
板凳#
发布于:2021-01-05 15:38
-CreateFile + ReadFile
-DeviceIOControl -Private_Shared_Memory_Map; |
|