// // // #include "private.h" #include "sharemem.h" #include "globals.h" #include "candutil.h" //+--------------------------------------------------------------------------- // // GetDesktopUniqueName // //---------------------------------------------------------------------------- void GetDesktopUniqueName(const TCHAR *pchPrefix, ULONG cchPrefix, TCHAR *pch, ULONG cchPch) { StringCchCopy(pch, cchPch, pchPrefix); if (FIsWindowsNT() && cchPrefix < cchPch) { TCHAR ach[MAX_PATH]; DWORD dwLength; HDESK hdesk; hdesk = GetThreadDesktop(GetCurrentThreadId()); if (GetUserObjectInformation(hdesk, UOI_NAME, ach, sizeof(ach) /* byte count */, &dwLength)) { StringCchCopy(pch + cchPrefix, cchPch - cchPrefix, ach); } } } // // CCandUIMMFile // /* C C A N D U I M M F I L E */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ CCandUIMMFile::CCandUIMMFile( void ) { m_hFile = NULL; m_pvData = NULL; } /* ~ C C A N D U I M M F I L E */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ CCandUIMMFile::~CCandUIMMFile( void ) { Close(); } /* O P E N */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ BOOL CCandUIMMFile::Open( LPSTR szName, DWORD dwFlag ) { TCHAR achDesktopUniqueName[MAX_PATH]; DWORD dwDesiredAccess; if (m_hFile != NULL) { return FALSE; } // access flag if ((dwFlag & CANDUIMM_READWRITE) != 0) { dwDesiredAccess = FILE_MAP_ALL_ACCESS; } else { dwDesiredAccess = FILE_MAP_READ; } // open file GetDesktopUniqueName(szName, lstrlen(szName), achDesktopUniqueName, ARRAYSIZE(achDesktopUniqueName)); m_hFile = OpenFileMapping( dwDesiredAccess, FALSE, achDesktopUniqueName ); if (m_hFile == NULL) { return FALSE; } // memory mapping m_pvData = MapViewOfFile( m_hFile, dwDesiredAccess, 0, 0, 0 ); if (m_pvData == NULL) { Close(); return FALSE; } return TRUE; } /* C R E A T E */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ BOOL CCandUIMMFile::Create( LPSTR szName, DWORD dwFlag, SECURITY_ATTRIBUTES *psa, DWORD dwSize ) { DWORD flProtect; DWORD dwDesiredAccess; TCHAR achDesktopUniqueName[MAX_PATH]; if (m_hFile != NULL) { return FALSE; } // access flag if ((dwFlag & CANDUIMM_READWRITE) != 0) { flProtect = PAGE_READWRITE; dwDesiredAccess = FILE_MAP_ALL_ACCESS; } else { flProtect = PAGE_READONLY; dwDesiredAccess = FILE_MAP_READ; } // create file GetDesktopUniqueName(szName, lstrlen(szName), achDesktopUniqueName, ARRAYSIZE(achDesktopUniqueName)); m_hFile = CreateFileMapping( INVALID_HANDLE_VALUE, psa, flProtect, 0, dwSize, achDesktopUniqueName ); if (m_hFile == NULL) { return FALSE; } // memory mapping m_pvData = MapViewOfFile( m_hFile, dwDesiredAccess, 0, 0, 0 ); if (m_pvData == NULL) { Close(); return FALSE; } // initialize memset( m_pvData, 0, dwSize ); return TRUE; } /* C L O S E */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ BOOL CCandUIMMFile::Close( void ) { if (m_pvData != NULL) { UnmapViewOfFile( m_pvData ); m_pvData = NULL; } if (m_hFile != NULL) { CloseHandle( m_hFile ); m_hFile = NULL; } return TRUE; } // // CCandUIMutex // /* C C A N D U I M U T E X */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ CCandUIMutex::CCandUIMutex( void ) { m_hMutex = NULL; } /* ~ C C A N D U I M U T E X */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ CCandUIMutex::~CCandUIMutex( void ) { Close(); } /* C R E A T E */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ BOOL CCandUIMutex::Create( LPSTR szName, SECURITY_ATTRIBUTES *psa ) { TCHAR achDesktopUniqueName[MAX_PATH]; if (m_hMutex != NULL) { return FALSE; } GetDesktopUniqueName(szName, lstrlen(szName), achDesktopUniqueName, ARRAYSIZE(achDesktopUniqueName)); m_hMutex = CreateMutex( psa, FALSE, achDesktopUniqueName ); return (m_hMutex != NULL); } /* C L O S E */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ BOOL CCandUIMutex::Close( void ) { if (m_hMutex != NULL) { CloseHandle( m_hMutex ); m_hMutex = NULL; } return TRUE; } /* L O C K */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ BOOL CCandUIMutex::Lock( void ) { DWORD dwResult; if (m_hMutex == NULL) { return FALSE; } dwResult = WaitForSingleObject( m_hMutex, INFINITE ); switch (dwResult) { case WAIT_OBJECT_0: case WAIT_ABANDONED: { return TRUE; } default: case WAIT_TIMEOUT: { return FALSE; } } } /* U N L O C K */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ BOOL CCandUIMutex::Unlock( void ) { if (m_hMutex == NULL) { return FALSE; } ReleaseMutex( m_hMutex ); return TRUE; } // // CCandUIShareMem // /* C C A N D U I S H A R E M E M */ /*------------------------------------------------------------------------------ Constructor of CCandUIShareMem ------------------------------------------------------------------------------*/ CCandUIShareMem::CCandUIShareMem( void ) { } /* ~ C C A N D U I S H A R E M E M */ /*------------------------------------------------------------------------------ Destructor of CCandUIShareMem ------------------------------------------------------------------------------*/ CCandUIShareMem::~CCandUIShareMem( void ) { m_Mutex.Close(); } /* I N I T I A L I Z E */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ BOOL CCandUIShareMem::Initialize( void ) { return m_Mutex.Create( SZNAME_SHAREDDATA_MUTEX, GetCandUISecurityAttributes() ); } /* O P E N */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ BOOL CCandUIShareMem::Open( void ) { return m_MMFile.Open( SZNAME_SHAREDDATA_MMFILE, CANDUIMM_READONLY ); } /* C R E A T E */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ BOOL CCandUIShareMem::Create( void ) { BOOL fResult = FALSE; if (!m_Mutex.Lock()) { return FALSE; } fResult = m_MMFile.Create( SZNAME_SHAREDDATA_MMFILE, CANDUIMM_READWRITE, GetCandUISecurityAttributes(), sizeof(SHAREDDATA) ); m_Mutex.Unlock(); return fResult; } /* C L O S E */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ BOOL CCandUIShareMem::Close( void ) { return m_MMFile.Close(); } /* L O C K D A T A */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ BOOL CCandUIShareMem::LockData( void ) { return m_MMFile.IsValid() && m_Mutex.Lock(); } /* U N L O C K D A T A */ /*------------------------------------------------------------------------------ ------------------------------------------------------------------------------*/ BOOL CCandUIShareMem::UnlockData( void ) { return m_MMFile.IsValid() && m_Mutex.Unlock(); }