内核和用户模式之间的共享内存。 如何分享处理?

我正在尝试在用户进程和内核之间使用共享内存。

选项一 – 让内核创build节,让用户模式应用程序通过名称“Global \ my_mem”打开内存。 它只能在只读模式下工作。 当我试图打开部分FILE_MAP_WRITE它给访问被拒绝(5)。 不知道如何授予访问权限或修改DACL。

选项二 – 通过IOCTL传回句柄。 这个是有问题的,因为在KERNEL中打开的部分的句柄是0xFFFFFFFF80001234。 我的理解是,具有任何高位设置的句柄不能在用户模式下使用。 特别是如果应用程序将是32位:)最初我期望部分句柄将有点类似于内核文件句柄,我将能够使用它。

在内核和用户模式之间build立共享内存通道的正确方法是什么?

Solutions Collecting From Web of "内核和用户模式之间的共享内存。 如何分享处理?"

对于选项1,可以通过OBJECT_ATTRIBUTES结构的SecurityDescriptor成员来指定分配给新创建对象的安全描述符。

对于选项2,您需要创建一个额外的句柄作为用户句柄,而不是在OBJECT_ATTRIBUTES结构中指定OBJ_KERNEL_HANDLE标志。 这只有在属于用户应用程序的进程的线程的上下文中运行时,例如在处理从用户应用程序接收到的IOCTL时,才打开新的句柄。

另一种选择是内核驱动程序使用ZwMapViewOfSection将该部分映射到用户模式应用程序的地址空间本身。

使用部分的一个问题是,驱动程序本身只能从系统线程安全地访问它。 如果这是一个问题,您可以直接共享内存,而不是通过一个部分。 如果以内核模式分配内存,则可以使用MmMapLockedPagesSpecifyCache将其映射到用户模式应用程序的地址空间中。

另一种选择是驱动程序访问由用户模式进程分配的内存缓冲区 。

这两种方法的缺点是缓冲区(或共享的部分)必须锁定在内存中,而使用区段则允许缓冲区是可分页的。

既然你提到32位应用程序,我假设它是在用户进程和设备驱动程序之间 – 我将使用IOCTL- METHOD_IN_DIRECT (接收缓冲区中的数据)和METHOD_OUT_DIRECT (将数据写入缓冲区)。

如果共享内存位于多个用户进程和一个或多个设备驱动程序之间 – 建议使用共享内存对象方法。