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