1 /* 2 * PROJECT: ReactOS Cicero 3 * LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later) 4 * PURPOSE: Cicero file mapping 5 * COPYRIGHT: Copyright 2023 Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com> 6 */ 7 8 #include "precomp.h" 9 #include "cicfmap.h" 10 11 CicFileMapping::CicFileMapping(LPCTSTR pszName, CicMutex *pMutex) 12 { 13 m_pszName = NULL; 14 m_pView = NULL; 15 m_hMapping = NULL; 16 m_bCreated = FALSE; 17 m_bHasMutex = FALSE; 18 m_pMutex = NULL; 19 Init(pszName, pMutex); 20 } 21 22 void CicFileMappingStatic::Close() 23 { 24 if (m_pView) 25 { 26 ::UnmapViewOfFile(m_pView); 27 m_pView = NULL; 28 } 29 30 if (m_hMapping) 31 { 32 ::CloseHandle(m_hMapping); 33 m_hMapping = NULL; 34 } 35 36 m_bCreated = FALSE; 37 } 38 39 void CicFileMappingStatic::Init(LPCTSTR pszName, CicMutex *pMutex) 40 { 41 if (pMutex) 42 m_pMutex = pMutex; 43 44 m_bCreated = FALSE; 45 m_pszName = pszName; 46 m_bHasMutex = (pMutex != NULL); 47 } 48 49 LPVOID 50 CicFileMappingStatic::Create( 51 LPSECURITY_ATTRIBUTES pSA, 52 DWORD dwMaximumSizeLow, 53 LPBOOL pbAlreadyExists) 54 { 55 if (!m_pszName) 56 return NULL; 57 58 m_hMapping = ::CreateFileMapping(INVALID_HANDLE_VALUE, 59 pSA, 60 PAGE_READWRITE, 61 0, 62 dwMaximumSizeLow, 63 m_pszName); 64 if (pbAlreadyExists) 65 *pbAlreadyExists = (::GetLastError() == ERROR_ALREADY_EXISTS); 66 if (!m_hMapping) 67 return NULL; 68 69 m_bCreated = TRUE; 70 return _Map(); 71 } 72 73 LPVOID CicFileMappingStatic::Open() 74 { 75 if (!m_pszName) 76 return NULL; 77 m_hMapping = ::OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, m_pszName); 78 if (!m_hMapping) 79 return NULL; 80 81 return _Map(); 82 } 83 84 LPVOID CicFileMappingStatic::_Map() 85 { 86 m_pView = ::MapViewOfFile(m_hMapping, FILE_MAP_WRITE, 0, 0, 0); 87 if (!m_pView) 88 { 89 Close(); 90 return NULL; 91 } 92 return m_pView; 93 } 94 95 BOOL CicFileMappingStatic::Enter() 96 { 97 if (!m_bHasMutex) 98 return TRUE; 99 return m_pMutex->Enter(); 100 } 101 102 void CicFileMappingStatic::Leave() 103 { 104 if (!m_bHasMutex) 105 return; 106 m_pMutex->Leave(); 107 } 108 109 BOOL CicFileMappingStatic::Flush(SIZE_T dwNumberOfBytesToFlush) 110 { 111 if (!m_pView) 112 return FALSE; 113 return ::FlushViewOfFile(m_pView, dwNumberOfBytesToFlush); 114 } 115 116 void CicFileMappingStatic::Finalize() 117 { 118 if (!m_bHasMutex) 119 return; 120 121 Close(); 122 Leave(); 123 } 124