Changeset 21302 for trunk/src/kernel32/virtual.cpp
- Timestamp:
- Jun 18, 2009, 11:53:26 AM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kernel32/virtual.cpp
r9971 r21302 7 7 * Copyright 1998 Knut St. Osmundsen 8 8 * Copyright 1998 Peter FitzSimmons 9 * Copyright 2002-2003 Innotek Systemberatung GmbH (sandervl@innotek.de) 9 10 * 10 11 * Parts (VIRTUAL_MapFileA/W) based on Wine code (memory\virtual.c): … … 267 268 return hMapping; 268 269 } 269 270 //****************************************************************************** 270 //****************************************************************************** 271 // Translate OS2 page attributes to Windows attribute, state and type values 272 //****************************************************************************** 273 void TranslateOS2PageAttr(DWORD os2attr, DWORD *lpdwWinProtect, DWORD *lpdwWinState, 274 DWORD *lpdwWinType) 275 { 276 DWORD State, Type; 277 278 if(!lpdwWinState) lpdwWinState = &State; 279 if(!lpdwWinType) lpdwWinType = &Type; 280 281 *lpdwWinProtect = 0; 282 *lpdwWinState = 0; 283 *lpdwWinType = 0; 284 285 if(os2attr & PAG_READ && !(os2attr & PAG_WRITE)) 286 *lpdwWinProtect |= PAGE_READONLY; 287 else 288 if(os2attr & PAG_WRITE) 289 *lpdwWinProtect |= PAGE_READWRITE; 290 291 if((os2attr & (PAG_WRITE | PAG_EXECUTE)) == (PAG_WRITE | PAG_EXECUTE)) 292 *lpdwWinProtect |= PAGE_EXECUTE_READWRITE; 293 else 294 if(os2attr & PAG_EXECUTE) 295 *lpdwWinProtect |= PAGE_EXECUTE_READ; 296 297 if(os2attr & PAG_GUARD) 298 *lpdwWinProtect |= PAGE_GUARD; 299 300 if(os2attr & PAG_FREE) 301 *lpdwWinState = MEM_FREE; 302 else 303 if(os2attr & PAG_COMMIT) 304 *lpdwWinState = MEM_COMMIT; 305 else 306 *lpdwWinState = MEM_RESERVE; 307 308 //TODO: MEM_MAPPED & MEM_IMAGE (==SEC_IMAGE) 309 if(!(os2attr & PAG_SHARED)) 310 *lpdwWinType = MEM_PRIVATE; 311 312 // Pages can be committed but not necessarily accessible!! 313 if (!(os2attr & (PAG_READ | PAG_WRITE | PAG_EXECUTE | PAG_GUARD))) 314 *lpdwWinProtect = PAGE_NOACCESS; 315 316 } 317 //****************************************************************************** 318 // Translate Windows page attributes to OS/2 page attributes 319 //****************************************************************************** 320 void TranslateWinPageAttr(DWORD dwProtect, DWORD *lpdwOS2Attr) 321 { 322 *lpdwOS2Attr = 0; 323 324 if(dwProtect & PAGE_READONLY) *lpdwOS2Attr |= PAG_READ; 325 if(dwProtect & PAGE_READWRITE) *lpdwOS2Attr |= (PAG_READ | PAG_WRITE); 326 if(dwProtect & PAGE_WRITECOPY) *lpdwOS2Attr |= (PAG_READ | PAG_WRITE); 327 328 if(dwProtect & PAGE_EXECUTE) *lpdwOS2Attr |= (PAG_EXECUTE | PAG_READ); 329 if(dwProtect & PAGE_EXECUTE_READ) *lpdwOS2Attr |= (PAG_EXECUTE | PAG_READ); 330 if(dwProtect & PAGE_EXECUTE_READWRITE) 331 *lpdwOS2Attr |= (PAG_EXECUTE | PAG_WRITE | PAG_READ); 332 if(dwProtect & PAGE_EXECUTE_WRITECOPY) 333 *lpdwOS2Attr |= (PAG_EXECUTE | PAG_WRITE | PAG_READ); 334 335 if(dwProtect & PAGE_GUARD) { 336 dprintf(("WARNING: PAGE_GUARD bit set for VirtualAlloc -> we don't support this right now!")); 337 *lpdwOS2Attr |= PAG_GUARD; 338 } 339 if(dwProtect & PAGE_NOACCESS) *lpdwOS2Attr |= PAG_READ; //can't do this in OS/2 340 } 341 //****************************************************************************** 342 //NOTE: Do NOT set the last error to ERROR_SUCCESS if successful. Windows 343 // does not do this either! 271 344 //****************************************************************************** 272 345 LPVOID WIN32API VirtualAlloc(LPVOID lpvAddress, … … 280 353 DWORD rc; 281 354 282 SetLastError(ERROR_SUCCESS);283 284 355 if (cbSize > 0x7fc00000) /* 2Gb - 4Mb */ 285 356 { … … 289 360 } 290 361 362 // We're ignoring MEM_TOP_DOWN for now 291 363 if (!(fdwAllocationType & (MEM_COMMIT | MEM_RESERVE)) || 292 (fdwAllocationType & ~(MEM_COMMIT | MEM_RESERVE )))364 (fdwAllocationType & ~(MEM_COMMIT | MEM_RESERVE | MEM_TOP_DOWN))) 293 365 { 294 366 dprintf(("VirtualAlloc: Invalid parameter")); … … 308 380 cbSize += PAGE_SIZE; 309 381 382 //Translate windows page attributes (flag is reset to 0!!) 383 TranslateWinPageAttr(fdwProtect, &flag); 384 310 385 if(fdwAllocationType & MEM_COMMIT) 311 386 { 312 387 dprintf(("VirtualAlloc: commit\n")); 313 flag = PAG_COMMIT;388 flag |= PAG_COMMIT; 314 389 } 315 390 … … 322 397 // it will have the old (alloc time) attributes 323 398 flag |= PAG_READ|PAG_WRITE; 324 }325 if(fdwProtect & PAGE_READONLY) flag |= PAG_READ;326 if(fdwProtect & PAGE_NOACCESS) flag |= PAG_READ; //can't do this in OS/2327 if(fdwProtect & PAGE_READWRITE) flag |= (PAG_READ | PAG_WRITE);328 if(fdwProtect & PAGE_WRITECOPY) flag |= (PAG_READ | PAG_WRITE);329 330 if(fdwProtect & PAGE_EXECUTE_READWRITE) flag |= (PAG_EXECUTE | PAG_WRITE | PAG_READ);331 if(fdwProtect & PAGE_EXECUTE_READ) flag |= (PAG_EXECUTE | PAG_READ);332 if(fdwProtect & PAGE_EXECUTE) flag |= PAG_EXECUTE;333 334 if(fdwProtect & PAGE_GUARD) {335 dprintf(("WARNING: PAGE_GUARD bit set for VirtualAlloc -> we don't support this right now!"));336 flag |= PAG_GUARD;337 399 } 338 400 … … 470 532 471 533 dprintf(("VirtualAlloc returned %X\n", Address)); 472 SetLastError(ERROR_SUCCESS);473 534 return(Address); 474 535 } 475 536 //****************************************************************************** 537 //NOTE: Do NOT set the last error to ERROR_SUCCESS if successful. Windows 538 // does not do this either! 476 539 //****************************************************************************** 477 540 BOOL WIN32API VirtualFree(LPVOID lpvAddress, … … 481 544 DWORD rc; 482 545 483 SetLastError(ERROR_SUCCESS);484 485 546 // verify parameters 486 547 if((FreeType & MEM_RELEASE) && (cbSize != 0)) … … 496 557 SetLastError(ERROR_INVALID_PARAMETER); 497 558 return(FALSE); 559 } 560 561 /* Assuming that we don't allocate memory in the first 64kb. */ 562 if ((unsigned)lpvAddress < 0x10000) 563 { 564 if (!lpvAddress) 565 dprintf(("WARNING: VirtualFree: bogus address %p!!", lpvAddress)); 566 SetLastError(ERROR_INVALID_ADDRESS); 567 return FALSE; 498 568 } 499 569 … … 579 649 } 580 650 dprintf(("Old memory flags %X\n", pageFlags)); 581 *pfdwOldProtect = 0; 582 if(pageFlags & PAG_READ && !(pageFlags & PAG_WRITE)) 583 *pfdwOldProtect |= PAGE_READONLY; 584 if(pageFlags & (PAG_WRITE)) 585 *pfdwOldProtect |= PAGE_READWRITE; 586 587 if((pageFlags & (PAG_WRITE | PAG_EXECUTE)) == (PAG_WRITE | PAG_EXECUTE)) 588 *pfdwOldProtect |= PAGE_EXECUTE_READWRITE; 589 else 590 if(pageFlags & PAG_EXECUTE) 591 *pfdwOldProtect |= PAGE_EXECUTE_READ; 592 593 if(pageFlags & PAG_GUARD) 594 *pfdwOldProtect |= PAGE_GUARD; 595 pageFlags = 0; 596 597 if(fdwNewProtect & PAGE_READONLY) pageFlags |= PAG_READ; 598 if(fdwNewProtect & PAGE_READWRITE) pageFlags |= (PAG_READ | PAG_WRITE); 599 if(fdwNewProtect & PAGE_WRITECOPY) pageFlags |= (PAG_READ | PAG_WRITE); 600 if(fdwNewProtect & PAGE_EXECUTE_READ) pageFlags |= (PAG_EXECUTE | PAG_READ); 601 if(fdwNewProtect & PAGE_EXECUTE_READWRITE) 602 pageFlags |= (PAG_EXECUTE | PAG_WRITE | PAG_READ); 603 if(fdwNewProtect & PAGE_EXECUTE_WRITECOPY) 604 pageFlags |= (PAG_EXECUTE | PAG_WRITE | PAG_READ); 605 if(fdwNewProtect & PAGE_GUARD) pageFlags |= PAG_GUARD; 606 //Not supported in OS/2?? 607 // if(fdwNewProtect & PAGE_NOACCESS) 651 TranslateOS2PageAttr(pageFlags, pfdwOldProtect, NULL, NULL); 652 653 TranslateWinPageAttr(fdwNewProtect, &pageFlags); 608 654 609 655 dprintf(("New memory flags %X\n", pageFlags)); … … 658 704 659 705 rc = OSLibDosQueryMem(lpBase, &cbRangeSize, &dAttr); 706 if(rc==487) 707 { 708 dprintf(("VirtualQuery - OSLibDosQueryMem %x %x returned %d, REMOVING ERROR!\n", 709 lpBase, cbLength, rc)); 710 SetLastError(0); 711 return 0; 712 } 660 713 if(rc) 661 714 { … … 672 725 pmbiBuffer->RegionSize = (cbRangeSize + 0xFFF) & 0xFFFFF000; 673 726 674 if(dAttr & PAG_READ && !(dAttr & PAG_WRITE)) 675 pmbiBuffer->Protect |= PAGE_READONLY; 676 677 if(dAttr & PAG_WRITE) 678 pmbiBuffer->Protect |= PAGE_READWRITE; 679 680 if((dAttr & (PAG_WRITE | PAG_EXECUTE)) == (PAG_WRITE | PAG_EXECUTE)) 681 pmbiBuffer->Protect |= PAGE_EXECUTE_READWRITE; 682 else 683 if(dAttr & PAG_EXECUTE) 684 pmbiBuffer->Protect |= PAGE_EXECUTE_READ; 685 686 if(dAttr & PAG_GUARD) 687 pmbiBuffer->Protect |= PAGE_GUARD; 688 689 if(dAttr & PAG_FREE) 690 pmbiBuffer->State = MEM_FREE; 691 else 692 if(dAttr & PAG_COMMIT) 693 pmbiBuffer->State = MEM_COMMIT; 694 else 695 pmbiBuffer->State = MEM_RESERVE; 696 697 //TODO: MEM_MAPPED & MEM_IMAGE (==SEC_IMAGE) 698 if(!(dAttr & PAG_SHARED)) 699 pmbiBuffer->Type = MEM_PRIVATE; 700 701 // Pages can be committed but not necessarily accessible!! 702 if (!(dAttr & (PAG_READ | PAG_WRITE | PAG_EXECUTE | PAG_GUARD))) 703 pmbiBuffer->Protect = PAGE_NOACCESS; 727 TranslateOS2PageAttr(dAttr, &pmbiBuffer->Protect, &pmbiBuffer->State, &pmbiBuffer->Type); 704 728 705 729 //TODO: This is not correct: AllocationProtect should contain the protection 706 730 // flags used in the initial call to VirtualAlloc 707 731 pmbiBuffer->AllocationProtect = pmbiBuffer->Protect; 708 pmbiBuffer->AllocationBase = OSLibDosFindMemBase(lpBase); 709 732 pmbiBuffer->AllocationBase = OSLibDosFindMemBase(lpBase, &dAttr); 733 if(dAttr) { 734 TranslateOS2PageAttr(dAttr, &pmbiBuffer->AllocationProtect, NULL, NULL); 735 } 710 736 dprintf(("Memory region alloc base 0x%08x", pmbiBuffer->AllocationBase)); 711 737 dprintf(("Memory region alloc protect flags %x", pmbiBuffer->AllocationProtect)); … … 725 751 return TRUE; 726 752 } 727 753 //****************************************************************************** 728 754 //****************************************************************************** 729 755 BOOL WIN32API VirtualUnlock(LPVOID lpAddress, DWORD dwSize) … … 802 828 803 829 //****************************************************************************** 804 // SvL: Privateapi830 // Private Odin api 805 831 //****************************************************************************** 806 832 LPVOID VirtualAllocShared(DWORD cbSize, DWORD fdwAllocationType, … … 828 854 } 829 855 856 //Translate windows page attributes (flag is reset to 0!!) 857 TranslateWinPageAttr(fdwProtect, &flag); 858 830 859 if(fdwAllocationType & MEM_COMMIT) 831 860 { 832 861 dprintf(("VirtualAllocShared: commit\n")); 833 flag = PAG_COMMIT; 834 } 835 836 if(fdwProtect & PAGE_READONLY) flag |= PAG_READ; 837 if(fdwProtect & PAGE_NOACCESS) flag |= PAG_READ; //can't do this in OS/2 838 if(fdwProtect & PAGE_READWRITE) flag |= (PAG_READ | PAG_WRITE); 839 if(fdwProtect & PAGE_WRITECOPY) flag |= (PAG_READ | PAG_WRITE); 840 841 if(fdwProtect & PAGE_EXECUTE_READWRITE) flag |= (PAG_EXECUTE | PAG_WRITE | PAG_READ); 842 if(fdwProtect & PAGE_EXECUTE_READ) flag |= (PAG_EXECUTE | PAG_READ); 843 if(fdwProtect & PAGE_EXECUTE) flag |= PAG_EXECUTE; 844 845 if(fdwProtect & PAGE_GUARD) { 846 dprintf(("ERROR: PAGE_GUARD bit set for VirtualAllocShared -> we don't support this right now!")); 847 flag |= PAG_GUARD; 862 flag |= PAG_COMMIT; 848 863 } 849 864 … … 867 882 return(Address); 868 883 } 884 //****************************************************************************** 885 //******************************************************************************
Note:
See TracChangeset
for help on using the changeset viewer.