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

Last change on this file since 3948 was 3948, checked in by sandervl, 25 years ago

mmap + share hack

File size: 8.2 KB
Line 
1/* $Id: hmmmap.cpp,v 1.14 2000-08-04 21:12:07 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#define DBG_LOCALLOG DBG_hmmmap
36#include "dbglocal.h"
37
38/*****************************************************************************
39 * Defines *
40 *****************************************************************************/
41
42/*****************************************************************************
43 * Structures *
44 *****************************************************************************/
45
46/*****************************************************************************
47 * Local Prototypes *
48 *****************************************************************************/
49
50//******************************************************************************
51//******************************************************************************
52DWORD HMDeviceMemMapClass::CreateFileMapping(PHMHANDLEDATA pHMHandleData,
53 HFILE hFile,
54 SECURITY_ATTRIBUTES *sa, /* [in] Optional security attributes*/
55 DWORD protect, /* [in] Protection for mapping object */
56 DWORD size_high, /* [in] High-order 32 bits of object size */
57 DWORD size_low, /* [in] Low-order 32 bits of object size */
58 LPCSTR name, /* [in] Name of file-mapping object */
59 HFILE *hOldMap) // if create an existing memmap, return handle of old one
60{
61 Win32MemMap *map;
62
63 if((hFile == -1 && size_low == 0) || size_high ||
64 protect & ~(PAGE_READONLY|PAGE_READWRITE|PAGE_WRITECOPY|SEC_COMMIT|SEC_IMAGE|SEC_RESERVE|SEC_NOCACHE) ||
65 (protect & (PAGE_READONLY|PAGE_READWRITE|PAGE_WRITECOPY)) == 0 ||
66// (hFile == -1 && (protect & SEC_COMMIT)) ||
67 ((protect & SEC_COMMIT) && (protect & SEC_RESERVE)))
68 {
69
70 dprintf(("CreateFileMappingA: invalid parameter (combination)!"));
71 dprintf(("Parameters: %x %x %x %x %s", hFile, protect, size_high, size_low, name));
72 return ERROR_INVALID_PARAMETER;
73 }
74
75 map = Win32MemMap::findMap((LPSTR)name);
76 if(map != NULL) {
77 dprintf(("CreateFileMappingA: duplicating map %s!", name));
78
79 DWORD protflags = map->getProtFlags();
80 switch(protect) {
81 case FILE_MAP_WRITE:
82 if(!(protflags & PAGE_WRITECOPY))
83 dprintf(("Different flags for duplicate!"));
84 break;
85 case FILE_MAP_READ:
86 if(!(protflags & (PAGE_READWRITE | PAGE_READONLY)))
87 dprintf(("Different flags for duplicate!"));
88 break;
89 case FILE_MAP_COPY:
90 if(!(protflags & PAGE_WRITECOPY))
91 dprintf(("Different flags for duplicate!"));
92 break;
93 }
94 //TODO:
95 //Is it allowed to open an existing view with different flags?
96 //(i.e. write access to readonly object)
97 //Return handle of existing file mapping
98 dprintf(("CreateFileMapping: Return handle of existing file mapping %s", name));
99 map->AddRef();
100 *hOldMap = map->getMapHandle();
101 return ERROR_ALREADY_EXISTS;
102 }
103 else {
104 map = new Win32MemMap(hFile, size_low, protect, (LPSTR)name);
105
106 if(map == NULL) {
107 dprintf(("CreateFileMappingA: can't create Win32MemMap object!"));
108 return ERROR_OUTOFMEMORY;
109 }
110
111 if(map->Init(pHMHandleData->hHMHandle) == FALSE) {
112 dprintf(("CreateFileMappingA: init failed!"));
113 delete map;
114 return ERROR_GEN_FAILURE;
115 }
116 }
117 map->AddRef();
118 pHMHandleData->dwUserData = (ULONG)map;
119 pHMHandleData->dwInternalType = HMTYPE_MEMMAP;
120 return NO_ERROR;
121}
122//******************************************************************************
123//******************************************************************************
124DWORD HMDeviceMemMapClass::OpenFileMapping(PHMHANDLEDATA pHMHandleData,
125 DWORD access, /* [in] Access mode */
126 BOOL inherit, /* [in] Inherit flag */
127 LPCSTR name ) /* [in] Name of file-mapping object */
128{
129 Win32MemMap *map;
130 DWORD protflags;
131
132 if(name == NULL)
133 return ERROR_INVALID_PARAMETER;
134
135 map = Win32MemMap::findMap((LPSTR)name);
136 if(map == NULL) {
137 dprintf(("OpenFileMapping: mapping %s not found", name));
138 return ERROR_FILE_NOT_FOUND;
139 }
140 protflags = map->getProtFlags();
141 switch(access) {
142 case FILE_MAP_WRITE:
143 case FILE_MAP_ALL_ACCESS:
144 if(!(protflags & PAGE_WRITECOPY))
145 return ERROR_INVALID_PARAMETER;
146 break;
147 case FILE_MAP_READ:
148 if(!(protflags & (PAGE_READWRITE | PAGE_READONLY)))
149 return ERROR_INVALID_PARAMETER;
150 break;
151 case FILE_MAP_COPY:
152 if(!(protflags & PAGE_WRITECOPY))
153 return ERROR_INVALID_PARAMETER;
154 break;
155 }
156 map->AddRef();
157 pHMHandleData->dwUserData = (ULONG)map;
158 pHMHandleData->dwInternalType = HMTYPE_MEMMAP;
159 return NO_ERROR;
160}
161//******************************************************************************
162//******************************************************************************
163LPVOID HMDeviceMemMapClass::MapViewOfFileEx(PHMHANDLEDATA pHMHandleData,
164 DWORD dwDesiredAccess,
165 DWORD dwFileOffsetHigh,
166 DWORD dwFileOffsetLow,
167 DWORD dwNumberOfBytesToMap,
168 LPVOID lpBaseAddress)
169{
170 Win32MemMap *map;
171
172 dprintf(("KERNEL32: HMDeviceMemMapClass::MapViewOfFileEx(%08xh,%08xh,%08xh,%08xh,%08xh,%08xh)\n",
173 pHMHandleData->hHMHandle,
174 dwDesiredAccess,
175 dwFileOffsetHigh,
176 dwFileOffsetLow,
177 dwNumberOfBytesToMap,
178 lpBaseAddress));
179
180 if(lpBaseAddress != NULL)
181 {
182#if 0
183 //No can do. Let us choose the address
184 dprintf(("Can't create view to virtual address %x", lpBaseAddress));
185 SetLastError(ERROR_OUTOFMEMORY);
186 return NULL;
187#else
188 // PH 2000/05/24 IBM VAJ3 uses this function.
189 // I don't think we'll ever succeed in EXACTLY copying the original
190 // behaviour of the function. Maybe ignoring the base address helps?
191 dprintf(("WARNING: suggested virtual address %x IGNORED! (experimental API violation)",
192 lpBaseAddress));
193#endif
194 }
195
196 if(pHMHandleData->dwUserData == NULL || pHMHandleData->dwInternalType != HMTYPE_MEMMAP) {
197 dprintf(("MapViewOfFileEx: invalid handle data!"));
198 SetLastError(ERROR_INVALID_HANDLE);
199 return NULL;
200 }
201 map = (Win32MemMap *)pHMHandleData->dwUserData;
202
203 return map->mapViewOfFile(dwNumberOfBytesToMap, dwFileOffsetLow, dwDesiredAccess);
204}
205//******************************************************************************
206//******************************************************************************
207DWORD HMDeviceMemMapClass::CloseHandle(PHMHANDLEDATA pHMHandleData)
208{
209 Win32MemMap *map;
210
211 dprintf(("HMDeviceMemMapClass::CloseHandle %x", pHMHandleData->dwUserData));
212 if(pHMHandleData->dwUserData == NULL || pHMHandleData->dwInternalType != HMTYPE_MEMMAP) {
213 dprintf(("MapViewOfFileEx: invalid handle data!"));
214 return ERROR_INVALID_HANDLE;
215 }
216 //Although an application may close the file handle used to create a file
217 //mapping object, the system holds the corresponding file open until the last
218 //view of the file is unmapped.
219 map = (Win32MemMap *)pHMHandleData->dwUserData;
220 map->close();
221
222 return NO_ERROR;
223}
224//******************************************************************************
225//******************************************************************************
Note: See TracBrowser for help on using the repository browser.