首页
社区
课程
招聘
两个驱动之间通信
发表于: 2013-12-26 13:14 9353

两个驱动之间通信

2013-12-26 13:14
9353
我想让两个驱动之间实现通信,搜索了很久一直没解决,希望一个驱动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

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (14)
雪    币: 22
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
_asm nop
2013-12-26 14:54
0
雪    币: 53
活跃值: (42)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
///////////////////////////////////
2013-12-26 15:23
0
雪    币: 22
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
_asm nop
2013-12-26 15:32
0
雪    币: 53
活跃值: (42)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
//////////////////////////////////
2013-12-26 15:41
0
雪    币: 53
活跃值: (42)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
发帖之前,我就做好两个心理准备,一个是被喷伸手要代码,第二个是让我去看书。因为在其他论坛也是这样的。
不过我还是会帮助每一个比我还菜的人,当然我还是会继续伸手要我的代码。
2013-12-26 15:53
0
雪    币: 65
活跃值: (112)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
7
用得着这么麻烦?直接函数调用不就够了?还用得着这么转来转去吗
2013-12-26 18:31
0
雪    币: 53
活跃值: (42)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
解决问题不是最重要的,就是想看看别人的代码
2013-12-26 22:12
0
雪    币: 257
活跃值: (67)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
几个关键内核函数的的应用而已,详见MSDN

内存映射完成通信,关键函数:
ZwCreateSection创建
ZwOpenSection打开
ZwMapViewOfSection映射

事件对象用来同步,关键函数:
ZwCreateEvent创建
ZwOpenEvent打开
KeSetEvent激活
KeResetEvent释放
KeWaitForSingleObject等待
2013-12-29 22:19
0
雪    币: 257
活跃值: (67)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
另外,驱动层相互通信,也可以参考应用层跟驱动层通信API,即DeviceIoControl
这个API对应的内核函数是ZwDeviceIoControlFile,这个函数是导出的,可以直接调用
2013-12-29 22:27
0
雪    币: 11
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
驱动间互相通信?
和r3 -》r0通信是一样的啊……打开设备……发irp……
2013-12-29 22:41
0
雪    币: 53
活跃值: (42)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
我想看看其他人代码,风格,想法
2014-1-2 17:44
0
雪    币: 11
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
这还有啥好看的……
2014-1-2 17:52
0
雪    币: 130
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
我觉得也是直接CALL就行了
2014-1-2 19:05
0
雪    币: 6
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
发帖之前,我就做好两个心理准备,一个是被喷伸手要代码,第二个是让我去看书。因为在其他论坛也是这样的。
不过我还是会帮助每一个比我还菜的人,当然我还是会继续伸手要我的代码。
2014-1-21 20:40
0
游客
登录 | 注册 方可回帖
返回
//