Changeset 8864 for trunk/src/kernel32/oslibdos.cpp
- Timestamp:
- Jul 13, 2002, 5:58:21 PM (23 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kernel32/oslibdos.cpp
r8783 r8864 1 /* $Id: oslibdos.cpp,v 1.10 6 2002-06-26 11:08:47sandervl Exp $ */1 /* $Id: oslibdos.cpp,v 1.107 2002-07-13 15:58:20 sandervl Exp $ */ 2 2 /* 3 3 * Wrappers for OS/2 Dos* API … … 424 424 } 425 425 //****************************************************************************** 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 now457 //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 recursivly478 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 received493 return rc;494 }495 496 if(rc) {497 // seems to be out of memory498 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 memory552 //OS/2 returns error 123 (invalid name) if the shared memory name includes553 //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 memory584 //******************************************************************************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 //******************************************************************************635 426 //****************************************************************************** 636 427 DWORD OSLibDosOpen(char *lpszFileName, DWORD flags) … … 642 433 char lOemFileName[260]; 643 434 644 CharToOemA(lpszFileName, lOemFileName); 645 435 CharToOemA(lpszFileName, lOemFileName); 646 436 647 437 if(flags & OSLIB_ACCESS_READONLY)
Note:
See TracChangeset
for help on using the changeset viewer.