Ignore:
Timestamp:
Jul 13, 2002, 5:58:21 PM (23 years ago)
Author:
sandervl
Message:

moved OS2 memory functions into seperate file

File:
1 edited

Legend:

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

    r8783 r8864  
    1 /* $Id: oslibdos.cpp,v 1.106 2002-06-26 11:08:47 sandervl Exp $ */
     1/* $Id: oslibdos.cpp,v 1.107 2002-07-13 15:58:20 sandervl Exp $ */
    22/*
    33 * Wrappers for OS/2 Dos* API
     
    424424}
    425425//******************************************************************************
    426 //TODO: Assumes entire memory range has the same protection flags!
    427 //TODO: Check if this works for code aliases...
    428 //******************************************************************************
    429 DWORD OSLibDosAliasMem(LPVOID pb, ULONG cb, LPVOID *ppbAlias, ULONG fl)
    430 {
    431  DWORD rc;
    432  DWORD attr;
    433  DWORD size = cb;
    434 
    435   cb = (cb-1) & ~0xfff;
    436   cb+= PAGE_SIZE;
    437 
    438   rc = DosQueryMem(pb, &size, &attr);
    439   if(rc) {
    440         dprintf(("OSLibDosAliasMem: DosQueryMem %x %x return %d", pb, size, rc));
    441         return rc;
    442   }
    443   size = (size-1) & ~0xfff;
    444   size+= PAGE_SIZE;
    445   if(size != cb) {
    446         dprintf(("ERROR: OSLibDosAliasMem: size != cb (%x!=%x)!!!!!!!!", size, cb));
    447         //ignore this and continue return 5;
    448         attr = fl; //just use original protection flags (NOT CORRECT)
    449   }
    450   attr &= (PAG_READ|PAG_WRITE|PAG_EXECUTE|PAG_GUARD|PAG_DEFAULT);
    451   if(attr != fl) {
    452         rc = DosSetMem(pb, size, fl);
    453         if(rc) {
    454                 dprintf(("OSLibDosAliasMem: DosSetMem %x %x return %d", pb, size, rc));
    455                 attr = fl;
    456                 //just continue for now
    457                 //return rc;
    458         }
    459   }
    460   rc = DosAliasMem(pb, cb, ppbAlias, 2);
    461   if(rc) {
    462         dprintf(("OSLibDosAliasMem: DosAliasMem %x %x returned %d", pb, cb, rc));
    463         return rc;
    464   }
    465   if(attr != fl) {
    466         rc = DosSetMem(pb, size, attr);
    467         if(rc) {
    468                 dprintf(("OSLibDosAliasMem: DosSetMem (2) %x %x return %d", pb, size, rc));
    469                 return rc;
    470         }
    471   }
    472   return 0;
    473 }
    474 //******************************************************************************
    475 //NT returns addresses aligned at 64k, so we do too.
    476 //******************************************************************************
    477 // tries to retrieve an aligned block recursivly
    478 APIRET OdinAlignMemR(LPVOID *lpMemAddr, DWORD size, DWORD offset, DWORD flags)
    479 {
    480   LPVOID memaddr;
    481   APIRET rc, rc2;
    482 
    483   DosEnterCritSec();
    484   DosFreeMem(*lpMemAddr);
    485   rc2 = DosAllocMem(&memaddr, 64 * 1024 - offset, PAG_READ | flAllocMem);
    486   rc  = DosAllocMem(lpMemAddr, size, flags | flAllocMem);
    487   DosExitCritSec();
    488 
    489   dprintf2(("OdinAlignMem: DosAllocMem returned %d, %d  and pointers %x, %x for size %x and offset %x", rc, rc2, *lpMemAddr, memaddr, size, offset ));
    490 
    491   if(rc2) {
    492     // giving up - return as received
    493     return rc;
    494   }
    495 
    496   if(rc) {
    497     // seems to be out of memory
    498     DosFreeMem(memaddr);
    499     return rc;
    500   }
    501 
    502   if((DWORD) *lpMemAddr & 0xFFFF)
    503     rc = OdinAlignMemR(lpMemAddr, size, (DWORD) *lpMemAddr & 0xFFFF, flags);
    504 
    505   DosFreeMem(memaddr);
    506   return rc;
    507 }
    508 //******************************************************************************
    509 //******************************************************************************
    510 DWORD OSLibDosAllocMem(LPVOID *lplpMemAddr, DWORD cbSize, DWORD flFlags)
    511 {
    512     PVOID   pvMemAddr;
    513     DWORD   offset;
    514     APIRET  rc;
    515 
    516     /*
    517      * Let's try use the exteneded DosAllocMem API of Win32k.sys.
    518      */
    519     if (libWin32kInstalled())
    520     {
    521         rc = DosAllocMemEx(lplpMemAddr, cbSize, flFlags | flAllocMem | OBJ_ALIGN64K);
    522         if (rc != ERROR_NOT_SUPPORTED)  /* This call was stubbed until recently. */
    523             return rc;
    524     }
    525 
    526     /*
    527      * If no or old Win32k fall back to old method.
    528      */
    529 
    530     rc = DosAllocMem(&pvMemAddr, cbSize, flFlags | flAllocMem);
    531     if(rc) {
    532         return rc;
    533     }
    534 
    535     // already 64k aligned ?
    536     if((DWORD) pvMemAddr & 0xFFFF)
    537         rc = OdinAlignMemR(&pvMemAddr, cbSize, (DWORD) pvMemAddr & 0xFFFF, flFlags);
    538 
    539     if(!rc)
    540         *lplpMemAddr = pvMemAddr;
    541 
    542     return rc;
    543 }
    544 //******************************************************************************
    545 //******************************************************************************
    546 DWORD OSLibDosFreeMem(LPVOID lpMemAddr)
    547 {
    548   return DosFreeMem(lpMemAddr);
    549 }
    550 //******************************************************************************
    551 //NOTE: If name == NULL, allocated gettable unnamed shared memory
    552 //OS/2 returns error 123 (invalid name) if the shared memory name includes
    553 //colons. We need to replace them with underscores.
    554 //******************************************************************************
    555 DWORD OSLibDosAllocSharedMem(LPVOID *lplpMemAddr, DWORD size, DWORD flags, LPSTR name)
    556 {
    557  APIRET rc;
    558  char  *sharedmemname = NULL, *tmp;
    559 
    560   if(name) {
    561         sharedmemname = (char *)malloc(strlen(name) + 16);
    562         strcpy(sharedmemname, "\\SHAREMEM\\");
    563         strcat(sharedmemname, name);
    564   }
    565   else  flags |= OBJ_GETTABLE;
    566 
    567   //SvL: Colons are unacceptable in shared memory names (for whatever reason)
    568   tmp = sharedmemname;
    569   while(*tmp != 0) {
    570         if(*tmp == ':') {
    571             *tmp = '_';
    572         }
    573         tmp++;
    574   }
    575 
    576   rc = DosAllocSharedMem(lplpMemAddr, sharedmemname, size, flags);
    577   if(name) {
    578         free(sharedmemname);
    579   }
    580   return rc;
    581 }
    582 //******************************************************************************
    583 //NOTE: If name == NULL, assume gettable unnamed shared memory
    584 //******************************************************************************
    585 DWORD OSLibDosGetNamedSharedMem(LPVOID *lplpMemAddr, LPSTR name)
    586 {
    587  APIRET rc;
    588  char  *sharedmemname = NULL, *tmp;
    589 
    590   if(name) {
    591         sharedmemname = (char *)malloc(strlen(name) + 16);
    592         strcpy(sharedmemname, "\\SHAREMEM\\");
    593         strcat(sharedmemname, name);
    594 
    595         //SvL: Colons are unacceptable in shared memory names (for whatever reason)
    596         tmp = sharedmemname;
    597         while(*tmp != 0) {
    598             if(*tmp == ':') {
    599                 *tmp = '_';
    600             }
    601             tmp++;
    602         }
    603         rc = DosGetNamedSharedMem(lplpMemAddr, sharedmemname, PAG_READ|PAG_WRITE);
    604         if(name) {
    605                 free(sharedmemname);
    606         }
    607   }
    608   else  rc = DosGetSharedMem((LPVOID)*(DWORD *)lplpMemAddr, PAG_READ|PAG_WRITE);
    609 
    610   return rc;
    611 }
    612 //******************************************************************************
    613 //******************************************************************************
    614 DWORD OSLibDosQueryMem(LPVOID lpMemAddr, DWORD *lpRangeSize, DWORD *lpAttr)
    615 {
    616   return DosQueryMem(lpMemAddr, lpRangeSize, lpAttr);
    617 }
    618 //******************************************************************************
    619 //******************************************************************************
    620 DWORD OSLibDosSetMem(LPVOID lpMemAddr, DWORD size, DWORD flags)
    621 {
    622  APIRET rc;
    623 
    624   rc = DosSetMem(lpMemAddr, size, flags);
    625   switch(rc) {
    626         case ERROR_INVALID_ADDRESS:
    627                 return OSLIB_ERROR_INVALID_ADDRESS;
    628         case ERROR_ACCESS_DENIED:
    629                 return OSLIB_ERROR_ACCESS_DENIED;
    630         default:
    631                 return rc;
    632   }
    633 }
    634 //******************************************************************************
    635426//******************************************************************************
    636427DWORD OSLibDosOpen(char *lpszFileName, DWORD flags)
     
    642433 char lOemFileName[260];
    643434
    644  CharToOemA(lpszFileName, lOemFileName);
    645 
     435  CharToOemA(lpszFileName, lOemFileName);
    646436
    647437  if(flags & OSLIB_ACCESS_READONLY)
Note: See TracChangeset for help on using the changeset viewer.