// Windows/FileMapping.h | |
#ifndef __WINDOWS_FILEMAPPING_H | |
#define __WINDOWS_FILEMAPPING_H | |
#include "../Common/MyTypes.h" | |
#include "Handle.h" | |
namespace NWindows { | |
class CFileMapping: public CHandle | |
{ | |
public: | |
WRes Create(DWORD protect, UInt64 maxSize, LPCTSTR name) | |
{ | |
_handle = ::CreateFileMapping(INVALID_HANDLE_VALUE, NULL, protect, (DWORD)(maxSize >> 32), (DWORD)maxSize, name); | |
return ::GetLastError(); | |
} | |
WRes Open(DWORD | |
#ifndef UNDER_CE | |
desiredAccess | |
#endif | |
, LPCTSTR name) | |
{ | |
#ifdef UNDER_CE | |
WRes res = Create(PAGE_READONLY, 0, name); | |
if (res == ERROR_ALREADY_EXISTS) | |
return 0; | |
Close(); | |
if (res == 0) | |
res = ERROR_FILE_NOT_FOUND; | |
return res; | |
#else | |
_handle = ::OpenFileMapping(desiredAccess, FALSE, name); | |
if (_handle != 0) | |
return 0; | |
return ::GetLastError(); | |
#endif | |
} | |
LPVOID Map(DWORD desiredAccess, UInt64 fileOffset, SIZE_T numberOfBytesToMap) | |
{ | |
return ::MapViewOfFile(_handle, desiredAccess, (DWORD)(fileOffset >> 32), (DWORD)fileOffset, numberOfBytesToMap); | |
} | |
#ifndef UNDER_CE | |
LPVOID Map(DWORD desiredAccess, UInt64 fileOffset, SIZE_T numberOfBytesToMap, LPVOID baseAddress) | |
{ | |
return ::MapViewOfFileEx(_handle, desiredAccess, (DWORD)(fileOffset >> 32), (DWORD)fileOffset, numberOfBytesToMap, baseAddress); | |
} | |
#endif | |
}; | |
class CFileUnmapper | |
{ | |
const void *_data; | |
public: | |
CFileUnmapper(const void *data) : _data(data) {} | |
~CFileUnmapper() { ::UnmapViewOfFile(_data); } | |
}; | |
} | |
#endif |