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

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

max open files fix + EB's mmap fix

File size: 7.2 KB
Line 
1/* $Id: hmmmap.cpp,v 1.8 1999-12-01 10:47:51 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{
57 Win32MemMap *map;
58
59 if((hFile == -1 && size_low == 0) || size_high ||
60 protect & ~(PAGE_READONLY|PAGE_READWRITE|PAGE_WRITECOPY|SEC_COMMIT|SEC_IMAGE|SEC_RESERVE|SEC_NOCACHE) ||
61 (protect & (PAGE_READONLY|PAGE_READWRITE|PAGE_WRITECOPY)) == 0 ||
62// (hFile == -1 && (protect & SEC_COMMIT)) ||
63 ((protect & SEC_COMMIT) && (protect & SEC_RESERVE)))
64 {
65
66 dprintf(("CreateFileMappingA: invalid parameter (combination)!"));
67 dprintf(("Parameters: %x %x %x %x %s", hFile, protect, size_high, size_low, name));
68 return ERROR_INVALID_PARAMETER;
69 }
70
71 map = Win32MemMap::findMap((LPSTR)name);
72 if(map != NULL) {
73 dprintf(("CreateFileMappingA: duplicating map %s!", name));
74
75 DWORD protflags = map->getProtFlags();
76 switch(protect) {
77 case FILE_MAP_WRITE:
78 if(!(protflags & PAGE_WRITECOPY))
79 dprintf(("Different flags for duplicate!"));
80 break;
81 case FILE_MAP_READ:
82 if(!(protflags & (PAGE_READWRITE | PAGE_READONLY)))
83 dprintf(("Different flags for duplicate!"));
84 break;
85 case FILE_MAP_COPY:
86 if(!(protflags & PAGE_WRITECOPY))
87 dprintf(("Different flags for duplicate!"));
88 break;
89 }
90 //TODO:
91 //Is it allowed to open an existing view with different flags?
92 //(i.e. write access to readonly object)
93 }
94 else {
95 map = new Win32MemMap(hFile, size_low, protect, (LPSTR)name);
96
97 if(map == NULL) {
98 dprintf(("CreateFileMappingA: can't create Win32MemMap object!"));
99 return ERROR_OUTOFMEMORY;
100 }
101
102 if(map->Init(pHMHandleData->hHMHandle) == FALSE) {
103 delete map;
104 return ERROR_GEN_FAILURE;
105 }
106 }
107 map->AddRef();
108 pHMHandleData->dwUserData = (ULONG)map;
109 pHMHandleData->dwInternalType = HMTYPE_MEMMAP;
110 return NO_ERROR;
111}
112//******************************************************************************
113//******************************************************************************
114DWORD HMDeviceMemMapClass::OpenFileMapping(PHMHANDLEDATA pHMHandleData,
115 DWORD access, /* [in] Access mode */
116 BOOL inherit, /* [in] Inherit flag */
117 LPCSTR name ) /* [in] Name of file-mapping object */
118{
119 Win32MemMap *map;
120 DWORD protflags;
121
122 if(name == NULL)
123 return ERROR_INVALID_PARAMETER;
124
125 map = Win32MemMap::findMap((LPSTR)name);
126 if(map == NULL) {
127 dprintf(("OpenFileMapping: mapping %s not found", name));
128 return ERROR_FILE_NOT_FOUND;
129 }
130 protflags = map->getProtFlags();
131 switch(access) {
132 case FILE_MAP_WRITE:
133 case FILE_MAP_ALL_ACCESS:
134 if(!(protflags & PAGE_WRITECOPY))
135 return ERROR_INVALID_PARAMETER;
136 break;
137 case FILE_MAP_READ:
138 if(!(protflags & (PAGE_READWRITE | PAGE_READONLY)))
139 return ERROR_INVALID_PARAMETER;
140 break;
141 case FILE_MAP_COPY:
142 if(!(protflags & PAGE_WRITECOPY))
143 return ERROR_INVALID_PARAMETER;
144 break;
145 }
146 map->AddRef();
147 pHMHandleData->dwUserData = (ULONG)map;
148 pHMHandleData->dwInternalType = HMTYPE_MEMMAP;
149 return NO_ERROR;
150}
151//******************************************************************************
152//******************************************************************************
153LPVOID HMDeviceMemMapClass::MapViewOfFileEx(PHMHANDLEDATA pHMHandleData,
154 DWORD dwDesiredAccess,
155 DWORD dwFileOffsetHigh,
156 DWORD dwFileOffsetLow,
157 DWORD dwNumberOfBytesToMap,
158 LPVOID lpBaseAddress)
159{
160 Win32MemMap *map;
161
162 dprintf(("KERNEL32: HMDeviceMemMapClass::MapViewOfFile(%08xh,%08xh,%08xh,%08xh,%08xh,%08xh)\n",
163 pHMHandleData->hHMHandle,
164 dwDesiredAccess,
165 dwFileOffsetHigh,
166 dwFileOffsetLow,
167 dwNumberOfBytesToMap, lpBaseAddress));
168
169 if(lpBaseAddress != NULL) {//No can do. Let us choose the address
170 dprintf(("Can't create view to virtual address %x", lpBaseAddress));
171 SetLastError(ERROR_OUTOFMEMORY);
172 return NULL;
173 }
174
175 if(pHMHandleData->dwUserData == NULL || pHMHandleData->dwInternalType != HMTYPE_MEMMAP) {
176 dprintf(("MapViewOfFileEx: invalid handle data!"));
177 SetLastError(ERROR_INVALID_HANDLE);
178 return NULL;
179 }
180 map = (Win32MemMap *)pHMHandleData->dwUserData;
181
182 return map->mapViewOfFile(dwNumberOfBytesToMap, dwFileOffsetLow, dwDesiredAccess);
183}
184//******************************************************************************
185//******************************************************************************
186DWORD HMDeviceMemMapClass::CloseHandle(PHMHANDLEDATA pHMHandleData)
187{
188 Win32MemMap *map;
189
190 if(pHMHandleData->dwUserData == NULL || pHMHandleData->dwInternalType != HMTYPE_MEMMAP) {
191 dprintf(("MapViewOfFileEx: invalid handle data!"));
192 return ERROR_INVALID_HANDLE;
193 }
194 map = (Win32MemMap *)pHMHandleData->dwUserData;
195 map->Release();
196
197 return NO_ERROR;
198}
199//******************************************************************************
200//******************************************************************************
Note: See TracBrowser for help on using the repository browser.