Ignore:
Timestamp:
Jun 18, 2009, 11:53:26 AM (16 years ago)
Author:
ydario
Message:

Kernel32 updates.

File:
1 edited

Legend:

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

    r9971 r21302  
    77 * Copyright 1998 Knut St. Osmundsen
    88 * Copyright 1998 Peter FitzSimmons
     9 * Copyright 2002-2003 Innotek Systemberatung GmbH (sandervl@innotek.de)
    910 *
    1011 * Parts (VIRTUAL_MapFileA/W) based on Wine code (memory\virtual.c):
     
    267268    return hMapping;
    268269}
    269 
    270 //******************************************************************************
     270//******************************************************************************
     271// Translate OS2 page attributes to Windows attribute, state and type values
     272//******************************************************************************
     273void 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//******************************************************************************
     320void 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!
    271344//******************************************************************************
    272345LPVOID WIN32API VirtualAlloc(LPVOID lpvAddress,
     
    280353    DWORD rc;
    281354
    282     SetLastError(ERROR_SUCCESS);
    283 
    284355    if (cbSize > 0x7fc00000)  /* 2Gb - 4Mb */
    285356    {
     
    289360    }
    290361
     362    // We're ignoring MEM_TOP_DOWN for now
    291363    if (!(fdwAllocationType & (MEM_COMMIT | MEM_RESERVE)) ||
    292        (fdwAllocationType & ~(MEM_COMMIT | MEM_RESERVE)))
     364       (fdwAllocationType & ~(MEM_COMMIT | MEM_RESERVE | MEM_TOP_DOWN)))
    293365    {
    294366        dprintf(("VirtualAlloc: Invalid parameter"));
     
    308380        cbSize += PAGE_SIZE;
    309381
     382    //Translate windows page attributes (flag is reset to 0!!)
     383    TranslateWinPageAttr(fdwProtect, &flag);
     384
    310385    if(fdwAllocationType & MEM_COMMIT)
    311386    {
    312387        dprintf(("VirtualAlloc: commit\n"));
    313         flag = PAG_COMMIT;
     388        flag |= PAG_COMMIT;
    314389    }
    315390
     
    322397        // it will have the old (alloc time) attributes
    323398        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/2
    327     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;
    337399    }
    338400   
     
    470532
    471533    dprintf(("VirtualAlloc returned %X\n", Address));
    472     SetLastError(ERROR_SUCCESS);
    473534    return(Address);
    474535}
    475536//******************************************************************************
     537//NOTE: Do NOT set the last error to ERROR_SUCCESS if successful. Windows
     538//      does not do this either!
    476539//******************************************************************************
    477540BOOL WIN32API VirtualFree(LPVOID lpvAddress,
     
    481544    DWORD rc;
    482545
    483     SetLastError(ERROR_SUCCESS);
    484 
    485546    // verify parameters
    486547    if((FreeType & MEM_RELEASE) && (cbSize != 0))
     
    496557        SetLastError(ERROR_INVALID_PARAMETER);
    497558        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;
    498568    }
    499569
     
    579649    }
    580650    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);
    608654
    609655    dprintf(("New memory flags %X\n", pageFlags));
     
    658704
    659705    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    }
    660713    if(rc)
    661714    {
     
    672725    pmbiBuffer->RegionSize  = (cbRangeSize + 0xFFF) & 0xFFFFF000;
    673726
    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);
    704728
    705729    //TODO: This is not correct: AllocationProtect should contain the protection
    706730    //      flags used in the initial call to VirtualAlloc
    707731    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    }
    710736    dprintf(("Memory region alloc base          0x%08x", pmbiBuffer->AllocationBase));
    711737    dprintf(("Memory region alloc protect flags %x", pmbiBuffer->AllocationProtect));
     
    725751    return TRUE;
    726752}
    727 
     753//******************************************************************************
    728754//******************************************************************************
    729755BOOL WIN32API VirtualUnlock(LPVOID lpAddress, DWORD dwSize)
     
    802828
    803829//******************************************************************************
    804 //SvL: Private api
     830// Private Odin api
    805831//******************************************************************************
    806832LPVOID VirtualAllocShared(DWORD cbSize, DWORD  fdwAllocationType,
     
    828854  }
    829855
     856  //Translate windows page attributes (flag is reset to 0!!)
     857  TranslateWinPageAttr(fdwProtect, &flag);
     858
    830859  if(fdwAllocationType & MEM_COMMIT)
    831860  {
    832861        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;
    848863  }
    849864
     
    867882  return(Address);
    868883}
     884//******************************************************************************
     885//******************************************************************************
Note: See TracChangeset for help on using the changeset viewer.