diff options
| author | Stefan Boberg <[email protected]> | 2023-05-15 18:07:45 +0200 |
|---|---|---|
| committer | Stefan Boberg <[email protected]> | 2023-05-15 18:07:45 +0200 |
| commit | 06aaf561fed3db1eed2a044180895957de87ed20 (patch) | |
| tree | c80ef0d23b77ea251904c9f05a0626ef6fdc3a78 /src/zencore/windows.cpp | |
| parent | implemented string conversion for CbValidateError enum (diff) | |
| parent | Remove ATL header usage (#306) (diff) | |
| download | zen-06aaf561fed3db1eed2a044180895957de87ed20.tar.xz zen-06aaf561fed3db1eed2a044180895957de87ed20.zip | |
Merge branch 'main' of https://github.com/EpicGames/zen
Diffstat (limited to 'src/zencore/windows.cpp')
| -rw-r--r-- | src/zencore/windows.cpp | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/src/zencore/windows.cpp b/src/zencore/windows.cpp new file mode 100644 index 000000000..76d8ab445 --- /dev/null +++ b/src/zencore/windows.cpp @@ -0,0 +1,64 @@ + +// Copyright Epic Games, Inc. All Rights Reserved. + +#include "zencore/zencore.h" + +#if ZEN_PLATFORM_WINDOWS +# include <zencore/except.h> +# include "zencore/windows.h" + +namespace zen::windows { + +FileMapping::FileMapping(_In_ FileMapping& orig) +{ + m_pData = NULL; + m_hMapping = NULL; + + HRESULT hr = CopyFrom(orig); + if (FAILED(hr)) + zen::ThrowSystemException(hr, "Failed to clone FileMapping"); +} + +FileMapping& +FileMapping::operator=(_In_ FileMapping& orig) +{ + HRESULT hr = CopyFrom(orig); + if (FAILED(hr)) + zen::ThrowSystemException(hr, "Failed to clone FileMapping"); + + return *this; +} + +HRESULT +FileMapping::CopyFrom(_In_ FileMapping& orig) throw() +{ + if (this == &orig) + return S_OK; + + ZEN_ASSERT(m_pData == NULL); + ZEN_ASSERT(m_hMapping == NULL); + ZEN_ASSERT(orig.m_pData != NULL); + + m_dwViewDesiredAccess = orig.m_dwViewDesiredAccess; + m_nOffset.QuadPart = orig.m_nOffset.QuadPart; + m_nMappingSize = orig.m_nMappingSize; + + if (!::DuplicateHandle(GetCurrentProcess(), orig.m_hMapping, GetCurrentProcess(), &m_hMapping, NULL, TRUE, DUPLICATE_SAME_ACCESS)) + return MapHresultFromLastError(); + + m_pData = ::MapViewOfFileEx(m_hMapping, m_dwViewDesiredAccess, m_nOffset.HighPart, m_nOffset.LowPart, m_nMappingSize, NULL); + if (m_pData == NULL) + { + HRESULT hr; + + hr = MapHresultFromLastError(); + ::CloseHandle(m_hMapping); + m_hMapping = NULL; + return hr; + } + + return S_OK; +} + +} // namespace zen::windows +#endif |