"Standard users do have the rights to create global named objects like events and mutexes. The only exception is global file mappings (i.e. global shared memory), which since 2003 can only be created by standard users if running in session 0 - which under Vista basically means never, since only services run in session 0 on Vista." http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=839720&SiteID=1
how did you initialize your security descriptor? How did you modify the ACL?
int _stdcall BuildRestrictedSD(PSECURITY_DESCRIPTOR pSd){
DWORD dwAclLength; int iResult=0;
PSID psidEveryone = NULL; PACL pDACL = NULL;
BOOL bResult = FALSE; PACCESS_ALLOWED_ACE pACE = NULL; SID_IDENTIFIER_AUTHORITY siaWorld = SECURITY_WORLD_SID_AUTHORITY ;
SECURITY_INFORMATION si = DACL_SECURITY_INFORMATION;
__try {
if (!InitializeSecurityDescriptor(pSd,
SECURITY_DESCRIPTOR_REVISION)) {
iResult=1;
__leave;
} if (!AllocateAndInitializeSid(&siaWorld, 1,
SECURITY_WORLD_RID, 0, 0, 0, 0, 0, 0, 0,
&psidEveryone)) {
iResult=2;
__leave;
} dwAclLength = sizeof(ACL)
+ sizeof(ACCESS_ALLOWED_ACE) - sizeof(DWORD)
+ GetLengthSid(psidEveryone);
pDACL = (PACL) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
dwAclLength);
if (!pDACL) {
iResult=3;
__leave;
} if (!InitializeAcl(pDACL, dwAclLength, ACL_REVISION)) {
iResult=4;
__leave;
}
if (!AddAccessAllowedAce(pDACL, ACL_REVISION,
GENERIC_ALL,
psidEveryone)) {
iResult=5;
__leave;
} if (!SetSecurityDescriptorDacl(pSd, TRUE, pDACL, FALSE)) {
iResult=6;
__leave;
} bResult = TRUE;
} __finally {
if (psidEveryone) FreeSid(psidEveryone);
}
if(bResult==FALSE){
if (pDACL) HeapFree(GetProcessHeap(), 0, pDACL);
pDACL = NULL;
}
ptr=(PVOID)pDACL;
return iResult;
}
void _stdcall FreeRestrictedSD(){
if(ptr) HeapFree(GetProcessHeap(), 0, ptr);
}
int _stdcall InitMap(){
SECURITY_ATTRIBUTES sa;
SECURITY_DESCRIPTOR sd;
sa.nLength=sizeof(sa);
sa.bInheritHandle=FALSE;
sa.lpSecurityDescriptor=&sd;
int iResult=BuildRestrictedSD(&sd);
if(iResult==0){
hFileMap=CreateFileMapping(INVALID_HANDLE_VALUE,&sa,PAGE_READWRITE,0,1024,"be9d6090-9842-41b2-90cd-9c8dcc1805c4");
if(hFileMap==NULL) {
iResult=7;
}else{
pFileView=MapViewOfFile(hFileMap,FILE_MAP_WRITE,0,0,0);
if(pFileView==NULL){
iResult=8;
}
}
}
return iResult;
}
void _stdcall FreeMap(){
if(pFileView){
UnmapViewOfFile(pFileView);
}
if(hFileMap){
CloseHandle(hFileMap) ;
}
FreeRestrictedSD();
}
void _stdcall WriteInfo(LPCTSTR pInfo){
RtlMoveMemory(pFileView,pInfo,strlen(pInfo));
}
不过也不会出access denied错误啊,奇怪了
请问你说的CreateFileMapping时使用的名字前面要加global\\ 是加在哪里啊~~是加在CreateFileMapping方法里面吗。。