Ignore:
Timestamp:
Jul 1, 2000, 11:50:55 AM (25 years ago)
Author:
sandervl
Message:

memory map fixes

File:
1 edited

Legend:

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

    r3609 r3782  
    1 /* $Id: mmap.cpp,v 1.41 2000-05-26 18:42:55 sandervl Exp $ */
     1/* $Id: mmap.cpp,v 1.42 2000-07-01 09:50:55 sandervl Exp $ */
    22
    33/*
     
    197197
    198198  dprintf(("Win32MemMap::commitPage %x (faultaddr %x)", pageAddr, lpPageFaultAddr));
    199   if(hMemFile != -1) {
    200 //      for(i=0;i<nrpages;i++) {
     199  if(hMemFile != -1)
     200  {
     201        int faultsize = nrpages*PAGE_SIZE;
     202
     203        offset = pageAddr - (ULONG)pMapping;
     204        if(offset + faultsize > mSize) {
     205                faultsize = mSize - offset;
     206        }
     207
     208        while(faultsize) {
    201209                if(VirtualQuery((LPSTR)pageAddr, &memInfo, sizeof(MEMORY_BASIC_INFORMATION)) == 0) {
    202210                        dprintf(("Win32MemMap::commitPage: VirtualQuery (%x,%x) failed for %x", pageAddr, nrpages*PAGE_SIZE));
    203211                        goto fail;
    204212                }
    205                 memInfo.RegionSize = min(memInfo.RegionSize, nrpages*PAGE_SIZE);
     213                memInfo.RegionSize = min(memInfo.RegionSize, faultsize);
    206214                //Only changes the state of the pages with the same attribute flags
    207215                //(returned in memInfo.RegionSize)
    208216                //If it's smaller than the mNrPages, it simply means one or more of the
    209217                //other pages have already been committed
    210                 if(memInfo.State & MEM_COMMIT)
    211                 {//if it's already committed, then the app tried to write to it
    212                         if(!fWriteAccess) {
    213                                 dprintf(("Win32MemMap::commitPage: Huh? Already committed and not trying to write (%x,%x) failed for %x", pageAddr, memInfo.RegionSize));
    214                                 goto fail;
    215                         }
    216                         if(VirtualProtect((LPVOID)pageAddr, memInfo.RegionSize, newProt, &oldProt) == FALSE) {
    217                                 dprintf(("Win32MemMap::commitPage: Failed to set write flag on page (%x,%x) failed for %x", pageAddr, memInfo.RegionSize));
    218                                 goto fail;
    219                         }
    220                 }
    221                 else {
     218                if(!(memInfo.State & MEM_COMMIT))
     219                {
    222220                        if(VirtualAlloc((LPVOID)pageAddr, memInfo.RegionSize, MEM_COMMIT, PAGE_READWRITE) == FALSE) {
    223221                                goto fail;
     
    243241                                }
    244242                        }
    245                         if(mProtFlags != PAGE_READWRITE) {
     243                        if(newProt != PAGE_READWRITE) {
    246244                                if(VirtualProtect((LPVOID)pageAddr, memInfo.RegionSize, newProt, &oldProt) == FALSE) {
    247245                                        goto fail;
     
    249247                        }
    250248                }
    251 //              pageAddr += PAGE_SIZE;
    252 //      }
     249                faultsize -= memInfo.RegionSize;
     250                pageAddr  += memInfo.RegionSize;
     251        }
    253252  }
    254253  else {
    255254        ULONG sizeleft = nrpages*PAGE_SIZE;
    256         while(sizeleft) {
    257 
     255        while(sizeleft)
     256        {
    258257                if(VirtualQuery((LPSTR)pageAddr, &memInfo, sizeof(MEMORY_BASIC_INFORMATION)) == 0) {
    259258                        dprintf(("Win32MemMap::commitPage: VirtualQuery (%x,%x) failed", pageAddr, sizeleft));
Note: See TracChangeset for help on using the changeset viewer.