1baa3858d3f5d128a5c8466b700098109edcad5f2repo sync// Windows/FileMapping.h 2baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 3baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#ifndef __WINDOWS_FILEMAPPING_H 4baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#define __WINDOWS_FILEMAPPING_H 5baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 6baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#include "Common/Types.h" 7baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 8baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#include "Handle.h" 9baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 10baa3858d3f5d128a5c8466b700098109edcad5f2repo syncnamespace NWindows { 11baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 12baa3858d3f5d128a5c8466b700098109edcad5f2repo syncclass CFileMapping: public CHandle 13baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{ 14baa3858d3f5d128a5c8466b700098109edcad5f2repo syncpublic: 15baa3858d3f5d128a5c8466b700098109edcad5f2repo sync WRes Create(DWORD protect, UInt64 maxSize, LPCTSTR name) 16baa3858d3f5d128a5c8466b700098109edcad5f2repo sync { 17baa3858d3f5d128a5c8466b700098109edcad5f2repo sync _handle = ::CreateFileMapping(INVALID_HANDLE_VALUE, NULL, protect, (DWORD)(maxSize >> 32), (DWORD)maxSize, name); 18baa3858d3f5d128a5c8466b700098109edcad5f2repo sync return ::GetLastError(); 19baa3858d3f5d128a5c8466b700098109edcad5f2repo sync } 20baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 21baa3858d3f5d128a5c8466b700098109edcad5f2repo sync WRes Open(DWORD desiredAccess, LPCTSTR name) 22baa3858d3f5d128a5c8466b700098109edcad5f2repo sync { 23baa3858d3f5d128a5c8466b700098109edcad5f2repo sync #ifdef UNDER_CE 24baa3858d3f5d128a5c8466b700098109edcad5f2repo sync WRes res = Create(PAGE_READONLY, 0, name); 25baa3858d3f5d128a5c8466b700098109edcad5f2repo sync if (res == ERROR_ALREADY_EXISTS) 26baa3858d3f5d128a5c8466b700098109edcad5f2repo sync return 0; 27baa3858d3f5d128a5c8466b700098109edcad5f2repo sync Close(); 28baa3858d3f5d128a5c8466b700098109edcad5f2repo sync if (res == 0) 29baa3858d3f5d128a5c8466b700098109edcad5f2repo sync res = ERROR_FILE_NOT_FOUND; 30baa3858d3f5d128a5c8466b700098109edcad5f2repo sync return res; 31baa3858d3f5d128a5c8466b700098109edcad5f2repo sync #else 32baa3858d3f5d128a5c8466b700098109edcad5f2repo sync _handle = ::OpenFileMapping(desiredAccess, FALSE, name); 33baa3858d3f5d128a5c8466b700098109edcad5f2repo sync if (_handle != 0) 34baa3858d3f5d128a5c8466b700098109edcad5f2repo sync return 0; 35baa3858d3f5d128a5c8466b700098109edcad5f2repo sync return ::GetLastError(); 36baa3858d3f5d128a5c8466b700098109edcad5f2repo sync #endif 37baa3858d3f5d128a5c8466b700098109edcad5f2repo sync } 38baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 39baa3858d3f5d128a5c8466b700098109edcad5f2repo sync LPVOID Map(DWORD desiredAccess, UInt64 fileOffset, SIZE_T numberOfBytesToMap) 40baa3858d3f5d128a5c8466b700098109edcad5f2repo sync { 41baa3858d3f5d128a5c8466b700098109edcad5f2repo sync return ::MapViewOfFile(_handle, desiredAccess, (DWORD)(fileOffset >> 32), (DWORD)fileOffset, numberOfBytesToMap); 42baa3858d3f5d128a5c8466b700098109edcad5f2repo sync } 43baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 44baa3858d3f5d128a5c8466b700098109edcad5f2repo sync #ifndef UNDER_CE 45baa3858d3f5d128a5c8466b700098109edcad5f2repo sync LPVOID Map(DWORD desiredAccess, UInt64 fileOffset, SIZE_T numberOfBytesToMap, LPVOID baseAddress) 46baa3858d3f5d128a5c8466b700098109edcad5f2repo sync { 47baa3858d3f5d128a5c8466b700098109edcad5f2repo sync return ::MapViewOfFileEx(_handle, desiredAccess, (DWORD)(fileOffset >> 32), (DWORD)fileOffset, numberOfBytesToMap, baseAddress); 48baa3858d3f5d128a5c8466b700098109edcad5f2repo sync } 49baa3858d3f5d128a5c8466b700098109edcad5f2repo sync #endif 50baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}; 51baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 52baa3858d3f5d128a5c8466b700098109edcad5f2repo syncclass CFileUnmapper 53baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{ 54baa3858d3f5d128a5c8466b700098109edcad5f2repo sync const void *_data; 55baa3858d3f5d128a5c8466b700098109edcad5f2repo syncpublic: 56baa3858d3f5d128a5c8466b700098109edcad5f2repo sync CFileUnmapper(const void *data) : _data(data) {} 57baa3858d3f5d128a5c8466b700098109edcad5f2repo sync ~CFileUnmapper() { ::UnmapViewOfFile(_data); } 58baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}; 59baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 60baa3858d3f5d128a5c8466b700098109edcad5f2repo sync} 61baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 62baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#endif 63