我正在尝试在用户进程和内核之间使用共享内存。
选项一 - 让内核创建部分并让用户模式应用程序通过名称“Global\my_mem”打开内存。它仅在只读模式下工作。当我尝试使用 FILE_MAP_WRITE 打开部分时,它会拒绝访问(5)。不确定如何授予访问权限或修改 DACL。
选项二 - 通过 IOCTL 将句柄传回。这是有问题的,因为在 KERNEL 中打开的部分的句柄是 0xFFFFFFFF80001234。据我了解,设置了任何高位的句柄不能在用户模式下使用。特别是如果应用程序是 32 位的话:) 最初我预计该部分句柄将与内核文件句柄有些相似,并且我将能够使用它。
在内核和用户模式之间建立共享内存通道的正确方法是什么?
对于选项 1,您可以通过以下方式指定分配给新创建的对象的安全描述符:SecurityDescriptor
的成员OBJECT_ATTRIBUTES结构 https://msdn.microsoft.com/en-us/library/windows/hardware/ff557749%28v=vs.85%29.aspx.
对于选项 2,您需要创建一个附加句柄作为用户句柄,您可以通过不指定OBJ_KERNEL_HANDLE
标志在OBJECT_ATTRIBUTES
结构。仅当您在属于用户应用程序进程的线程上下文中运行时打开新句柄时,例如,在处理从用户应用程序接收到的 IOCTL 时,这才有效。
另一种选择是内核驱动程序将该部分映射到用户模式应用程序的地址空间本身,使用ZwMapViewOfSection https://msdn.microsoft.com/en-us/library/windows/hardware/ff566481%28v=vs.85%29.aspx.
使用节的一个问题是驱动程序本身只能从系统线程安全地访问它。如果这是一个问题,您可以直接共享内存,而不是通过一个部分。如果在内核模式下分配内存,则可以使用以下命令将其映射到用户模式应用程序的地址空间MmMapLockedPagesSpecifyCache https://msdn.microsoft.com/en-us/library/windows/hardware/ff554629%28v=vs.85%29.aspx.
还有一个选择是驱动程序访问由用户模式进程分配的内存缓冲区 https://stackoverflow.com/a/11047456/886887.
这些方法的缺点是缓冲区(或其共享的部分)必须锁定在内存中,而使用节则允许缓冲区可分页。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)