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

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

Put back handlemanager changes + memory mapped file changes

File size: 6.4 KB
Line 
1/* $Id: hmmmap.cpp,v 1.4 1999-08-25 10:28:40 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 SetLastError(ERROR_INVALID_PARAMETER);
67 return 0;
68 }
69
70 map = new Win32MemMap(hFile, size_low, protect, (LPSTR)name);
71 if(map == NULL) {
72 dprintf(("CreateFileMappingA: can't create Win32MemMap object!"));
73 return ERROR_OUTOFMEMORY;
74 }
75
76 if(map->Init(pHMHandleData->hHMHandle) == FALSE) {
77 delete map;
78 return ERROR_GEN_FAILURE;
79 }
80 map->AddRef();
81 pHMHandleData->dwUserData = (ULONG)this;
82 pHMHandleData->dwInternalType = HMTYPE_MEMMAP;
83 return NO_ERROR;
84}
85//******************************************************************************
86//******************************************************************************
87DWORD HMDeviceMemMapClass::OpenFileMapping(PHMHANDLEDATA pHMHandleData,
88 DWORD access, /* [in] Access mode */
89 BOOL inherit, /* [in] Inherit flag */
90 LPCSTR name ) /* [in] Name of file-mapping object */
91{
92 Win32MemMap *map;
93 DWORD protflags;
94
95 if(name == NULL)
96 return ERROR_INVALID_PARAMETER;
97
98 map = Win32MemMap::findMap((LPSTR)name);
99 if(map == NULL) {
100 dprintf(("OpenFileMapping: mapping %s not found", name));
101 return ERROR_FILE_NOT_FOUND;
102 }
103 protflags = map->getProtFlags();
104 switch(access) {
105 case FILE_MAP_WRITE:
106 case FILE_MAP_ALL_ACCESS:
107 if(!(protflags & PAGE_WRITECOPY))
108 return ERROR_INVALID_PARAMETER;
109 break;
110 case FILE_MAP_READ:
111 if(!(protflags & (PAGE_READWRITE | PAGE_READONLY)))
112 return ERROR_INVALID_PARAMETER;
113 break;
114 case FILE_MAP_COPY:
115 if(!(protflags & PAGE_WRITECOPY))
116 return ERROR_INVALID_PARAMETER;
117 break;
118 }
119 map->AddRef();
120 pHMHandleData->dwUserData = (ULONG)this;
121 pHMHandleData->dwInternalType = HMTYPE_MEMMAP;
122 return NO_ERROR;
123}
124//******************************************************************************
125//******************************************************************************
126LPVOID HMDeviceMemMapClass::MapViewOfFileEx(PHMHANDLEDATA pHMHandleData,
127 DWORD dwDesiredAccess,
128 DWORD dwFileOffsetHigh,
129 DWORD dwFileOffsetLow,
130 DWORD dwNumberOfBytesToMap,
131 LPVOID lpBaseAddress)
132{
133 Win32MemMap *map;
134
135 dprintf(("KERNEL32: HMDeviceMemMapClass::MapViewOfFile(%08xh,%08xh,%08xh,%08xh,%08xh,%08xh)\n",
136 pHMHandleData->hHMHandle,
137 dwDesiredAccess,
138 dwFileOffsetHigh,
139 dwFileOffsetLow,
140 dwNumberOfBytesToMap, lpBaseAddress));
141
142 if(lpBaseAddress != NULL) {//No can do. Let us choose the address
143 dprintf(("Can't create view to virtual address %x", lpBaseAddress));
144 SetLastError(ERROR_OUTOFMEMORY);
145 return NULL;
146 }
147
148 if(pHMHandleData->dwUserData == NULL || pHMHandleData->dwInternalType != HMTYPE_MEMMAP) {
149 dprintf(("MapViewOfFileEx: invalid handle data!"));
150 SetLastError(ERROR_INVALID_HANDLE);
151 return NULL;
152 }
153 map = (Win32MemMap *)pHMHandleData->dwUserData;
154
155 return map->mapViewOfFile(dwNumberOfBytesToMap, dwFileOffsetLow, dwDesiredAccess);
156}
157//******************************************************************************
158//******************************************************************************
159DWORD HMDeviceMemMapClass::CloseHandle(PHMHANDLEDATA pHMHandleData)
160{
161 Win32MemMap *map;
162
163 if(pHMHandleData->dwUserData == NULL || pHMHandleData->dwInternalType != HMTYPE_MEMMAP) {
164 dprintf(("MapViewOfFileEx: invalid handle data!"));
165 return ERROR_INVALID_HANDLE;
166 }
167 map = (Win32MemMap *)pHMHandleData->dwUserData;
168 map->Release();
169
170 return NO_ERROR;
171}
172//******************************************************************************
173//******************************************************************************
Note: See TracBrowser for help on using the repository browser.