Reactos
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}