source: trunk/src/kernel32/hmmmap.cpp@ 2105

Last change on this file since 2105 was 2053, checked in by sandervl, 26 years ago

Memory map fixes

File size: 7.5 KB
Line 
1/* $Id: hmmmap.cpp,v 1.9 1999-12-10 14:06:11 sandervl Exp $ */
2
3/*
4 * Project Odin Software License can be found in LICENSE.TXT
5 * Win32 Unified Handle Manager for OS/2
6 * Copyright 1999 Patrick Haller (haller@zebra.fh-weingarten.de)
7 */
8
9#undef DEBUG_LOCAL
10//#define DEBUG_LOCAL
11
12
13/*****************************************************************************
14 * Remark *
15 *****************************************************************************
16
17 */
18
19
20/*****************************************************************************
21 * Includes *
22 *****************************************************************************/
23
24#include <os2win.h>
25#include <stdlib.h>
26#include <string.h>
27#include "unicode.h"
28#include "misc.h"
29
30#include "HandleManager.H"
31#include "HMMMap.h"
32#include "mmap.h"
33#include "heapshared.h"
34
35/*****************************************************************************
36 * Defines *
37 *****************************************************************************/
38
39/*****************************************************************************
40 * Structures *
41 *****************************************************************************/
42
43/*****************************************************************************
44 * Local Prototypes *
45 *****************************************************************************/
46
47//******************************************************************************
48//******************************************************************************
49DWORD HMDeviceMemMapClass::CreateFileMapping(PHMHANDLEDATA pHMHandleData,
50 HFILE hFile,
51 SECURITY_ATTRIBUTES *sa, /* [in] Optional security attributes*/
52 DWORD protect, /* [in] Protection for mapping object */
53 DWORD size_high, /* [in] High-order 32 bits of object size */
54 DWORD size_low, /* [in] Low-order 32 bits of object size */
55 LPCSTR name, /* [in] Name of file-mapping object */
56 HFILE *hOldMap) // if create an existing memmap, return handle of old one
57{
58 Win32MemMap *map;
59
60 if((hFile == -1 && size_low == 0) || size_high ||
61 protect & ~(PAGE_READONLY|PAGE_READWRITE|PAGE_WRITECOPY|SEC_COMMIT|SEC_IMAGE|SEC_RESERVE|SEC_NOCACHE) ||
62 (protect & (PAGE_READONLY|PAGE_READWRITE|PAGE_WRITECOPY)) == 0 ||
63// (hFile == -1 && (protect & SEC_COMMIT)) ||
64 ((protect & SEC_COMMIT) && (protect & SEC_RESERVE)))
65 {
66
67 dprintf(("CreateFileMappingA: invalid parameter (combination)!"));
68 dprintf(("Parameters: %x %x %x %x %s", hFile, protect, size_high, size_low, name));
69 return ERROR_INVALID_PARAMETER;
70 }
71
72 map = Win32MemMap::findMap((LPSTR)name);
73 if(map != NULL) {
74 dprintf(("CreateFileMappingA: duplicating map %s!", name));
75
76 DWORD protflags = map->getProtFlags();
77 switch(protect) {
78 case FILE_MAP_WRITE:
79 if(!(protflags & PAGE_WRITECOPY))
80 dprintf(("Different flags for duplicate!"));
81 break;
82 case FILE_MAP_READ:
83 if(!(protflags & (PAGE_READWRITE | PAGE_READONLY)))
84 dprintf(("Different flags for duplicate!"));
85 break;
86 case FILE_MAP_COPY:
87 if(!(protflags & PAGE_WRITECOPY))
88 dprintf(("Different flags for duplicate!"));
89 break;
90 }
91 //TODO:
92 //Is it allowed to open an existing view with different flags?
93 //(i.e. write access to readonly object)
94 //Return handle of existing file mapping
95 dprintf(("CreateFileMapping: Return handle of existing file mapping %s", name));
96 map->AddRef();
97 *hOldMap = map->getMapHandle();
98 return ERROR_ALREADY_EXISTS;
99 }
100 else {
101 map = new Win32MemMap(hFile, size_low, protect, (LPSTR)name);
102
103 if(map == NULL) {
104 dprintf(("CreateFileMappingA: can't create Win32MemMap object!"));
105 return ERROR_OUTOFMEMORY;
106 }
107
108 if(map->Init(pHMHandleData->hHMHandle) == FALSE) {
109 delete map;
110 return ERROR_GEN_FAILURE;
111 }
112 }
113 map->AddRef();
114 pHMHandleData->dwUserData = (ULONG)map;
115 pHMHandleData->dwInternalType = HMTYPE_MEMMAP;
116 return NO_ERROR;
117}
118//******************************************************************************
119//******************************************************************************
120DWORD HMDeviceMemMapClass::OpenFileMapping(PHMHANDLEDATA pHMHandleData,
121 DWORD access, /* [in] Access mode */
122 BOOL inherit, /* [in] Inherit flag */
123 LPCSTR name ) /* [in] Name of file-mapping object */
124{
125 Win32MemMap *map;
126 DWORD protflags;
127
128 if(name == NULL)
129 return ERROR_INVALID_PARAMETER;
130
131 map = Win32MemMap::findMap((LPSTR)name);
132 if(map == NULL) {
133 dprintf(("OpenFileMapping: mapping %s not found", name));
134 return ERROR_FILE_NOT_FOUND;
135 }
136 protflags = map->getProtFlags();
137 switch(access) {
138 case FILE_MAP_WRITE:
139 case FILE_MAP_ALL_ACCESS:
140 if(!(protflags & PAGE_WRITECOPY))
141 return ERROR_INVALID_PARAMETER;
142 break;
143 case FILE_MAP_READ:
144 if(!(protflags & (PAGE_READWRITE | PAGE_READONLY)))
145 return ERROR_INVALID_PARAMETER;
146 break;
147 case FILE_MAP_COPY:
148 if(!(protflags & PAGE_WRITECOPY))
149 return ERROR_INVALID_PARAMETER;
150 break;
151 }
152 map->AddRef();
153 pHMHandleData->dwUserData = (ULONG)map;
154 pHMHandleData->dwInternalType = HMTYPE_MEMMAP;
155 return NO_ERROR;
156}
157//******************************************************************************
158//******************************************************************************
159LPVOID HMDeviceMemMapClass::MapViewOfFileEx(PHMHANDLEDATA pHMHandleData,
160 DWORD dwDesiredAccess,
161 DWORD dwFileOffsetHigh,
162 DWORD dwFileOffsetLow,
163 DWORD dwNumberOfBytesToMap,
164 LPVOID lpBaseAddress)
165{
166 Win32MemMap *map;
167
168 dprintf(("KERNEL32: HMDeviceMemMapClass::MapViewOfFile(%08xh,%08xh,%08xh,%08xh,%08xh,%08xh)\n",
169 pHMHandleData->hHMHandle,
170 dwDesiredAccess,
171 dwFileOffsetHigh,
172 dwFileOffsetLow,
173 dwNumberOfBytesToMap, lpBaseAddress));
174
175 if(lpBaseAddress != NULL) {//No can do. Let us choose the address
176 dprintf(("Can't create view to virtual address %x", lpBaseAddress));
177 SetLastError(ERROR_OUTOFMEMORY);
178 return NULL;
179 }
180
181 if(pHMHandleData->dwUserData == NULL || pHMHandleData->dwInternalType != HMTYPE_MEMMAP) {
182 dprintf(("MapViewOfFileEx: invalid handle data!"));
183 SetLastError(ERROR_INVALID_HANDLE);
184 return NULL;
185 }
186 map = (Win32MemMap *)pHMHandleData->dwUserData;
187
188 return map->mapViewOfFile(dwNumberOfBytesToMap, dwFileOffsetLow, dwDesiredAccess);
189}
190//******************************************************************************
191//******************************************************************************
192DWORD HMDeviceMemMapClass::CloseHandle(PHMHANDLEDATA pHMHandleData)
193{
194 Win32MemMap *map;
195
196 if(pHMHandleData->dwUserData == NULL || pHMHandleData->dwInternalType != HMTYPE_MEMMAP) {
197 dprintf(("MapViewOfFileEx: invalid handle data!"));
198 return ERROR_INVALID_HANDLE;
199 }
200 map = (Win32MemMap *)pHMHandleData->dwUserData;
201 map->Release();
202
203 return NO_ERROR;
204}
205//******************************************************************************
206//******************************************************************************
Note: See TracBrowser for help on using the repository browser.