您的位置:首页 > 移动开发

OpenMutex、OpenSemaphore、OpenFileMapping在win7以上系统权限问题

2015-12-09 16:38 417 查看
最近在做一个项目,分成NT服务程序与普通用户进程,并使用了映射内存的方式进行进程间数据传递,同时也设有几个进程共用的内存进行参数设置什么的,这样就得用Mutex进行同步。

本来这种问题,是没什么可以说的,也就是先用 CreateMutex 后其它进程再 OpenMutex,其它的就是CreateSemaphore OpenSemaphore

CreateFileMapping OpenFileMapping。

但是问题来了,在XP或XP以下系统是没任何问题的,可是在XP以上系统,微软加强了安全方面的设置。导致程序无法使用。

也就是NT服务程序CreateMutex后,普通进程OpenMutex是打不开的,用GetLastError返回5,出现拒绝访问。

解决办法:

最后,仔细观察各函数发现

CreateSemaphore CreateFileMapping CreateMutex都有一个参数是 LPSECURITY_ATTRIBUTES 类型,一般我们写上NULL,设系统设置,这就是主要原因,WIN7设置得很高。

我们改成自定义就好了,代码如下

SECURITY_DESCRIPTOR sd;

::InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION);

::SetSecurityDescriptorDacl(&sd, TRUE, (PACL)NULL, FALSE);

SECURITY_ATTRIBUTES sa;

sa.nLength = sizeof(SECURITY_ATTRIBUTES);

sa.bInheritHandle = TRUE;

sa.lpSecurityDescriptor = &sd;

复制代码
然后,创建的函数这样写

m_hSemaphore = ::CreateSemaphore( &sa, 0,

问题得到解决

提醒大家,CreateFile 也有这个参数。

原文地址:http://c.panshy.com/thread-13-1-1.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: