我正在学习 Windows 内核编程,我想知道如何将字节数组从内核驱动程序传递到我的用户模式应用程序,内核驱动程序在其中发起调用?
如果我要在用户模式进程中执行此操作(例如,从服务到 GUI 应用程序(,我会使用命名管道或具有命名事件和命名互斥锁的共享内存进行同步。但是我不知道在内核驱动程序端该怎么做。
这是我的实际示例:我有一个内核回调函数,可以随时使用 STRING 调用。然后,我需要将字符串从其中传递到我当前运行的用户模式进程并提醒它。
内核模式到用户模式的进程间通信有很多方法,不同的要求可以适合不同的技术。
对于初学者,您可以选择命名管道(即使在内核模式下(。但是,有些事情你应该知道...它没有正式记录为普通内核模式设备驱动程序 (尽管文件系统微筛选器设备驱动程序有一个记录的接口( 。
如果要使用普通内核模式设备驱动程序中的命名管道,则必须找到 NtCreateNamedPipeFile 的地址或依赖 IoCreateFile(NtCreateNamedPipeFile 在内部依赖该地址,使用未记录的结构(。
若要使用文件系统微筛选器设备驱动程序中的命名管道,具有 FltCreateNamedPipeFile。
从命名管道的想法继续前进,您可以选择本地过程调用!但是,在文档方面,又一次陷入了另一个死胡同。不过,在内核模式下作为客户端执行此操作相对简单。不过,有一个带有文件系统微筛选器设备驱动程序的端口的文档接口:FltCreateCommunicationPort。
再次继续,您可以附加到用户模式客户端并直接写入其内存。
如果您确实需要,则可以依靠诸如共享事件之类的简单操作来通知用户模式客户端您刚刚附加到它并写入其虚拟内存。