【问题标题】:Communication between 2 windows kernel mode drivers2个windows内核模式驱动程序之间的通信
【发布时间】:2014-08-03 20:29:09
【问题描述】:

以前从未开发过任何驱动程序。

无论如何,我现在正在编写 2 个简单的 Windows 内核模式驱动程序,这 2 个驱动程序将安装到连接到 2 个不同总线(ISA 总线/PCI 总线)的 2 个不同设备上,并且 2 个驱动程序需要以某种方式与之交谈彼此和数据交换也是预期的,有什么有效的方法来实现吗?

内核事件或许可以开启同步,但是数据交换呢?

在用户模式下,管道/套接字可能是一个选项,但在内核模式下,是否有命名管道的对应物?谷歌表示没有用于内核模式管道使用的 API...

我对windows驱动框架不太熟悉,希望我说得通..

谢谢!

【问题讨论】:

    标签: windows driver


    【解决方案1】:

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

    【讨论】:

    • +1。请注意(如果您愿意)您可以在驱动程序初始化期间使用此机制来交换回调例程地址和上下文指针,然后使用回调例程进行通信。内核驱动都加载到同一个地址空间,所以不像进程间通信;驱动程序 A 真的可以直接调用驱动程序 B 中的函数,或者直接写入驱动程序 B 创建的内存缓冲区 - 您只需要知道地址即可。
    • 酷!我认为这正是我正在寻找的。你的评论真的有助于清除像我这样的车手新手的头脑! @HarryJohnston
    • 只有一件事,我怎样才能在驱动程序#1 中“打开”驱动程序#2?我试过 IoGetDeviceObjectPointer 和 ObReferenceObjectByName 都失败了。第一个参数询问设备/驱动程序的名称,它应该看起来像“\\Device\\somedevice”或“\\Driver\\somedriver”,我尝试 WdfDeviceInitAssignName 自定义我的驱动程序的名称,但再次失败...
    • @Sean:IoGetDeviceObjectPointer 或 ObReferenceObjectByName 应该可以工作。看看osronline.com/article.cfm?id=24
    【解决方案2】:

    @Harry Johnston:您确实需要小心写入共享内存位置。我认为您是在响应在两个设备之间实现串行缓冲区的上下文(只有一个设备可以写入,而另一个只能读取),但显然应该补充一点,您应该谨慎处理设备之间的共享内存位置,特别是如果两个设备都会频繁写入该位置并导致未定义的行为或因看似意外的中断服务而锁定。

    【讨论】:

      猜你喜欢
      • 2012-12-13
      • 1970-01-01
      • 1970-01-01
      • 2013-01-17
      • 2015-04-14
      • 2011-06-23
      • 1970-01-01
      • 2022-10-25
      • 1970-01-01
      相关资源
      最近更新 更多