NT服务开的共享内存,应用程序如何访问?

tifaling 2005-08-17 10:06:56
我有一NT服务开辟了一段共享内存,代码如下:
globalCaUsbCheckerMapObj=CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,sizeof(CaUsbCheckerMapObj),"caUsbCheckerMapObj");//创建共享内存

globalCaUsbCheckerMapObjPtr=MapViewOfFile(globalCaUsbCheckerMapObj,FILE_MAP_ALL_ACCESS,0,0,0);//获取指针

memcpy(globalCaUsbCheckerMapObjPtr, &globalCaUsbCheckerMapObjStruct,sizeof(globalCaUsbCheckerMapObjStruct));//拷贝内容

可是APP应用程序却无法获取使用:
hMemFile=CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READONLY,0,158,"caUsbCheckerMapObj");
//这里hMemFile老是返回NULL,GetLastError总是返回"拒绝访问"
pData=(char *)MapViewOfFile(hMemFile,FILE_MAP_READ,0,0,0);
pMemData=( pCaUsbCheckerMapObj)pData;

请问这是怎么回事,我应该如何访问呢?
...全文
246 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
zxyjyzxyjy 2005-08-20
  • 打赏
  • 举报
回复
是不是你指定的大小不一样?
在第二个参数都为NULL的情况下,bager(柏哥)说的是否真有必要做?
loucai 2005-08-20
  • 打赏
  • 举报
回复
xuexi
bager 2005-08-20
  • 打赏
  • 举报
回复
To: zxyjyzxyjy(星星)

对于创建共享内存对象的进程而言,如果第二个参数为NULL,那么系统将为这个共享内存对象赋予缺省的安全描述符。将导致这个Securable对象仅能由同等访问权限的进程访问。

同等访问权限可能具备这样的含义:
服务程序创建的Securable对象仅对服务程序开放,Administrators组的权限再大也无济于事。

bager 2005-08-18
  • 打赏
  • 举报
回复
1〉请问这是怎么回事,我应该如何访问呢?

Windows 安全性提供了对Securable对象进行访问控制的功能。
共享内存和NTFS文件系统的文件/目录一样,都是Securable对象,直译就是可受保护的对象。
用来描述Securable对象的数据信息被称为安全描述符中,它包含SID、DACL、SACL等内容。
创建的共享内存对象时,如不指定lpAttributes参数,系统将为其赋予缺省的的安全描述符。
如果调用进程持有不同Access token,那么这个缺省的安全描述符也会不尽相同。
由于Service程序通常使用LocalSystem登录帐号运行,与APP使用不同的进程上下文环境。

于是,供求不等,导致APP无法访问NT服务开辟的共享内存。

2〉请问这是怎么回事,我应该如何访问呢?
简单的方法(已确认正确),打开服务控制管理器,选择开辟了共享内存的NT服务。
右键属性,选择登录Tab页,为其设定登录帐户名及密码(注意:指定与运行APP权限相同的帐户)

复杂点的,参看 jiangsheng(蒋晟.MSMVP2004Jan) 提供的链接内容。

idAnts 2005-08-17
  • 打赏
  • 举报
回复
http://community.csdn.net/Expert/topic/4104/4104307.xml?temp=.5776789
蒋晟 2005-08-17
  • 打赏
  • 举报
回复
http://blog.csdn.net/jiangsheng/archive/2004/06/24/25563.aspx

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧