我想让两个驱动之间实现通信,搜索了很久一直没解决,希望一个驱动A传递它的一个设备对象的指针到另外一个驱动B。
IoGetDeviceObjectPointer以及创建一个内存映射,一个驱动往里面写数据等等思路我知道,但是自己动手时蓝屏无限,驱动的资料难找,一搜索全是驱动与应用层通信,所以不是我不搜索,求代码实属无奈。
如果有代码举例直实现驱动间通信最好,要是不能直接解决,请耐心看下面是我的描述:
最近想做一个USB存储设备拦截设为只读,用了两个驱动,一个是用WDM型驱动改了改的驱动挂载在注册表:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{36FC9E60-C465-11CF-8056-444553540000}下面LowerFilters值为MyFilter(驱动名).
这是WDM驱动添加设备代码:
在NTSTATUS AddDevice(IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT pdo)
{
PAGED_CODE();
NTSTATUS status;
KdPrint(("- Entering AddDevice\n"));
KdPrint(("DEVICE:%x\n",pdo));
///等等
}
安装好后,我插入USB,windbg显示:
- Entering AddDevice
DEVICE:8a7adbe8
再用DeviceTree看到这其实是Driver\usbhub的第一个设备对象,而这个设备的AttachedDevice就是我要找的USB存储设备。
图:
但是如果这时候我打印KdPrint(("DEVICE:%x\n",pdo->AttachedDevice));将会看到NULL,因为这时候还没加载好USB,只有hub的设备对象。所以我要传递这个PDEVICE_OBJECT pdo设备对象给我写的微过滤驱动,然后在微过滤驱动通过pdo->AttachedDevice找到USB存储设备对象,然后再通过盘符也就是符号连接设为只读。
我用驱动开发技术详解11章2.3节IobuildSynch 在WDM里创建了IRP发给微过滤,微过滤成功接受到了。但是我想传递一个是上面说的设备对象。卡在这了,求大家帮忙,其他办法也行。
WDM:
NTSTATUS AddDevice(IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT pdo)
{
PAGED_CODE();
HelloDDKRead(pdo);
NTSTATUS status;
KdPrint(("- Entering AddDevice\n"));
KdPrint(("DEVICE:%x\n",pdo));
PDEVICE_OBJECT fido;
//创建设备名称
UNICODE_STRING devName;
RtlInitUnicodeString(&devName,L"\\Device\\MyDDKDevicB");
//创建设备
status = IoCreateDevice(DriverObject, sizeof(DEVICE_EXTENSION), &(UNICODE_STRING)devName,
GetDeviceTypeToUse(pdo), 0, FALSE, &fido);
//等等
}
NTSTATUS HelloDDKRead(IN PDEVICE_OBJECT pDevObj)//,
// IN PIRP pIrp)
{
KdPrint(("DriverB:Enter B HelloDDKRead\n"));
NTSTATUS ntStatus = STATUS_SUCCESS;
UNICODE_STRING DeviceName;
KdPrint(("DriverB:FileObject:%x\n",FileObject));
KdPrint(("DriverB:DeviceObject:%x\n",DeviceObject));
KEVENT event;
KeInitializeEvent(&event,NotificationEvent,FALSE);
IO_STATUS_BLOCK status_block;
LARGE_INTEGER offsert = RtlConvertLongToLargeInteger(0);
//创建同步IRP
PIRP pNewIrp = IoBuildSynchronousFsdRequest(IRP_MJ_READ,
DeviceObject,
NULL,0,
&offsert,&event,&status_block);
//等等
//////////////////////////////////////////////
微过滤 能接受到WDM发的IRP,
WINDBG显示:
DriverB:Enter B HelloDDKRead
DriverA:Enter A HelloDDKCreate
DriverA:Leave A HelloDDKCreate
DriverB:FileObject:8aa35a40
DriverB:DeviceObject:8a9f22f0
DriverB:pNewIrp:8a97ae78
DriverA:Enter A HelloDDKRead
DriverA:Leave A HelloDDKRead
DriverA:complete the Driver A IRP_MJ_READ irp!
DriverA:Enter A HelloDDKClose
DriverA:Leave A HelloDDKClose
DriverB:Leave B HelloDDKRead
- Entering AddDevice
DEVICE:8aa2fde8
附件:
微过滤B.rar
wdm.rar
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
上传的附件: