Changeset 8866 for trunk/src/kernel32/oslibmem.cpp
- Timestamp:
- Jul 13, 2002, 6:30:40 PM (23 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kernel32/oslibmem.cpp
r8864 r8866 1 /* $Id: oslibmem.cpp,v 1. 1 2002-07-13 15:58:21sandervl Exp $ */1 /* $Id: oslibmem.cpp,v 1.2 2002-07-13 16:30:40 sandervl Exp $ */ 2 2 /* 3 3 * Wrappers for OS/2 Dos* API 4 4 * 5 * Copyright 1998-200 0Sander van Leeuwen (sandervl@xs4all.nl)5 * Copyright 1998-2002 Sander van Leeuwen (sandervl@xs4all.nl) 6 6 * Copyright 2000 knut st. osmundsen (knut.stange.osmundsen@mynd.no) 7 7 * … … 47 47 DWORD OSLibDosAliasMem(LPVOID pb, ULONG cb, LPVOID *ppbAlias, ULONG fl) 48 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) {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 58 dprintf(("OSLibDosAliasMem: DosQueryMem %x %x return %d", pb, size, rc)); 59 59 return rc; 60 }61 size = (size-1) & ~0xfff;62 size+= PAGE_SIZE;63 if(size != cb) {60 } 61 size = (size-1) & ~0xfff; 62 size+= PAGE_SIZE; 63 if(size != cb) { 64 64 dprintf(("ERROR: OSLibDosAliasMem: size != cb (%x!=%x)!!!!!!!!", size, cb)); 65 65 //ignore this and continue return 5; 66 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) {67 } 68 attr &= (PAG_READ|PAG_WRITE|PAG_EXECUTE|PAG_GUARD|PAG_DEFAULT); 69 if(attr != fl) { 70 70 rc = DosSetMem(pb, size, fl); 71 71 if(rc) { … … 75 75 //return rc; 76 76 } 77 }78 rc = DosAliasMem(pb, cb, ppbAlias, 2);79 if(rc) {77 } 78 rc = DosAliasMem(pb, cb, ppbAlias, 2); 79 if(rc) { 80 80 dprintf(("OSLibDosAliasMem: DosAliasMem %x %x returned %d", pb, cb, rc)); 81 81 return rc; 82 }83 if(attr != fl) {82 } 83 if(attr != fl) { 84 84 rc = DosSetMem(pb, size, attr); 85 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 //NT returns addresses aligned at 64k, so we do too. 94 //****************************************************************************** 95 // tries to retrieve an aligned block recursivly 96 APIRET OdinAlignMemR(LPVOID *lpMemAddr, DWORD size, DWORD offset, DWORD flags) 97 { 98 LPVOID memaddr; 99 APIRET rc, rc2; 100 101 DosEnterCritSec(); 102 DosFreeMem(*lpMemAddr); 103 rc2 = DosAllocMem(&memaddr, 64 * 1024 - offset, PAG_READ | flAllocMem); 104 rc = DosAllocMem(lpMemAddr, size, flags | flAllocMem); 105 DosExitCritSec(); 106 107 dprintf2(("OdinAlignMem: DosAllocMem returned %d, %d and pointers %x, %x for size %x and offset %x", rc, rc2, *lpMemAddr, memaddr, size, offset )); 108 109 if(rc2) { 110 // giving up - return as received 111 return rc; 112 } 113 114 if(rc) { 115 // seems to be out of memory 116 DosFreeMem(memaddr); 117 return rc; 118 } 119 120 if((DWORD) *lpMemAddr & 0xFFFF) 121 rc = OdinAlignMemR(lpMemAddr, size, (DWORD) *lpMemAddr & 0xFFFF, flags); 122 123 DosFreeMem(memaddr); 124 return rc; 86 dprintf(("OSLibDosAliasMem: DosSetMem (2) %x %x return %d", pb, size, rc)); 87 return rc; 88 } 89 } 90 return 0; 125 91 } 126 92 //****************************************************************************** … … 148 114 rc = DosAllocMem(&pvMemAddr, cbSize, flFlags | flAllocMem); 149 115 if(rc) { 150 return rc; 151 } 152 116 dprintf(("DosAllocMem failed with rc %d", rc)); 117 return rc; 118 } 119 //TODO!!!!!!!!!!!! 120 #if 0 153 121 // already 64k aligned ? 154 // if((DWORD) pvMemAddr & 0xFFFF) 155 // rc = OdinAlignMemR(&pvMemAddr, cbSize, (DWORD) pvMemAddr & 0xFFFF, flFlags); 156 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 157 141 if(!rc) 158 142 *lplpMemAddr = pvMemAddr; … … 164 148 DWORD OSLibDosFreeMem(LPVOID lpMemAddr) 165 149 { 166 return DosFreeMem(lpMemAddr);150 return DosFreeMem(lpMemAddr); 167 151 } 168 152 //****************************************************************************** … … 173 157 DWORD OSLibDosAllocSharedMem(LPVOID *lplpMemAddr, DWORD size, DWORD flags, LPSTR name) 174 158 { 175 APIRET rc;176 char *sharedmemname = NULL, *tmp;177 178 if(name) {179 sharedmemname = (char *)malloc(strlen(name) + 16);180 strcpy(sharedmemname, "\\SHAREMEM\\");181 strcat(sharedmemname, name);182 }183 elseflags |= OBJ_GETTABLE;184 185 //SvL: Colons are unacceptable in shared memory names (for whatever reason)186 tmp = sharedmemname;187 while(*tmp != 0) {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) { 188 172 if(*tmp == ':') { 189 173 *tmp = '_'; 190 174 } 191 175 tmp++; 192 }193 194 rc = DosAllocSharedMem(lplpMemAddr, sharedmemname, size, flags);195 if(name) {176 } 177 178 rc = DosAllocSharedMem(lplpMemAddr, sharedmemname, size, flags); 179 if(name) { 196 180 free(sharedmemname); 197 }198 return rc;181 } 182 return rc; 199 183 } 200 184 //****************************************************************************** … … 203 187 DWORD OSLibDosGetNamedSharedMem(LPVOID *lplpMemAddr, LPSTR name) 204 188 { 205 APIRET rc;206 char *sharedmemname = NULL, *tmp;207 208 if(name) {189 APIRET rc; 190 char *sharedmemname = NULL, *tmp; 191 192 if(name) { 209 193 sharedmemname = (char *)malloc(strlen(name) + 16); 210 194 strcpy(sharedmemname, "\\SHAREMEM\\"); … … 223 207 free(sharedmemname); 224 208 } 225 }226 else rc = DosGetSharedMem((LPVOID)*(DWORD *)lplpMemAddr, PAG_READ|PAG_WRITE);227 228 return rc;209 } 210 else rc = DosGetSharedMem((LPVOID)*(DWORD *)lplpMemAddr, PAG_READ|PAG_WRITE); 211 212 return rc; 229 213 } 230 214 //****************************************************************************** … … 232 216 DWORD OSLibDosQueryMem(LPVOID lpMemAddr, DWORD *lpRangeSize, DWORD *lpAttr) 233 217 { 234 return DosQueryMem(lpMemAddr, lpRangeSize, lpAttr);218 return DosQueryMem(lpMemAddr, lpRangeSize, lpAttr); 235 219 } 236 220 //****************************************************************************** … … 238 222 DWORD OSLibDosSetMem(LPVOID lpMemAddr, DWORD size, DWORD flags) 239 223 { 240 APIRET rc;241 242 rc = DosSetMem(lpMemAddr, size, flags);243 switch(rc) {244 245 246 247 248 249 250 }251 } 252 //****************************************************************************** 253 //****************************************************************************** 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 TracChangeset
for help on using the changeset viewer.