source: trunk/src/kernel32/oslibmem.cpp@ 8866

Last change on this file since 8866 was 8866, checked in by sandervl, 23 years ago

Disabled 64kb alignment in VirtualAlloc for now

File size: 7.4 KB
Line 
1/* $Id: oslibmem.cpp,v 1.2 2002-07-13 16:30:40 sandervl Exp $ */
2/*
3 * Wrappers for OS/2 Dos* API
4 *
5 * Copyright 1998-2002 Sander van Leeuwen (sandervl@xs4all.nl)
6 * Copyright 2000 knut st. osmundsen (knut.stange.osmundsen@mynd.no)
7 *
8 * Project Odin Software License can be found in LICENSE.TXT
9 *
10 */
11
12
13
14/*******************************************************************************
15* Header Files *
16*******************************************************************************/
17#define INCL_BASE
18#define INCL_DOSEXCEPTIONS
19#define INCL_DOSMEMMGR
20#define INCL_DOSPROCESS
21#define INCL_DOSFILEMGR
22#define INCL_DOSERRORS
23#define INCL_DOSDEVIOCTL
24#define INCL_DOSDEVICES
25#define INCL_NPIPES
26#include <os2wrap.h> //Odin32 OS/2 api wrappers
27#include <stdlib.h>
28#include <stdio.h>
29#include <string.h>
30#include <ctype.h>
31#include <win32api.h>
32#include <winconst.h>
33#include <win\winioctl.h>
34#include <misc.h>
35#include "initterm.h"
36#include "oslibdos.h"
37#include "dosqss.h"
38#include "win32k.h"
39
40#define DBG_LOCALLOG DBG_oslibmem
41#include "dbglocal.h"
42
43//******************************************************************************
44//TODO: Assumes entire memory range has the same protection flags!
45//TODO: Check if this works for code aliases...
46//******************************************************************************
47DWORD OSLibDosAliasMem(LPVOID pb, ULONG cb, LPVOID *ppbAlias, ULONG fl)
48{
49 DWORD rc;
50 DWORD attr;
51 DWORD size = cb;
52
53 cb = (cb-1) & ~0xfff;
54 cb+= PAGE_SIZE;
55
56 rc = DosQueryMem(pb, &size, &attr);
57 if(rc) {
58 dprintf(("OSLibDosAliasMem: DosQueryMem %x %x return %d", pb, size, rc));
59 return rc;
60 }
61 size = (size-1) & ~0xfff;
62 size+= PAGE_SIZE;
63 if(size != cb) {
64 dprintf(("ERROR: OSLibDosAliasMem: size != cb (%x!=%x)!!!!!!!!", size, cb));
65 //ignore this and continue return 5;
66 attr = fl; //just use original protection flags (NOT CORRECT)
67 }
68 attr &= (PAG_READ|PAG_WRITE|PAG_EXECUTE|PAG_GUARD|PAG_DEFAULT);
69 if(attr != fl) {
70 rc = DosSetMem(pb, size, fl);
71 if(rc) {
72 dprintf(("OSLibDosAliasMem: DosSetMem %x %x return %d", pb, size, rc));
73 attr = fl;
74 //just continue for now
75 //return rc;
76 }
77 }
78 rc = DosAliasMem(pb, cb, ppbAlias, 2);
79 if(rc) {
80 dprintf(("OSLibDosAliasMem: DosAliasMem %x %x returned %d", pb, cb, rc));
81 return rc;
82 }
83 if(attr != fl) {
84 rc = DosSetMem(pb, size, attr);
85 if(rc) {
86 dprintf(("OSLibDosAliasMem: DosSetMem (2) %x %x return %d", pb, size, rc));
87 return rc;
88 }
89 }
90 return 0;
91}
92//******************************************************************************
93//******************************************************************************
94DWORD OSLibDosAllocMem(LPVOID *lplpMemAddr, DWORD cbSize, DWORD flFlags)
95{
96 PVOID pvMemAddr;
97 DWORD offset;
98 APIRET rc;
99
100 /*
101 * Let's try use the extended DosAllocMem API of Win32k.sys.
102 */
103 if (libWin32kInstalled())
104 {
105 rc = DosAllocMemEx(lplpMemAddr, cbSize, flFlags | flAllocMem | OBJ_ALIGN64K);
106 if (rc != ERROR_NOT_SUPPORTED) /* This call was stubbed until recently. */
107 return rc;
108 }
109
110 /*
111 * If no or old Win32k fall back to old method.
112 */
113
114 rc = DosAllocMem(&pvMemAddr, cbSize, flFlags | flAllocMem);
115 if(rc) {
116 dprintf(("DosAllocMem failed with rc %d", rc));
117 return rc;
118 }
119 //TODO!!!!!!!!!!!!
120#if 0
121 // already 64k aligned ?
122 if((DWORD) pvMemAddr & 0xFFFF)
123 {
124 DWORD addr64kb;
125
126 //Allocate 64kb more so we can round the address to a 64kb aligned value
127 rc = DosAllocMem((PPVOID)&addr64kb, cbSize + 64*1024, PAG_READ | flAllocMem);
128 if(rc) {
129 dprintf(("DosAllocMem failed with rc %d", rc));
130 return rc;
131 }
132 if(addr64kb & 0xFFFF) {
133 addr64kb = (addr64kb + 0xFFFF) & 0xFFFF;
134 }
135 pvMemAddr = (PVOID)addr64kb;
136
137 //and set the correct page flags for the request range
138 rc = DosSetMem(pvMemAddr, cbSize, flFlags | flAllocMem);
139 }
140#endif
141 if(!rc)
142 *lplpMemAddr = pvMemAddr;
143
144 return rc;
145}
146//******************************************************************************
147//******************************************************************************
148DWORD OSLibDosFreeMem(LPVOID lpMemAddr)
149{
150 return DosFreeMem(lpMemAddr);
151}
152//******************************************************************************
153//NOTE: If name == NULL, allocated gettable unnamed shared memory
154//OS/2 returns error 123 (invalid name) if the shared memory name includes
155//colons. We need to replace them with underscores.
156//******************************************************************************
157DWORD OSLibDosAllocSharedMem(LPVOID *lplpMemAddr, DWORD size, DWORD flags, LPSTR name)
158{
159 APIRET rc;
160 char *sharedmemname = NULL, *tmp;
161
162 if(name) {
163 sharedmemname = (char *)malloc(strlen(name) + 16);
164 strcpy(sharedmemname, "\\SHAREMEM\\");
165 strcat(sharedmemname, name);
166 }
167 else flags |= OBJ_GETTABLE;
168
169 //SvL: Colons are unacceptable in shared memory names (for whatever reason)
170 tmp = sharedmemname;
171 while(*tmp != 0) {
172 if(*tmp == ':') {
173 *tmp = '_';
174 }
175 tmp++;
176 }
177
178 rc = DosAllocSharedMem(lplpMemAddr, sharedmemname, size, flags);
179 if(name) {
180 free(sharedmemname);
181 }
182 return rc;
183}
184//******************************************************************************
185//NOTE: If name == NULL, assume gettable unnamed shared memory
186//******************************************************************************
187DWORD OSLibDosGetNamedSharedMem(LPVOID *lplpMemAddr, LPSTR name)
188{
189 APIRET rc;
190 char *sharedmemname = NULL, *tmp;
191
192 if(name) {
193 sharedmemname = (char *)malloc(strlen(name) + 16);
194 strcpy(sharedmemname, "\\SHAREMEM\\");
195 strcat(sharedmemname, name);
196
197 //SvL: Colons are unacceptable in shared memory names (for whatever reason)
198 tmp = sharedmemname;
199 while(*tmp != 0) {
200 if(*tmp == ':') {
201 *tmp = '_';
202 }
203 tmp++;
204 }
205 rc = DosGetNamedSharedMem(lplpMemAddr, sharedmemname, PAG_READ|PAG_WRITE);
206 if(name) {
207 free(sharedmemname);
208 }
209 }
210 else rc = DosGetSharedMem((LPVOID)*(DWORD *)lplpMemAddr, PAG_READ|PAG_WRITE);
211
212 return rc;
213}
214//******************************************************************************
215//******************************************************************************
216DWORD OSLibDosQueryMem(LPVOID lpMemAddr, DWORD *lpRangeSize, DWORD *lpAttr)
217{
218 return DosQueryMem(lpMemAddr, lpRangeSize, lpAttr);
219}
220//******************************************************************************
221//******************************************************************************
222DWORD OSLibDosSetMem(LPVOID lpMemAddr, DWORD size, DWORD flags)
223{
224 APIRET rc;
225
226 rc = DosSetMem(lpMemAddr, size, flags);
227 switch(rc) {
228 case ERROR_INVALID_ADDRESS:
229 return OSLIB_ERROR_INVALID_ADDRESS;
230 case ERROR_ACCESS_DENIED:
231 return OSLIB_ERROR_ACCESS_DENIED;
232 default:
233 return rc;
234 }
235}
236//******************************************************************************
237//******************************************************************************
Note: See TracBrowser for help on using the repository browser.