gpt4 book ai didi

windows - Windows 上的共享内存访问权限

转载 作者:可可西里 更新时间:2023-11-01 13:04:25 26 4
gpt4 key购买 nike

我开发了一个 Windows 应用程序,它使用共享内存——也就是说——进程间通信的内存映射文件。我有一个 Windows 服务,它进行一些处理并定期将数据写入内存映射文件。我有一个单独的 Windows 应用程序,它从内存映射文件中读取并显示信息。该应用程序在 Windows XP、XP Pro 和 Server 2003 上按预期运行,但在 Vista 上运行不正常。

我可以看到写入内存映射文件的数据是由 Windows 服务正确发生的,因为我可以用文本编辑器打开文件并查看存储的消息,但“消费者”应用程序无法读取文件。这里需要注意的一件有趣的事情是,如果我关闭消费者应用程序并重新启动它,它会使用之前写入内存映射文件的消息。

此外,另一件奇怪的事情是,当我使用远程桌面连接到 Windows 主机并通过远程桌面调用/使用消费者应用程序时,我得到了相同的行为。但是,如果我调用远程桌面并使用以下命令连接到目标主机的控制台 session :mstsc -v:servername/F -console,一切都会完美运行。

所以这就是为什么我认为问题与权限有关。有人可以对此发表评论吗?

编辑:

我用来创建内存映射文件和同步访问的 Mutex 对象的 ACL 如下:

TCHAR * szSD = TEXT("D:")
TEXT("(A;;RPWPCCDCLCSWRCWDWOGAFA;;;S-1-1-0)")
TEXT("(A;;GA;;;BG)")
TEXT("(A;;GA;;;AN)")
TEXT("(A;;GA;;;AU)")
TEXT("(A;;GA;;;LS)")
TEXT("(A;;GA;;;RD)")
TEXT("(A;;GA;;;WD)")
TEXT("(A;;GA;;;BA)");

我认为这可能是问题的一部分。

最佳答案

所以我找到了解决问题的方法:

在 Windows XP 上,所有已命名的内核对象(如互斥量、信号量和内存映射对象)都存储在同一个命名空间中。因此,当不同用户 session 中的不同进程使用其名称引用特定对象时,它们将获得该对象的句柄。但是,作为安全预防措施,Windows 终端服务为从其 session 中启动的进程引用的内核对象创建了一个单独的命名空间。 Windows Vista 也内置了这种行为,所以这就是我的应用程序无法在 Vista 上正常运行的原因。详细来说,我有一个在空 session 中运行的 Windows 服务和一个在用户 session 中运行的应用程序,因此我的命名对象是在单独的命名空间中创建的。

这个问题的快速解决方法是通过在每个内核对象名称前添加“Global\”来使用全局命名空间,我使用了这个方法,并且成功了。

关于windows - Windows 上的共享内存访问权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/176331/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com