Ignore:
Timestamp:
Feb 19, 2001, 11:07:21 PM (25 years ago)
Author:
sandervl
Message:

KS: OSLibDosAllocMem fix

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/kernel32/oslibdos.cpp

    r5195 r5197  
    1 /* $Id: oslibdos.cpp,v 1.58 2001-02-19 18:12:20 bird Exp $ */
     1/* $Id: oslibdos.cpp,v 1.59 2001-02-19 22:07:21 sandervl Exp $ */
    22/*
    33 * Wrappers for OS/2 Dos* API
     
    294294//NT returns addresses aligned at 64k, so we do too.
    295295//******************************************************************************
    296 DWORD OSLibDosAllocMem(LPVOID *lplpMemAddr, DWORD cb, DWORD flFlags)
     296// tries to retrieve an aligned block recursivly
     297APIRET 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//******************************************************************************
     329DWORD OSLibDosAllocMem(LPVOID *lplpMemAddr, DWORD cbSize, DWORD flFlags)
    297330{
    298331    PVOID   pvMemAddr;
     
    305338    if (libWin32kInstalled())
    306339    {
    307         rc = DosAllocMemEx(lplpMemAddr, cb, flFlags | flAllocMem | OBJ_ALIGN64K);
     340        rc = DosAllocMemEx(lplpMemAddr, cbSize, flFlags | flAllocMem | OBJ_ALIGN64K);
    308341        if (rc != ERROR_NOT_SUPPORTED)  /* This call was stubbed until recently. */
    309342            return rc;
     
    313346     * If no or old Win32k fall back to old method.
    314347     */
    315     rc = DosAllocMem(&pvMemAddr, cb, PAG_READ | flAllocMem);
    316     if (rc)
    317     {
     348
     349    rc = DosAllocMem(&pvMemAddr, cbSize, flFlags | flAllocMem);
     350    if(rc) {
    318351        return rc;
    319352    }
    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;
    341362}
    342363//******************************************************************************
Note: See TracChangeset for help on using the changeset viewer.