【问题标题】:Driver to User-Mode Communication驱动程序到用户模式通信
【发布时间】:2019-04-04 19:06:58
【问题描述】:

我正在尝试编写一个工具来监控进程。每当创建具有 SYSTEM 权限的高权限进程时,它都会提醒用户。 我正在使用一个监控每个进程创建的驱动程序和一个用户模式应用程序来检查它是否在 SYSTEM 下运行,如果是则发出警报。 为此,用户模式应用程序应听取驱动程序。我正在尝试通过事件来做到这一点。每当创建进程时,驱动程序将使用 IoCreateNotificationEvent 发出事件信号(使用模式应用程序使用 WaitForSingleObject 侦听该事件),然后应用程序将向驱动程序发送 IRP 以获取 pid。 这对我来说效果不佳,我一直在寻找其他方法来进行从驱动程序到侦听用户模式应用程序的通信,但我找不到...... 我怎样才能让它发挥作用?

感谢您的帮助

【问题讨论】:

    标签: c windows winapi kernel driver


    【解决方案1】:

    通常的方法是使用异步 IOCTL,完全忘记事件,如果没有未完成的进程创建要读取,则让驱动程序保存 IOCTL,然后在获得新进程时完成 IOCTL。这确实需要客户端在进程创建之前提交 IOCTL 请求。为了获得最佳结果,我会说将您的设备句柄绑定到 IOCP(我发现 IOCP 比需要跟踪哪个事件与哪个 OVERLAPPED 一起处理要容易得多)。

    【讨论】:

      【解决方案2】:

      从驱动程序到用户模式进程的另一种通信方式是用户模式进程以消息模式打开管道并监听来自内核的消息。它比实现异步 IOCTL 更简单,因为您不必处理可能需要取消的未决 IOCTL。确保当您打开管道时,它是正确的 ACL,这样只有内核才能与用户模式进程打开的管道通信。

      【讨论】:

      • 我用你说的管道实现了它,但是我如何在我的用户模式应用程序中收听管道中的数据?我在没有整个应用程序的情况下尝试了管道,并使用使用 ReadFile 从管道获取数据的 while(TRUE) 循环完成了此操作(这是一种单向通信,只有驱动程序写入管道)但在我的用户模式应用程序中我有 GUI 和消息循环,所以如果我放 while(TRUE) 它将卡住应用程序。我考虑过在单独的线程中执行 while(TRUE),但它必须是另一种简单的收听管道的方法。我该怎么做??谢谢
      • 如果你有 GUI,有两种方法可以处理这个问题。一种方法是通过创建线程来读取/写入管道并将消息发布到 UI 线程以更新 GUI。另一种方法是使用异步管道和函数MsgWaitForMultipleObjects
      猜你喜欢
      • 1970-01-01
      • 2010-11-09
      • 2012-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-09
      • 2018-07-12
      • 1970-01-01
      相关资源
      最近更新 更多