请选择 进入手机版 | 继续访问电脑版

C++编程

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2574|回复: 1

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

[复制链接]

8

主题

31

帖子

323

积分

版主

Rank: 7Rank: 7Rank: 7

积分
323
QQ
发表于 2015-12-9 16:30:48 | 显示全部楼层 |阅读模式
最近在做一个项目,分成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 也有这个参数。


VC纵横、磐实编程网
回复

使用道具 举报

0

主题

2

帖子

18

积分

菜鸟

Rank: 1

积分
18
发表于 2015-12-9 17:14:56 | 显示全部楼层
貌似创建内核对象都有这个参数
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|C++编程  

GMT+8, 2019-12-10 05:58 , Processed in 0.093750 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表