内核模式到用户模式通信

时间:2017-07-19 22:54:29

标签: c++ c windows wdk kernel-mode

我知道从用户模式到内核模式的通信,我也知道事件/反向调用但是我需要从内核模式设备驱动程序向用户模式进程发送字符串值然后在KM中等待回复(例如TRUE或FALSE BOOLEAN)。

取字符串“c:\ file.txt”。现在我需要KM设备驱动程序将此字符串发送到用户模式,然后让该UM程序重新发回TRUE或FALSE响应以供驱动程序处理。

我经历过很多网站主题/帖子,文档样本,找不到我想要的内容。

我在想,也许我可以在用户模式程序中设置一个线程,它只是一直等待数据下降然后在KM中我会暂停,直到回复一个响应...不确定

感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

您可能需要三个IOCTL。

  1. IOCTL_READ_FROM_KERNEL。最初在连接后发送,并等待第一个内核消息
  2. IOCTL_RESPOND_AND_READ_FROM_KERNEL。发送响应,等待下一条消息。
  3. IOCTL_RESPOND。发送回复。
  4. 用户模式代码调用IOCTL。 IOCTL_RESPOND立即返回,线程可能会退出。

    其他2个IOCTL将等到内核发送内容。这将包括某种形式的ID,可用于识别消息。 当内核有消息时,它可以查找等待发送的UM线程,或者将消息排队等待以后发送。

    当UM连接时,它会拉出传递队列,或者被添加到服务器队列。

答案 1 :(得分:1)

你有很多选择。

  1. 端口
  2. 命名管道
  3. 待定IOCTL
  4. 代码注入
  5. 共享事件 - >现在从用户模式
  6. 读取配置文件

    文件系统Mini-Filter设备驱动程序正式支持第一个提到的技术,#3和#5相对简单。然而,#2和#4更复杂,更不可靠/适合9次中的9次。

    但是,您可以使用一些未记录的魔法从内核模式实现命名管道;可以从KeServiceDescriptorTable中提取NtCreateNamedPipeFile的地址。 NtCreateNamedPipeFile将依赖于IoCreateFile - IoCreateFile是一个可以自由访问的导出内核模式例程。在内核模式下,对于命名管道服务器,其他所有内容都很容易实现,如果您只是在客户端实现之后,它甚至更简单,因为您需要使用的只是简单的Native API例程,如ZwCreateFile,ZwWriteFile,ZwReadFile,等

    我建议您查看Ports进行通信,Microsoft在GitHub上有一些自己的样本。