我需要使用一个全局mutex被几个进程,以获得一个双方共享的文件同步。 我创建互斥这样:
HANDLE hMutex = ::CreateMutex(NULL, FALSE, L"Global\\MySpecialName");
然后用它在:
//Entering critical section
VERIFY(::WaitForSingleObject(hMutex, INFINITE) == WAIT_OBJECT_0);
接着:
//Leave critical section
VERIFY(::ReleaseMutex(hMutex));
这个问题源于一个事实,即共享该互斥体的过程是一个本地系统服务和几个用户模式进程与登录用户的凭据运行。 所以,如果是第一次由服务创建互斥,那么当用户模式进程试图打开它, CreateMutex
失败,错误代码ERROR_ACCESS_DENIED
。
我正在读入创建之前指定的互斥体的安全描述符,但我似乎无法弄清楚如何能让它访问的everything
,我真的不需要任何复杂吗?
下面是我使用的基础上, 这篇文章 :
HANDLE hMutex = NULL;
DWORD dwError;
// Create a global mutex
pSecDesc = MakeAllowAllSecurityDescriptor();
if(pSecDesc)
{
SECURITY_ATTRIBUTES SecAttr;
SecAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
SecAttr.lpSecurityDescriptor = pSecDesc;
SecAttr.bInheritHandle = FALSE;
hMutex = CreateMutex(&SecAttr, TRUE, MUTEX_NAME);
dwError = GetLastError();
LocalFree(pSecDesc);
}
...
//
// From http://blogs.msdn.com/b/winsdk/archive/2009/11/10/access-denied-on-a-mutex.aspx
//
PSECURITY_DESCRIPTOR MakeAllowAllSecurityDescriptor(void)
{
WCHAR *pszStringSecurityDescriptor;
if(GetWindowsVersion(NULL) >= 6)
pszStringSecurityDescriptor = L"D:(A;;GA;;;WD)(A;;GA;;;AN)S:(ML;;NW;;;ME)";
else
pszStringSecurityDescriptor = L"D:(A;;GA;;;WD)(A;;GA;;;AN)";
PSECURITY_DESCRIPTOR pSecDesc;
if(!ConvertStringSecurityDescriptorToSecurityDescriptor(pszStringSecurityDescriptor, SDDL_REVISION_1, &pSecDesc, NULL))
return NULL;
return pSecDesc;
}