// Copyright (c) 2020 Egor Tensin // This file is part of the "winapi-common" project. // For details, see https://github.com/egor-tensin/winapi-common. // Distributed under the MIT License. #include #include #include #include #include #include #include #include #include #include namespace winapi { namespace { void* do_map(const Handle& mapping, std::size_t nb = 0) { const auto addr = ::MapViewOfFile(static_cast(mapping), FILE_MAP_ALL_ACCESS, 0, 0, nb); if (addr == NULL) { throw error::windows(GetLastError(), "MapViewOfFile"); } return addr; } } // namespace void SharedMemory::Unmap::operator()(void* ptr) const { const auto ret = ::UnmapViewOfFile(ptr); assert(ret); WINAPI_UNUSED_PARAMETER(ret); }; SharedMemory SharedMemory::create(const std::string& name, std::size_t nb) { const auto nb64 = static_cast(nb); static_assert(sizeof(nb64) == 2 * sizeof(DWORD), "sizeof(DWORD) != 32"); const auto nb_low = static_cast(nb64); const auto nb_high = static_cast(nb64 >> 32); const auto mapping_impl = ::CreateFileMappingW( INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, nb_high, nb_low, widen(name).c_str()); if (mapping_impl == NULL) { throw error::windows(GetLastError(), "CreateFileMappingW"); } Handle mapping{mapping_impl}; const auto addr = do_map(mapping); return {std::move(mapping), addr}; } SharedMemory SharedMemory::open(const std::string& name) { const auto mapping_impl = ::OpenFileMappingW(FILE_MAP_ALL_ACCESS, FALSE, widen(name).c_str()); if (mapping_impl == NULL) { throw error::windows(GetLastError(), "OpenFileMappingW"); } Handle mapping{mapping_impl}; const auto addr = do_map(mapping); return {std::move(mapping), addr}; } } // namespace winapi