Changeset 8866 for trunk/src/kernel32/virtual.cpp
- Timestamp:
- Jul 13, 2002, 6:30:40 PM (23 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kernel32/virtual.cpp
r8864 r8866 1 /* $Id: virtual.cpp,v 1.4 6 2002-07-13 15:58:21sandervl Exp $ */1 /* $Id: virtual.cpp,v 1.47 2002-07-13 16:30:40 sandervl Exp $ */ 2 2 3 3 /* … … 329 329 if(lpvAddress) 330 330 { 331 Win32MemMap *map;332 ULONG offset, nrpages, accessflags = 0;333 331 Win32MemMap *map; 332 ULONG offset, nrpages, accessflags = 0; 333 334 334 nrpages = cbSize >> PAGE_SHIFT; 335 335 if(cbSize & 0xFFF) … … 519 519 DWORD* pfdwOldProtect) 520 520 { 521 DWORD rc;522 DWORD cb = cbSize;523 ULONG pageFlags = 0;524 int npages;525 526 if(pfdwOldProtect == NULL) {521 DWORD rc; 522 DWORD cb = cbSize; 523 ULONG pageFlags = 0; 524 int npages; 525 526 if(pfdwOldProtect == NULL) { 527 527 dprintf(("WARNING: pfdwOldProtect == NULL")); 528 528 SetLastError(ERROR_INVALID_PARAMETER); 529 529 return(FALSE); 530 }531 532 SetLastError(ERROR_SUCCESS);533 534 rc = OSLibDosQueryMem(lpvAddress, &cb, &pageFlags);535 if(rc) {530 } 531 532 SetLastError(ERROR_SUCCESS); 533 534 rc = OSLibDosQueryMem(lpvAddress, &cb, &pageFlags); 535 if(rc) { 536 536 dprintf(("DosQueryMem returned %d\n", rc)); 537 537 return(FALSE); 538 }539 dprintf(("Old memory flags %X\n", pageFlags));540 *pfdwOldProtect = 0;541 if(pageFlags & PAG_READ && !(pageFlags & PAG_WRITE))538 } 539 dprintf(("Old memory flags %X\n", pageFlags)); 540 *pfdwOldProtect = 0; 541 if(pageFlags & PAG_READ && !(pageFlags & PAG_WRITE)) 542 542 *pfdwOldProtect |= PAGE_READONLY; 543 if(pageFlags & (PAG_WRITE))543 if(pageFlags & (PAG_WRITE)) 544 544 *pfdwOldProtect |= PAGE_READWRITE; 545 545 546 if((pageFlags & (PAG_WRITE | PAG_EXECUTE)) == (PAG_WRITE | PAG_EXECUTE))546 if((pageFlags & (PAG_WRITE | PAG_EXECUTE)) == (PAG_WRITE | PAG_EXECUTE)) 547 547 *pfdwOldProtect |= PAGE_EXECUTE_READWRITE; 548 else549 if(pageFlags & PAG_EXECUTE)548 else 549 if(pageFlags & PAG_EXECUTE) 550 550 *pfdwOldProtect |= PAGE_EXECUTE_READ; 551 551 552 if(pageFlags & PAG_GUARD)552 if(pageFlags & PAG_GUARD) 553 553 *pfdwOldProtect |= PAGE_GUARD; 554 pageFlags = 0;555 556 if(fdwNewProtect & PAGE_READONLY) pageFlags |= PAG_READ;557 if(fdwNewProtect & PAGE_READWRITE) pageFlags |= (PAG_READ | PAG_WRITE);558 if(fdwNewProtect & PAGE_WRITECOPY) pageFlags |= (PAG_READ | PAG_WRITE);559 if(fdwNewProtect & PAGE_EXECUTE_READ) pageFlags |= (PAG_EXECUTE | PAG_READ);560 if(fdwNewProtect & PAGE_EXECUTE_READWRITE)554 pageFlags = 0; 555 556 if(fdwNewProtect & PAGE_READONLY) pageFlags |= PAG_READ; 557 if(fdwNewProtect & PAGE_READWRITE) pageFlags |= (PAG_READ | PAG_WRITE); 558 if(fdwNewProtect & PAGE_WRITECOPY) pageFlags |= (PAG_READ | PAG_WRITE); 559 if(fdwNewProtect & PAGE_EXECUTE_READ) pageFlags |= (PAG_EXECUTE | PAG_READ); 560 if(fdwNewProtect & PAGE_EXECUTE_READWRITE) 561 561 pageFlags |= (PAG_EXECUTE | PAG_WRITE | PAG_READ); 562 if(fdwNewProtect & PAGE_EXECUTE_WRITECOPY)562 if(fdwNewProtect & PAGE_EXECUTE_WRITECOPY) 563 563 pageFlags |= (PAG_EXECUTE | PAG_WRITE | PAG_READ); 564 if(fdwNewProtect & PAGE_GUARD) pageFlags |= PAG_GUARD;564 if(fdwNewProtect & PAGE_GUARD) pageFlags |= PAG_GUARD; 565 565 //Not supported in OS/2?? 566 566 // if(fdwNewProtect & PAGE_NOACCESS) 567 567 568 dprintf(("New memory flags %X\n", pageFlags));569 if(pageFlags == 0) {568 dprintf(("New memory flags %X\n", pageFlags)); 569 if(pageFlags == 0) { 570 570 dprintf(("pageFlags == 0\n")); 571 571 return(TRUE); //nothing to do 572 }573 ULONG offset = ((ULONG)lpvAddress & 0xFFF);574 npages = (cbSize >> 12);575 576 cb = (cbSize & 0xFFF) + offset; // !!! added, some optimization :)577 if( cb > 0 ) { // changed578 npages++;579 }580 if( cb > 4096 ) { // changed, note '>' sign ( not '>=' ) 4096 is exactly one page581 npages++;582 }583 584 lpvAddress = (LPVOID)((int)lpvAddress & ~0xFFF);585 cbSize = npages*4096;586 dprintf(("lpvAddress = %X, cbSize = %d\n", lpvAddress, cbSize));587 588 rc = OSLibDosSetMem(lpvAddress, cbSize, pageFlags);589 if(rc) {572 } 573 ULONG offset = ((ULONG)lpvAddress & 0xFFF); 574 npages = (cbSize >> 12); 575 576 cb = (cbSize & 0xFFF) + offset; // !!! added, some optimization :) 577 if( cb > 0 ) { // changed 578 npages++; 579 } 580 if( cb > 4096 ) { // changed, note '>' sign ( not '>=' ) 4096 is exactly one page 581 npages++; 582 } 583 584 lpvAddress = (LPVOID)((int)lpvAddress & ~0xFFF); 585 cbSize = npages*4096; 586 dprintf(("lpvAddress = %X, cbSize = %d\n", lpvAddress, cbSize)); 587 588 rc = OSLibDosSetMem(lpvAddress, cbSize, pageFlags); 589 if(rc) { 590 590 dprintf(("DosSetMem returned %d\n", rc)); 591 591 return(FALSE); 592 }593 return(TRUE);592 } 593 return(TRUE); 594 594 } 595 595 //****************************************************************************** … … 670 670 else 671 671 { 672 pmbiBuffer->AllocationBase = 0; 672 673 while(lpBase > 0) 673 674 { … … 685 686 } 686 687 } 688 #if 0 689 //TODO!!!!!!!!!!!! 690 //NOTE: !!!!!!!!!!!!!!!!!!!!!!! 691 //Allocation base is always aligned at 64kb 692 //the page with the PAG_BASE attribute might not be the real allocation base 693 //(due to extra alloc + rounding (see oslibmem.cpp) 694 //Only exception to this rule is the stack 695 TEB *teb = GetThreadTEB(); 696 if(teb) { 697 if(pmbiBuffer->AllocationBase >= teb->stack_low && pmbiBuffer->AllocationBase < teb->stack_top) { 698 pmbiBuffer->AllocationBase = pmbiBuffer->AllocationBase; 699 } 700 else pmbiBuffer->AllocationBase = (LPVOID)(((DWORD)pmbiBuffer->AllocationBase + 0xFFFF) & 0xFFFF); 701 } 702 else pmbiBuffer->AllocationBase = (LPVOID)(((DWORD)pmbiBuffer->AllocationBase + 0xFFFF) & 0xFFFF); 703 //END NOTE: !!!!!!!!!!!!!!!!!!! 704 #endif 705 687 706 dprintf(("Memory region alloc base 0x%08x", pmbiBuffer->AllocationBase)); 688 707 dprintf(("Memory region alloc protect flags %x", pmbiBuffer->AllocationProtect));
Note:
See TracChangeset
for help on using the changeset viewer.