Ignore:
Timestamp:
Jul 13, 2002, 6:30:40 PM (23 years ago)
Author:
sandervl
Message:

Disabled 64kb alignment in VirtualAlloc for now

File:
1 edited

Legend:

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

    r8864 r8866  
    1 /* $Id: virtual.cpp,v 1.46 2002-07-13 15:58:21 sandervl Exp $ */
     1/* $Id: virtual.cpp,v 1.47 2002-07-13 16:30:40 sandervl Exp $ */
    22
    33/*
     
    329329  if(lpvAddress)
    330330  {
    331    Win32MemMap *map;
    332    ULONG offset, nrpages, accessflags = 0;
    333 
     331    Win32MemMap *map;
     332    ULONG offset, nrpages, accessflags = 0;
     333   
    334334    nrpages = cbSize >> PAGE_SHIFT;
    335335    if(cbSize & 0xFFF)
     
    519519                             DWORD* pfdwOldProtect)
    520520{
    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) {
    527527        dprintf(("WARNING: pfdwOldProtect == NULL"));
    528528        SetLastError(ERROR_INVALID_PARAMETER);
    529529        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) {
    536536        dprintf(("DosQueryMem returned %d\n", rc));
    537537        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))
    542542        *pfdwOldProtect |= PAGE_READONLY;
    543   if(pageFlags & (PAG_WRITE))
     543    if(pageFlags & (PAG_WRITE))
    544544        *pfdwOldProtect |= PAGE_READWRITE;
    545545
    546   if((pageFlags & (PAG_WRITE | PAG_EXECUTE)) == (PAG_WRITE | PAG_EXECUTE))
     546    if((pageFlags & (PAG_WRITE | PAG_EXECUTE)) == (PAG_WRITE | PAG_EXECUTE))
    547547        *pfdwOldProtect |= PAGE_EXECUTE_READWRITE;
    548   else
    549   if(pageFlags & PAG_EXECUTE)
     548    else
     549    if(pageFlags & PAG_EXECUTE)
    550550        *pfdwOldProtect |= PAGE_EXECUTE_READ;
    551551
    552   if(pageFlags & PAG_GUARD)
     552    if(pageFlags & PAG_GUARD)
    553553        *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)
    561561        pageFlags |= (PAG_EXECUTE | PAG_WRITE | PAG_READ);
    562   if(fdwNewProtect & PAGE_EXECUTE_WRITECOPY)
     562    if(fdwNewProtect & PAGE_EXECUTE_WRITECOPY)
    563563        pageFlags |= (PAG_EXECUTE | PAG_WRITE | PAG_READ);
    564   if(fdwNewProtect & PAGE_GUARD)        pageFlags |= PAG_GUARD;
     564    if(fdwNewProtect & PAGE_GUARD)        pageFlags |= PAG_GUARD;
    565565//Not supported in OS/2??
    566566//  if(fdwNewProtect & PAGE_NOACCESS)
    567567
    568   dprintf(("New memory flags %X\n", pageFlags));
    569   if(pageFlags == 0) {
     568    dprintf(("New memory flags %X\n", pageFlags));
     569    if(pageFlags == 0) {
    570570        dprintf(("pageFlags == 0\n"));
    571571        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 ) { // 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) {
     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) {
    590590        dprintf(("DosSetMem returned %d\n", rc));
    591591        return(FALSE);
    592   }
    593   return(TRUE);
     592    }
     593    return(TRUE);
    594594}
    595595//******************************************************************************
     
    670670    else
    671671    {
     672        pmbiBuffer->AllocationBase = 0;
    672673        while(lpBase > 0)
    673674        {
     
    685686        }
    686687    }
     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
    687706    dprintf(("Memory region alloc base          0x%08x", pmbiBuffer->AllocationBase));
    688707    dprintf(("Memory region alloc protect flags %x", pmbiBuffer->AllocationProtect));
Note: See TracChangeset for help on using the changeset viewer.