2014-06-13 114 views
2

以前从不开发任何驱动程序。2窗口内核模式驱动程序之间的通信

无论如何,我现在正在编写2个简单的windows内核模式驱动程序,并将2个驱动程序安装到连接到2个不同总线(ISA总线/ PCI总线)的2个不同设备上,并且不知何故2个驱动程序需要通话对方也希望数据交换,有没有什么有效的方法来实现这一点?

内核事件可能能够启用同步,但数据交换如何?

在用户模式下,管道/套接字可能是一个选项,但在内核模式下,是否存在命名管道或对象?谷歌表示,有一个为内核模式管道用法没有说明的API ...

我不是很熟悉Windows驱动程序框架,希望我做的意义..

的感谢!

回答

2

内核模式组件之间的通信有IRP_MJ_INTERNAL_DEVICE_CONTROL。驱动程序#1通过其名称打开驱动程序#2,并向内部IOCTL发送输入或/和输出数据。

+2

+1。请注意(如果您愿意),您可以在驱动程序初始化期间使用此机制来交换回调例程地址和上下文指针,然后使用回调例程进行通信。内核驱动程序都加载到相同的地址空间,所以它不像进程间通信;驱动程序A可以直接调用驱动程序B中的函数,也可以直接写入驱动程序B创建的内存缓冲区中 - 只需知道地址即可。 –

+0

酷!我认为这正是我正在寻找的。并且您的评论确实有助于清除像我这样的新手新手的头脑! @HarryJohnston – Sean

+0

只有一件事,我该如何在驱动程序#1中“打开”#2驱动程序?我试过IoGetDeviceObjectPointer和ObReferenceObjectByName,都失败了。第一个参数询问应该看起来像“\\ ​​Device \\ somedevice”或“\\ Driver \\ somedriver”的设备/驱动程序的名称,我尝试过使用WdfDeviceInitAssignName来定制我的驱动程序的名称,但是它又失败了... – Sean

0

@Harry Johnston:您需要小心写入共享内存位置。我假设你是在两个设备之间实现串行缓冲区的情况下进行响应的(只有一个设备可以写入,另一个只能读取),但显然应该添加的是,应该谨慎接近设备之间的共享内存位置,特别是如果两个设备都要频繁地写入该位置,并导致不确定的行为或中断的锁定似乎意外地得到处理。

相关问题