如何将可变大小的数组从Windows内核驱动程序传递给用户模式进程?

时间:2018-06-19 17:26:12

标签: c callback kernel windows-kernel usermode

我正在学习Windows内核编程,并且想知道如何将字节数组从内核驱动程序传递到我的用户模式应用程序,由内核驱动程序启动调用?

如果要在用户模式进程(例如,从服务到GUI应用程序)之间执行此操作,则将使用命名管道或具有命名事件和命名互斥体的共享内存进行同步。但是我在内核驱动程序方面一无所获。

这是我的实际示例:我有一个内核回调函数,可以随时使用STRING进行调用。然后,我需要将字符串从字符串中传递给我当前正在运行的用户模式进程,并对其发出警报。

1 个答案:

答案 0 :(得分:2)

内核模式到用户模式进程间通信的方式有很多,不同的需求可以适应不同的技术。

对于初学者,您可以选择命名管道(即使在内核模式下也可以)。但是,您应该知道一些事情……对于普通的内核模式设备驱动程序,它还没有正式记录(尽管文件系统Mini-Filter设备驱动程序有记录的接口)。

如果要使用普通内核模式设备驱动程序中的命名管道,则必须找到NtCreateNamedPipeFile的地址或依靠IoCreateFile(NtCreateNamedPipeFile在内部依靠该地址,使用未说明的结构)

要使用文件系统微型过滤器设备驱动程序中的命名管道,请使用FltCreateNamedPipeFile

从命名管道的思路继续进行,您可以选择“本地过程调用”!但是,在文档方面又是另一端。不过,将其作为内核模式的客户端来做是相对简单的。不过,有一个已记录的端口用于文件系统微型过滤器设备驱动程序:FltCreateCommunicationPort

再次继续,您可以连接到用户模式客户端并直接写入其内存。

如果您确实想要,您可以依靠诸如共享事件之类的简单方法来通知用户模式客户端您刚刚将其附加并写入其虚拟内存中。