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