Reactos
at master 123 lines 2.5 kB view raw
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 11CicFileMapping::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 22void 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 39void 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 49LPVOID 50CicFileMappingStatic::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 73LPVOID 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 84LPVOID 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 95BOOL CicFileMappingStatic::Enter() 96{ 97 if (!m_bHasMutex) 98 return TRUE; 99 return m_pMutex->Enter(); 100} 101 102void CicFileMappingStatic::Leave() 103{ 104 if (!m_bHasMutex) 105 return; 106 m_pMutex->Leave(); 107} 108 109BOOL CicFileMappingStatic::Flush(SIZE_T dwNumberOfBytesToFlush) 110{ 111 if (!m_pView) 112 return FALSE; 113 return ::FlushViewOfFile(m_pView, dwNumberOfBytesToFlush); 114} 115 116void CicFileMappingStatic::Finalize() 117{ 118 if (!m_bHasMutex) 119 return; 120 121 Close(); 122 Leave(); 123}