aboutsummaryrefslogtreecommitdiff
path: root/src/zencore/windows.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/zencore/windows.cpp')
-rw-r--r--src/zencore/windows.cpp64
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