Changeset 5197 for trunk/src/kernel32/oslibdos.cpp
- Timestamp:
- Feb 19, 2001, 11:07:21 PM (25 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kernel32/oslibdos.cpp
r5195 r5197 1 /* $Id: oslibdos.cpp,v 1.5 8 2001-02-19 18:12:20 birdExp $ */1 /* $Id: oslibdos.cpp,v 1.59 2001-02-19 22:07:21 sandervl Exp $ */ 2 2 /* 3 3 * Wrappers for OS/2 Dos* API … … 294 294 //NT returns addresses aligned at 64k, so we do too. 295 295 //****************************************************************************** 296 DWORD OSLibDosAllocMem(LPVOID *lplpMemAddr, DWORD cb, DWORD flFlags) 296 // tries to retrieve an aligned block recursivly 297 APIRET OdinAlignMemR(LPVOID *lpMemAddr, DWORD size, DWORD offset, DWORD flags) 298 { 299 LPVOID memaddr; 300 APIRET rc, rc2; 301 302 DosEnterCritSec(); 303 DosFreeMem(*lpMemAddr); 304 rc2 = DosAllocMem(&memaddr, 64 * 1024 - offset, PAG_READ | flAllocMem); 305 rc = DosAllocMem(lpMemAddr, size, flags | flAllocMem); 306 DosExitCritSec(); 307 308 dprintf2(("OdinAlignMem: DosAllocMem returned %d, %d and pointers %x, %x for size %x and offset %x", rc, rc2, *lpMemAddr, memaddr, size, offset )); 309 310 if(rc2) { 311 // giving up - return as received 312 return rc; 313 } 314 315 if(rc) { 316 // seems to be out of memory 317 DosFreeMem(memaddr); 318 return rc; 319 } 320 321 if((DWORD) *lpMemAddr & 0xFFFF) 322 rc = OdinAlignMemR(lpMemAddr, size, (DWORD) *lpMemAddr & 0xFFFF, flags); 323 324 DosFreeMem(memaddr); 325 return rc; 326 } 327 //****************************************************************************** 328 //****************************************************************************** 329 DWORD OSLibDosAllocMem(LPVOID *lplpMemAddr, DWORD cbSize, DWORD flFlags) 297 330 { 298 331 PVOID pvMemAddr; … … 305 338 if (libWin32kInstalled()) 306 339 { 307 rc = DosAllocMemEx(lplpMemAddr, cb , flFlags | flAllocMem | OBJ_ALIGN64K);340 rc = DosAllocMemEx(lplpMemAddr, cbSize, flFlags | flAllocMem | OBJ_ALIGN64K); 308 341 if (rc != ERROR_NOT_SUPPORTED) /* This call was stubbed until recently. */ 309 342 return rc; … … 313 346 * If no or old Win32k fall back to old method. 314 347 */ 315 rc = DosAllocMem(&pvMemAddr, cb, PAG_READ | flAllocMem); 316 if (rc)317 {348 349 rc = DosAllocMem(&pvMemAddr, cbSize, flFlags | flAllocMem); 350 if(rc) { 318 351 return rc; 319 352 } 320 DosEnterCritSec(); 321 DosFreeMem(pvMemAddr); 322 offset = (DWORD)pvMemAddr & 0xFFFF; 323 if (offset) 324 { 325 DosAllocMem(&pvMemAddr, 64*1024 - offset, PAG_READ | flAllocMem); 326 } 327 rc = DosAllocMem(lplpMemAddr, cb, flFlags | flAllocMem); 328 DosExitCritSec(); 329 if ((DWORD)*lplpMemAddr & 0xFFFF) 330 { //still not at 64k boundary? 331 DosFreeMem(*lplpMemAddr); 332 rc = OSLibDosAllocMem(lplpMemAddr, cb, flFlags); 333 } 334 if (offset) 335 { 336 DosFreeMem(pvMemAddr); 337 } 338 339 340 return rc; 353 354 // already 64k aligned ? 355 if((DWORD) pvMemAddr & 0xFFFF) 356 rc = OdinAlignMemR(&pvMemAddr, cbSize, (DWORD) pvMemAddr & 0xFFFF, flFlags); 357 358 if(!rc) 359 *lplpMemAddr = pvMemAddr; 360 361 return rc; 341 362 } 342 363 //******************************************************************************
Note:
See TracChangeset
for help on using the changeset viewer.