source: trunk/src/kernel32/old/hmmmap.cpp@ 1036

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

Backup copy of old kernel32

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