Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何将可变大小的数组从Windows内核驱动程序传递到用户模式进程?_C_Callback_Kernel_Windows Kernel_Usermode - Fatal编程技术网

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

C 如何将可变大小的数组从Windows内核驱动程序传递到用户模式进程?,c,callback,kernel,windows-kernel,usermode,C,Callback,Kernel,Windows Kernel,Usermode,我正在学习Windows内核编程,我想知道如何将一个字节数组从内核驱动程序传递到我的用户模式应用程序,内核驱动程序在那里发起调用 如果我在用户模式进程(例如,从服务到GUI应用)中执行此操作,我会使用命名管道或共享内存,并使用命名事件和命名互斥体进行同步。但是我不知道在内核驱动端该做什么 下面是我的实际示例:我有一个内核回调函数,可以随时使用函数调用。然后,我需要将其中的字符串传递到当前正在运行的用户模式进程,并向其发出警报。内核模式到用户模式的进程间通信有很多方法,不同的需求可以适应不同的技术

我正在学习Windows内核编程,我想知道如何将一个字节数组从内核驱动程序传递到我的用户模式应用程序,内核驱动程序在那里发起调用

如果我在用户模式进程(例如,从服务到GUI应用)中执行此操作,我会使用命名管道或共享内存,并使用命名事件和命名互斥体进行同步。但是我不知道在内核驱动端该做什么


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

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

对于初学者,您可以选择命名管道(即使在内核模式下)。然而,有些事情你应该知道。。。对于普通的内核模式设备驱动程序,没有正式的文档记录(尽管有一个文档记录的文件系统迷你过滤器设备驱动程序接口)

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

要使用文件系统迷你筛选器设备驱动程序中的命名管道,您必须

从命名管道的概念开始,您可以选择本地过程调用!然而,在文档方面,这又是一条死胡同。不过,在内核模式下作为客户机来做这件事相对简单。不过,有一个文档化的端口接口,带有文件系统迷你过滤器设备驱动程序:

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


如果您真的愿意,您可以依靠一些简单的东西,例如共享事件,来通知用户模式客户端您刚刚连接到它并写入它的虚拟内存。

我不确定我是否遵守了。您的意思是为内核提供一个回调函数,让它调用吗?因为如果是另一种方式,那么您的程序中就已经有数据了。@JohnBollinger:My kernel driver设置了一个从内核空间调用的回调函数。之后,我需要将回调函数中提供的字节数组传递给正在运行的用户模式进程。Ok。那么,用户模式流程首先是如何与驱动程序关联的?也就是说,驱动程序如何知道将数据传递到何处?这类事情通常通过DeviceIoControl完成,您将传入缓冲区,然后缓冲区将被填充,您的驱动程序最初返回状态_IO_PENDING,然后在数据准备就绪时完成操作(在缓冲区中填充了提供的用户模式代码)。用户模式代码向内核模式传递回调函数一点也不常见。@SoronelHaetir:谢谢。我在等待的时候做了更多的研究,这是建议的方法之一。尽管如此,如果驱动程序定义的IOCTL的i/o可能会无限期地挂起,它将如何工作?我还看到了使用PnP实现这一目的的参考资料,即驱动端的
IoReportTargetDeviceChangeAsynchronous()
,用户端的
RegisterDeviceNotification()
WM_DEVICECHANGE
(不使用实际的硬件设备)。此外,还通过
ZwCreateSection()创建了一个节对象
的建议。我只是不确定这里推荐的方法是什么?谢谢你的建议。我得研究一下。不过,在内核空间中,我一直看到很多对未记录内容的引用。例如,即使MSDN也可能给出一个函数,而不解释它返回的结构的成员。例如:
IoGetCurrentProcess()
。这是正常的吗?在用户模式下,通常不赞成使用未记录的API。@MikeF我同意你关于未记录API的看法,我认为这都不是一个好主意。有时你可能没有选择,这取决于你想做什么,这是一种耻辱。关于IoGetCurrentProcess,它应该返回指向_EPROCESS结构的指针,但我们不应该弄乱字段(或访问它们),因为它是一个不透明的结构。微软会有这样做的理由,但如果你有偏移量,你仍然可以通过内存访问读/写字段(坏主意,偏移量可以随时改变)。还有一个附带问题。我在上面发表了评论。通过我自己的研究,我发现,
IoReportTargetDeviceChangeAsynchronous()
可以用来将任意大小的结构封送到用户模式进程中,用户模式进程可以使用
RegisterDeviceNotification()
通过
WM\u DEVICECHANGE
消息检索它。有没有可能不起作用的原因?(也就是说,太慢、不可靠?因为我们正在处理窗口消息。或者在没有实际设备的情况下使用PnP设备概念是不好的。)@MikeF我以前从未这样做过,所以我不认为我给出建议是个好主意,但你可以尝试一下,看看它是否适合你的要求。很抱歉,我不能对这个想法提供任何真正的见解。我猜另一位活跃在这里的成员可能会无意中发现这条线索,看到评论,并且会对该主题有足够的了解,从而插话回答这个问题。。。有希望地。