2

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

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

我浏览了很多网站主题/帖子、文档示例,但找不到我要找的东西。

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

任何帮助表示赞赏。

4

2 回答 2

4

你有很多选择。

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

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

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

我建议您查看 Ports 进行通信,Microsoft 在 GitHub 上有一些他们自己的示例。

于 2017-12-19T01:35:03.523 回答
2

您可能需要三个 IOCTL。

  1. IOCTL_READ_FROM_KERNEL。连接后初始发送,等待第一条内核消息
  2. IOCTL_RESPOND_AND_READ_FROM_KERNEL。发送响应,并等待下一条消息。
  3. IOCTL_响应。发送响应。

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

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

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

于 2017-07-20T07:00:38.747 回答