内核态和用户态共享内存。如何共享句柄?
Shared memory between kernel and user mode. How to share handle?
我正在尝试在用户进程和内核之间使用共享内存。
选项一 - 让内核创建部分并让用户模式应用程序按名称打开内存 "Global\my_mem"。它仅在只读模式下工作。当我尝试打开带有 FILE_MAP_WRITE 的部分时,它拒绝访问 (5)。不确定如何授予访问权限或修改 DACL。
选项二 - 通过 IOCTL 传回句柄。这是有问题的,因为在 KERNEL 中打开的部分句柄是 0xFFFFFFFF80001234。我的理解是,设置了任何高位的句柄不能在用户模式下使用。特别是如果应用程序是 32 位的 :) 最初我预计该节句柄会有点类似于内核文件句柄,我将能够使用它。
在内核模式和用户模式之间建立共享内存通道的正确方法是什么?
既然你提到了 32 位应用程序,我假设它介于用户进程和设备驱动程序之间 - 我会使用 IOCTL - METHOD_IN_DIRECT
(在缓冲区中接收数据)和 METHOD_OUT_DIRECT
(将数据写入缓冲区)。
如果共享内存在多个用户进程和一个或多个设备驱动程序之间 - 建议使用共享内存对象方法。
对于选项 1,您可以通过 OBJECT_ATTRIBUTES
structure 的 SecurityDescriptor
成员指定分配给新创建对象的安全描述符。
对于选项 2,您需要创建一个附加句柄作为用户句柄,您可以通过不在 OBJECT_ATTRIBUTES
结构中指定 OBJ_KERNEL_HANDLE
标志来实现。这仅在您在属于用户应用程序进程的线程上下文中 运行 打开新句柄时才有效,例如,在处理从用户应用程序接收到的 IOCTL 时。
另一个选项是内核驱动程序使用 ZwMapViewOfSection.
将部分映射到用户模式应用程序的地址 space 本身
使用节的一个问题是驱动程序本身只能从系统线程安全地访问它。如果这是一个问题,您可以直接共享内存而不是通过一个部分。如果您在内核模式下分配内存,则可以使用 MmMapLockedPagesSpecifyCache.
将其映射到用户模式应用程序的地址 space
另一个选项是 the driver to access a memory buffer allocated by the user-mode process。
这两种方法的缺点是缓冲区(或其共享部分)必须锁定在内存中,而使用节允许缓冲区可分页。
我正在尝试在用户进程和内核之间使用共享内存。
选项一 - 让内核创建部分并让用户模式应用程序按名称打开内存 "Global\my_mem"。它仅在只读模式下工作。当我尝试打开带有 FILE_MAP_WRITE 的部分时,它拒绝访问 (5)。不确定如何授予访问权限或修改 DACL。
选项二 - 通过 IOCTL 传回句柄。这是有问题的,因为在 KERNEL 中打开的部分句柄是 0xFFFFFFFF80001234。我的理解是,设置了任何高位的句柄不能在用户模式下使用。特别是如果应用程序是 32 位的 :) 最初我预计该节句柄会有点类似于内核文件句柄,我将能够使用它。
在内核模式和用户模式之间建立共享内存通道的正确方法是什么?
既然你提到了 32 位应用程序,我假设它介于用户进程和设备驱动程序之间 - 我会使用 IOCTL - METHOD_IN_DIRECT
(在缓冲区中接收数据)和 METHOD_OUT_DIRECT
(将数据写入缓冲区)。
如果共享内存在多个用户进程和一个或多个设备驱动程序之间 - 建议使用共享内存对象方法。
对于选项 1,您可以通过 OBJECT_ATTRIBUTES
structure 的 SecurityDescriptor
成员指定分配给新创建对象的安全描述符。
对于选项 2,您需要创建一个附加句柄作为用户句柄,您可以通过不在 OBJECT_ATTRIBUTES
结构中指定 OBJ_KERNEL_HANDLE
标志来实现。这仅在您在属于用户应用程序进程的线程上下文中 运行 打开新句柄时才有效,例如,在处理从用户应用程序接收到的 IOCTL 时。
另一个选项是内核驱动程序使用 ZwMapViewOfSection.
将部分映射到用户模式应用程序的地址 space 本身使用节的一个问题是驱动程序本身只能从系统线程安全地访问它。如果这是一个问题,您可以直接共享内存而不是通过一个部分。如果您在内核模式下分配内存,则可以使用 MmMapLockedPagesSpecifyCache.
将其映射到用户模式应用程序的地址 space另一个选项是 the driver to access a memory buffer allocated by the user-mode process。
这两种方法的缺点是缓冲区(或其共享部分)必须锁定在内存中,而使用节允许缓冲区可分页。