2017-07-19 70 views
-2

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

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

我已经经历了很多网站主题/帖子,文档样本,并且找不到我在找什么。

我在想,也许我可以安装在用户模式程序,直到响应返回其只是继续等待数据下来,然后在KM我莫名其妙地暂停一个线程...不知道

任何帮助表示赞赏。

+0

欢迎来到Stack Overflow。您的帖子目前的形式不清楚,不适合Stack Overflow。请访问[帮助中心](http://stackoverflow.com/help)并阅读[如何提出一个好问题]部分(http://stackoverflow.com/help/how-to-ask)。 –

+0

规范方法是一个IOCTL。用户模式调用是DeviceIoControl函数。您可以在单独的线程中调用它或使用异步I/O。内核模式驱动程序到达时可能处理这种请求的方式之一是将其重新配置到单独的队列中,该队列被配置为使用手动调度方法;这样,当您需要将消息发送到用户模式时,您只需使用WdfIoQueueRetrieveNextRequest将挂起的请求拉出队列,然后按正常方式完成。 –

+0

......来自驱动程序的消息应该可能包含某种ID号,以便当用户模式程序发送IOCTL来表示“真”或“假”时,它可以包含ID号,以便驱动程序知道哪个IOCTL正在回应的消息。 –

回答

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,等等

我建议你看一下端口进行通信,微软在GitHub上有它自己的一些样本。

相关问题