Changeset 3782 for trunk/src


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

memory map fixes

Location:
trunk/src/kernel32
Files:
2 edited

Legend:

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

    r3765 r3782  
    1 /* $Id: hmfile.cpp,v 1.7 2000-06-28 18:08:34 sandervl Exp $ */
     1/* $Id: hmfile.cpp,v 1.8 2000-07-01 09:50:54 sandervl Exp $ */
    22
    33/*
     
    425425  //SvL: DosRead doesn't like writing to memory addresses returned by
    426426  //     DosAliasMem -> search for original memory mapped pointer and use
    427   //     that one
    428   map = Win32MemMapView::findMapByView((ULONG)lpBuffer, &offset, MEMMAP_ACCESS_READ);
     427  //     that one + commit pages if not already present
     428  map = Win32MemMapView::findMapByView((ULONG)lpBuffer, &offset, MEMMAP_ACCESS_WRITE);
    429429  if(map) {
    430430        lpRealBuf = (LPVOID)((ULONG)map->getMappingAddr() + offset);
     
    432432        if(offset & 0xfff)
    433433                nrpages++;
    434         else
    435434        if(nNumberOfBytesToRead & 0xfff)
    436435                nrpages++;
     
    519518                                    LPOVERLAPPED  lpOverlapped)
    520519{
    521   BOOL bRC;
     520  LPVOID       lpRealBuf;
     521  Win32MemMap *map;
     522  DWORD        offset;
     523  BOOL         bRC;
    522524
    523525  dprintfl(("KERNEL32: HMDeviceFileClass::WriteFile %s(%08x,%08x,%08x,%08x,%08x) - stub?\n",
     
    538540  }
    539541
     542  //SvL: DosWrite doesn't like reading from memory addresses returned by
     543  //     DosAliasMem -> search for original memory mapped pointer and use
     544  //     that one + commit pages if not already present
     545  map = Win32MemMapView::findMapByView((ULONG)lpBuffer, &offset, MEMMAP_ACCESS_READ);
     546  if(map) {
     547        lpRealBuf = (LPVOID)((ULONG)map->getMappingAddr() + offset);
     548        DWORD nrpages = nNumberOfBytesToWrite/4096;
     549        if(offset & 0xfff)
     550                nrpages++;
     551        if(nNumberOfBytesToWrite & 0xfff)
     552                nrpages++;
     553
     554        map->commitPage(offset & ~0xfff, TRUE, nrpages);
     555  }
     556  else  lpRealBuf = (LPVOID)lpBuffer;
     557
    540558  if(pHMHandleData->dwFlags & FILE_FLAG_OVERLAPPED) {
    541559        dprintf(("ERROR: Overlapped IO not yet implememented!!"));
     
    543561//  else {
    544562        bRC = OSLibDosWrite(pHMHandleData->hHMHandle,
    545                             (PVOID)lpBuffer,
     563                            (PVOID)lpRealBuf,
    546564                            nNumberOfBytesToWrite,
    547565                            lpNumberOfBytesWritten);
  • 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.