服务程序创建共享内存,外部一个程序要进行读写内存的操作,如何实现?
解决方案 »
- #define的用法,这个问题比较菜。。
- 用CSpreadSheet类访问Excel表格单元格内容前面为什么有"'"这个符号?
- 制作256色工具栏,但是程序运行后图标的背景色与对话框的背景色不同????
- 谁能提供一些检测内存泄露的工具或方法
- 请教得到表中记录个数的函数是(ADODC控件)?(在线等)
- 一句话问题,折腾我几天而不能解,请斑竹和各位高手帮忙,UP酌情给分!
- 菜鸟问题:我建立一个工程后,用ClassWizard增加了一个类,它的基类是CTreeView,当我编译的时候出现错误,提示我的基类是不明确的,这是为什么
- ftp.seu.edu.cn这个站怎么进,IE进去后无显示
- 如何最快找到自己提的问题?(给分)
- 我该怎么办呀?
- 这个代码哪儿有错误,请大家发表高见??????
- 《深入浅出MFC(第二版)》与《Visual C++技术内幕(第四版》 ,这两本书哪一本更好,因为我只打算选这二者其中之一作为主要阅读。
CreateFileMapping
OpenFileMapping
重点是有两个:
一个:
服务程序创建的时候CreateFileMapping这个LPSECURITY_ATTRIBUTES参数不能为空,否则默认权限的话,普通程序是不能用写权限打开的。二个:文件映射的名字应当是介样的:"Global\\yourName"。
其它都一样了。给分给分。
PSID pEveryoneSID = NULL, pAdminSID = NULL;
PACL pACL = NULL;
PSECURITY_DESCRIPTOR pSD = NULL;
EXPLICIT_ACCESS ea[2];
SID_IDENTIFIER_AUTHORITY SIDAuthWorld = SECURITY_WORLD_SID_AUTHORITY;
SID_IDENTIFIER_AUTHORITY SIDAuthNT = SECURITY_NT_AUTHORITY;
SECURITY_ATTRIBUTES sa;
// Create a well-known SID for the Everyone group.
char ErrorInfo[1024];
if(!AllocateAndInitializeSid(&SIDAuthWorld, 1,
SECURITY_WORLD_RID,
0, 0, 0, 0, 0, 0, 0,
&pEveryoneSID))
{
wsprintf(ErrorInfo,"AllocateAndInitializeSid Error %u\n", GetLastError());
OutputDebugString(ErrorInfo);
break;
}
// Initialize an EXPLICIT_ACCESS structure for an ACE.
// The ACE will allow Everyone read access to the key.
ZeroMemory(&ea, 2 * sizeof(EXPLICIT_ACCESS));
ea[0].grfAccessPermissions = KEY_READ;
ea[0].grfAccessMode = SET_ACCESS;
ea[0].grfInheritance= NO_INHERITANCE;
ea[0].Trustee.TrusteeForm = TRUSTEE_IS_SID;
ea[0].Trustee.TrusteeType = TRUSTEE_IS_WELL_KNOWN_GROUP;
ea[0].Trustee.ptstrName = (LPTSTR) pEveryoneSID;
// Create a SID for the BUILTIN\Administrators group.
if(! AllocateAndInitializeSid(&SIDAuthNT, 2,
SECURITY_BUILTIN_DOMAIN_RID,
DOMAIN_ALIAS_RID_ADMINS,
0, 0, 0, 0, 0, 0,
&pAdminSID))
{
wsprintf(ErrorInfo,"AllocateAndInitializeSid Error %u\n", GetLastError());
OutputDebugString(ErrorInfo);
FreeSid(pEveryoneSID);
break;
}
// Initialize an EXPLICIT_ACCESS structure for an ACE.
// The ACE will allow the Administrators group full access to the key.
ea[1].grfAccessPermissions = KEY_ALL_ACCESS;
ea[1].grfAccessMode = SET_ACCESS;
ea[1].grfInheritance= NO_INHERITANCE;
ea[1].Trustee.TrusteeForm = TRUSTEE_IS_SID;
ea[1].Trustee.TrusteeType = TRUSTEE_IS_GROUP;
ea[1].Trustee.ptstrName = (LPTSTR) pAdminSID;
// Create a new ACL that contains the new ACEs.
dwRes = SetEntriesInAcl(2, ea, NULL, &pACL);
if (ERROR_SUCCESS != dwRes)
{
wsprintf(ErrorInfo,"SetEntriesInAcl Error %u\n", GetLastError());
OutputDebugString(ErrorInfo);
FreeSid(pEveryoneSID);
FreeSid(pAdminSID);
LocalFree(pACL);
break;
}
// Initialize a security descriptor.
pSD = (PSECURITY_DESCRIPTOR) LocalAlloc(LPTR,
SECURITY_DESCRIPTOR_MIN_LENGTH);
if (NULL == pSD)
{
wsprintf(ErrorInfo,"LocalAlloc Error %u\n", GetLastError());
OutputDebugString(ErrorInfo);
FreeSid(pEveryoneSID);
FreeSid(pAdminSID);
LocalFree(pACL);
LocalFree(pSD);
break;
}
if (!InitializeSecurityDescriptor(pSD, SECURITY_DESCRIPTOR_REVISION))
{
wsprintf(ErrorInfo,"InitializeSecurityDescriptor Error %u\n",
GetLastError());
OutputDebugString(ErrorInfo);
FreeSid(pEveryoneSID);
FreeSid(pAdminSID);
LocalFree(pACL);
LocalFree(pSD);
break;
}
// Add the ACL to the security descriptor.
if (!SetSecurityDescriptorDacl(pSD,
TRUE, // bDaclPresent flag
pACL,
FALSE)) // not a default DACL
{
wsprintf(ErrorInfo,"SetSecurityDescriptorDacl Error %u\n", GetLastError());
OutputDebugString(ErrorInfo);
FreeSid(pEveryoneSID);
FreeSid(pAdminSID);
LocalFree(pACL);
LocalFree(pSD);
break;
}
// Initialize a security attributes structure.
sa.nLength = sizeof (SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = pSD;
sa.bInheritHandle = FALSE;
// Use the security attributes to set the security descriptor
// when you create a key.
///////////////////////////////////////////////////////////////////// HANDLE hFile = INVALID_HANDLE_VALUE;
hMapFile = CreateFileMapping(hFile,&sa,
PAGE_READWRITE,0,100,"Global\\MyFileMappingObject");
if (hMapFile == NULL)
{
OutputDebugString("Could not create file mapping object.\r\n");
FreeSid(pEveryoneSID);
FreeSid(pAdminSID);
LocalFree(pACL);
LocalFree(pSD);
break;
}
if (pEveryoneSID)
FreeSid(pEveryoneSID);
if (pAdminSID)
FreeSid(pAdminSID);
if (pACL)
LocalFree(pACL);
if (pSD)
LocalFree(pSD);