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