xref: /reactos/sdk/lib/cicero/cicfmap.cpp (revision b36d9bd9)
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