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
本来这种问题,是没什么可以说的,也就是先用 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
相关文章推荐
- js实现微信分享代码
- Android中View的触摸事件涉及到哪些方法?他们之间有什么关系?
- Android之TabHost
- 编译Android系统源码和内核源码
- Android必学之AsyncTask
- App应用测试平台
- Android创建菜单栏(android布局实现)
- Android SwipeRefreshLayout
- AndroidStudio插件GsonFormat快速实现Java实体对象
- 【转】微信缓存、浏览器缓存等各种顽固缓存的解决方法,缓存解决方法
- Mac下android studio 安装Genymotion插件找不到地址错误
- Application 的坑
- 微信中长按弹出菜单(1) 没有实现功能
- Android 共享文件的 Runtime 权限
- iOS 常遇问题与解决
- 设置进程安全上下文的代码实现 ---- SEAndroid in android 5.x
- AndroidStudio创建Module
- IOS支付宝SDK集成到工程中(小白适用大神勿扰)
- iOS开发之圆形展示不同比例模块demo
- IOS项目集成ShareSDK实现第三方登录、分享、关注等功能。