内核模式到用户模式通信

问题描述 投票:-1回答:2

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

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

我经历了很多网站主题/帖子,文档样本,找不到我要找的东西。

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

任何帮助表示赞赏。

c++ c windows wdk kernel-mode
2个回答
0
投票

您可能需要三个IOCTL。

  1. IOCTL_READ_FROM_KERNEL。最初在连接后发送,并等待第一个内核消息
  2. IOCTL_RESPOND_AND_READ_FROM_KERNEL。发送响应,并等待下一条消息。
  3. IOCTL_RESPOND。发送回复。

用户模式代码调用IOCTL。 IOCTL_RESPOND立即返回,线程可能会退出。

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

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


0
投票

你有很多选择。

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.