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

最近在做一个项目,分成NT服务程序与普通用户进程,并使用了映射内存的方式进行进程间数据传递,同时也设有几个进程共用的内存进行参数设置什么的,这样就得用Mutex进行同步。
本来这种问题,是没什么可以说的,也就是先用 CreateMutex 后其它进程再 OpenMutex,其它的就是CreateSemaphore OpenSemaphore
CreateFileMapping OpenFileMapping。
但是问题来了,在XP或XP以下系统是没任何问题的,可是在XP以上系统,微软加强了安全方面的设置。导致程序无法使用。
也就是NT服务程序CreateMutex后,普通进程OpenMutex是打不开的,用GetLastError返回5,出现拒绝访问。

解决办法:
最后,仔细观察各函数发现
CreateSemaphore  CreateFileMapping CreateMutex都有一个参数是 LPSECURITY_ATTRIBUTES 类型,一般我们写上NULL,设系统设置,这就是主要原因,WIN7设置得很高。
我们改成自定义就好了,代码如下
  1.                 SECURITY_DESCRIPTOR sd;
  2.                         ::InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION);
  3.                         ::SetSecurityDescriptorDacl(&sd, TRUE, (PACL)NULL, FALSE);
  4.                         SECURITY_ATTRIBUTES sa;
  5.                         sa.nLength = sizeof(SECURITY_ATTRIBUTES);
  6.                         sa.bInheritHandle = TRUE;
  7.                         sa.lpSecurityDescriptor = &sd;
复制代码
然后,创建的函数这样写

m_hSemaphore = ::CreateSemaphore( &sa, 0,



问题得到解决

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


原文地址:http://c.panshy.com/thread-13-1-1.html

你可能感兴趣的:(windows编程)