exclusion.h
#define UNIQUE_TO_SYSTEM 0 #define UNIQUE_TO_DESKTOP 1 #define UNIQUE_TO_SESSION 2 #define UNIQUE_TO_TRUSTEE 3 CString createExclusionName(LPCTSTR GUID, UINT kind = UNIQUE_TO_SYSTEM);
exclusion.cpp
#include "stdafx.h" #include "exclusion.h"
/**************************************************************************** * createExclusionName * Inputs: * LPCTSTR GUID: The GUID for the exclusion * UINT kind: Kind of exclusion * UNIQUE_TO_SYSTEM * UNIQUE_TO_DESKTOP * UNIQUE_TO_SESSION * UNIQUE_TO_TRUSTEE * Result: CString * A name to use for the exclusion mutex * Effect: * Creates the exclusion mutex name * Notes: * The GUID is created by a declaration such as * #define UNIQUE _T("MyAppName-{44E678F7-DA79-11d3-9FE9-006067718D04}") ****************************************************************************/
CString createExclusionName(LPCTSTR GUID, UINT kind) { switch(kind) { /* kind */ case UNIQUE_TO_SYSTEM: return CString(GUID); case UNIQUE_TO_DESKTOP: { /* desktop */ CString s = GUID; DWORD len; HDESK desktop = GetThreadDesktop(GetCurrentThreadId()); BOOL result = GetUserObjectInformation(desktop, UOI_NAME, NULL, 0, &len); DWORD err = ::GetLastError(); if(!result && err == ERROR_INSUFFICIENT_BUFFER) { /* NT/2000 */ LPBYTE data = new BYTE[len]; result = GetUserObjectInformation(desktop, UOI_NAME, data, len, &len); s += _T("-"); s += (LPCTSTR)data; delete [ ] data; } /* NT/2000 */ else { /* Win9x */ s += _T("-Win9x"); } /* Win9x */ return s; } /* desktop */ case UNIQUE_TO_SESSION: { /* session */ CString s = GUID; HANDLE token; DWORD len; BOOL result = OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &token); if(result) { /* NT */ GetTokenInformation(token, TokenStatistics, NULL, 0, &len); LPBYTE data = new BYTE[len]; GetTokenInformation(token, TokenStatistics, data, len, &len); LUID uid = ((PTOKEN_STATISTICS)data)->AuthenticationId; delete [ ] data; CString t; t.Format(_T("-%08x%08x"), uid.HighPart, uid.LowPart); return s + t; } /* NT */ else { /* 16-bit OS */ return s; } /* 16-bit OS */ } /* session */ case UNIQUE_TO_TRUSTEE: { /* trustee */ CString s = GUID; #define NAMELENGTH 64 TCHAR userName[NAMELENGTH]; DWORD userNameLength = NAMELENGTH; TCHAR domainName[NAMELENGTH]; DWORD domainNameLength = NAMELENGTH; if(GetUserName(userName, &userNameLength)) { /* get network name */ // The NetApi calls are very time consuming // This technique gets the domain name via an // environment variable domainNameLength = ExpandEnvironmentStrings(_T("%USERDOMAIN%"), domainName, NAMELENGTH); CString t; t.Format(_T("-%s-%s"), domainName, userName); s += t; } /* get network name */ return s; } /* trustee */ default: ASSERT(FALSE); break; } /* kind */ return CString(GUID); } // createExclusionName
Back in the original example, replace the string which I hardwired into the ::CreateMutex call with a call on createExclusionName with the desired specification to get a correctly-formatted unique name to use for the Mutex.
Comments