@@ -54,34 +54,36 @@ namespace REX
5454 return m_file != REX::W32::INVALID_HANDLE_VALUE;
5555 }
5656
57- bool create (const std::string_view a_name, std::size_t a_size)
57+ bool create (bool a_write, const std::string_view a_name, std::size_t a_size)
5858 {
5959 close ();
6060
61- if (create_impl (a_name, a_size))
61+ if (create_impl (a_write, a_name, a_size))
6262 return true ;
6363
6464 close ();
6565 return false ;
6666 }
6767
68- bool create (std::filesystem::path a_path, const std::string_view a_name, std::size_t a_size = DYNAMIC_SIZE)
68+ bool create (bool a_write, std::filesystem::path a_path, const std::string_view a_name, std::size_t a_size = DYNAMIC_SIZE)
6969 {
7070 close ();
7171
72- m_file = REX::W32::CreateFileW (a_path.c_str (), REX::W32::GENERIC_READ | REX::W32::GENERIC_WRITE, REX::W32::FILE_SHARE_READ | REX::W32::FILE_SHARE_WRITE, nullptr , REX::W32::OPEN_EXISTING, REX::W32::FILE_ATTRIBUTE_READONLY, nullptr );
72+ const auto access = a_write ? REX::W32::GENERIC_READ | REX::W32::GENERIC_WRITE : REX::W32::GENERIC_READ;
73+ const auto share = a_write ? REX::W32::FILE_SHARE_READ | REX::W32::FILE_SHARE_WRITE : REX::W32::FILE_SHARE_READ;
74+ m_file = REX::W32::CreateFileW (a_path.c_str (), access, share, nullptr , REX::W32::OPEN_EXISTING, REX::W32::FILE_ATTRIBUTE_READONLY, nullptr );
7375 if (m_file == REX::W32::INVALID_HANDLE_VALUE)
7476 return false ;
7577
76- if (create_impl (a_name, a_size))
78+ if (create_impl (a_write, a_name, a_size))
7779 return true ;
7880
7981 close ();
8082 return false ;
8183 }
8284
8385 private:
84- bool create_impl (const std::string_view a_name, std::size_t a_size)
86+ bool create_impl (bool a_write, const std::string_view a_name, std::size_t a_size)
8587 {
8688 REX::W32::LARGE_INTEGER size;
8789 if (a_size == DYNAMIC_SIZE) {
@@ -90,21 +92,23 @@ namespace REX
9092
9193 if (REX::W32::GetFileSizeEx (m_file, &size) == 0 )
9294 return false ;
95+
9396 } else {
9497 size.value = a_size;
9598 }
9699
97- m_map = REX::W32::OpenFileMappingA (REX::W32::FILE_MAP_READ | REX::W32::FILE_MAP_WRITE, false , a_name.data ());
100+ const auto access = a_write ? REX::W32::FILE_MAP_READ | REX::W32::FILE_MAP_WRITE : REX::W32::FILE_MAP_READ;
101+ m_map = REX::W32::OpenFileMappingA (access, false , a_name.data ());
98102 if (!m_map) {
99- m_map = REX::W32::CreateFileMappingA (m_file, nullptr , REX::W32::PAGE_READWRITE, size.hi , size.lo , a_name.data ());
100- if (!m_map) {
103+ const auto protect = a_write ? REX::W32::PAGE_READWRITE : REX::W32::PAGE_READONLY;
104+ m_map = REX::W32::CreateFileMappingA (m_file, nullptr , protect, size.hi , size.lo , a_name.data ());
105+ if (!m_map)
101106 return false ;
102- }
103107
104108 m_owner = true ;
105109 }
106110
107- m_mapView = REX::W32::MapViewOfFile (m_map, REX::W32::FILE_MAP_READ | REX::W32::FILE_MAP_WRITE , 0 , 0 , size.value );
111+ m_mapView = REX::W32::MapViewOfFile (m_map, access , 0 , 0 , size.value );
108112 if (!m_mapView)
109113 return false ;
110114
0 commit comments