Changeset 2053 for trunk/src


Ignore:
Timestamp:
Dec 10, 1999, 3:06:12 PM (26 years ago)
Author:
sandervl
Message:

Memory map fixes

Location:
trunk/src/kernel32
Files:
8 edited

Legend:

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

    r1858 r2053  
    1 /* $Id: HandleManager.cpp,v 1.28 1999-11-27 12:48:25 achimha Exp $ */
     1/* $Id: HandleManager.cpp,v 1.29 1999-12-10 14:06:10 sandervl Exp $ */
    22
    33/*
     
    22982298  PHMHANDLEDATA   pHMHandleData;
    22992299  DWORD           rc;                                     /* API return code */
    2300 
     2300  HANDLE          hOldMemMap = -1;
    23012301
    23022302  pDeviceHandler = HMGlobals.pHMFileMapping;         /* device is predefined */
     
    23372337                                         dwMaximumSizeHigh,
    23382338                                         dwMaximumSizeLow,
    2339                                          lpName);
     2339                                         lpName, &hOldMemMap);
    23402340
    23412341  if (rc != NO_ERROR)     /* oops, creation failed within the device handler */
    23422342  {
    2343     TabWin32Handles[iIndexNew].hmHandleData.hHMHandle = INVALID_HANDLE_VALUE;
    2344     SetLastError(rc);          /* Hehe, OS/2 and NT are pretty compatible :) */
    2345     return (NULL);                                           /* signal error */
     2343        TabWin32Handles[iIndexNew].hmHandleData.hHMHandle = INVALID_HANDLE_VALUE;
     2344        SetLastError(rc);          /* Hehe, OS/2 and NT are pretty compatible :) */
     2345        if(rc == ERROR_ALREADY_EXISTS) {
     2346                return hOldMemMap; //return handle of existing file mapping
     2347        }
     2348        else    return (NULL);                                           /* signal error */
    23462349  }
    23472350  else
  • trunk/src/kernel32/hmdevice.cpp

    r2050 r2053  
    1 /* $Id: hmdevice.cpp,v 1.11 1999-12-09 19:08:26 sandervl Exp $ */
     1/* $Id: hmdevice.cpp,v 1.12 1999-12-10 14:06:11 sandervl Exp $ */
    22
    33/*
     
    983983                                         DWORD                      dwMaximumSizeHigh,
    984984                                         DWORD                      dwMaximumSizeLow,
    985                                          LPCTSTR                    lpName)
     985                                         LPCSTR lpName,   
     986                                         HFILE *hOldMap)  // if create an existing memmap, return handle of old one
    986987{
    987988  dprintf(("KERNEL32: HandleManager::DeviceHandler::CreateFileMapping(%08xh,%08xh,%08xh,%08xh,%08xh,%08xh,%s)\n",
  • trunk/src/kernel32/hmdevice.h

    r2050 r2053  
    1 /* $Id: hmdevice.h,v 1.12 1999-12-09 19:08:27 sandervl Exp $ */
     1/* $Id: hmdevice.h,v 1.13 1999-12-10 14:06:11 sandervl Exp $ */
    22
    33/*
     
    265265                                     DWORD                      dwMaximumSizeHigh,
    266266                                     DWORD                      dwMaximumSizeLow,
    267                                      LPCSTR                     lpName);
     267                                     LPCSTR                     lpName,
     268                                     HFILE                     *hOldMap);
    268269
    269270                  /* this is a handler method for calls to OpenFileMapping() */
  • trunk/src/kernel32/hmmmap.cpp

    r1914 r2053  
    1 /* $Id: hmmmap.cpp,v 1.8 1999-12-01 10:47:51 sandervl Exp $ */
     1/* $Id: hmmmap.cpp,v 1.9 1999-12-10 14:06:11 sandervl Exp $ */
    22
    33/*
     
    5353                                             DWORD size_high, /* [in] High-order 32 bits of object size */
    5454                                             DWORD size_low,  /* [in] Low-order 32 bits of object size */
    55                                              LPCSTR name)     /* [in] Name of file-mapping object */
     55                                             LPCSTR name,     /* [in] Name of file-mapping object */
     56                                             HFILE *hOldMap)  // if create an existing memmap, return handle of old one
    5657{
    5758 Win32MemMap *map;
     
    9192        //Is it allowed to open an existing view with different flags?
    9293        //(i.e. write access to readonly object)
     94        //Return handle of existing file mapping
     95        dprintf(("CreateFileMapping: Return handle of existing file mapping %s", name));
     96        map->AddRef();
     97        *hOldMap = map->getMapHandle();
     98        return ERROR_ALREADY_EXISTS;
    9399  }
    94100  else {
  • trunk/src/kernel32/hmmmap.h

    r678 r2053  
    1 /* $Id: hmmmap.h,v 1.3 1999-08-25 10:28:40 sandervl Exp $ */
     1/* $Id: hmmmap.h,v 1.4 1999-12-10 14:06:11 sandervl Exp $ */
    22
    33/*
     
    4141                                     DWORD                      dwMaximumSizeHigh,
    4242                                     DWORD                      dwMaximumSizeLow,
    43                                      LPCSTR                     lpName);
     43                                     LPCSTR                     lpName,
     44                                     HFILE                     *hOldMap);
    4445
    4546  /* this is a handler method for calls to OpenFileMapping() */
  • trunk/src/kernel32/makefile

    r2044 r2053  
    1 # $Id: makefile,v 1.69 1999-12-09 11:59:28 sandervl Exp $
     1# $Id: makefile,v 1.70 1999-12-10 14:06:12 sandervl Exp $
    22
    33#
     
    178178
    179179hmdevio.OBJ: \
     180    .\hmdevice.h \
    180181    .\hmdevio.cpp \
    181182    exceptutil.h \
     
    297298hmcomm.obj: \
    298299        .\hmcomm.cpp \
     300        .\hmdevice.h \
    299301        .\hmcomm.h \
    300302        $(PDWIN32_INCLUDE)\handlemanager.h
  • trunk/src/kernel32/mmap.cpp

    r2032 r2053  
    1 /* $Id: mmap.cpp,v 1.26 1999-12-09 00:52:21 sandervl Exp $ */
     1/* $Id: mmap.cpp,v 1.27 1999-12-10 14:06:12 sandervl Exp $ */
    22
    33/*
     
    174174 DWORD pageAddr         = (DWORD)lpPageFaultAddr & ~0xFFF;
    175175 DWORD oldProt, newProt, nrBytesRead, size;
     176 int i;
    176177
    177178//  mapMutex.enter();
     
    184185  dprintf(("Win32MemMap::commitPage %x (faultaddr %x)", pageAddr, lpPageFaultAddr));
    185186  if(hMemFile != -1) {
    186         if(VirtualQuery((LPSTR)pageAddr, &memInfo, nrpages*PAGE_SIZE) == 0) {
    187                 dprintf(("Win32MemMap::commitPage: VirtualQuery (%x,%x) failed for %x", pageAddr, nrpages*PAGE_SIZE));
    188                 goto fail;
    189         }
    190         //Only changes the state of the pages with the same attribute flags
    191         //(returned in memInfo.RegionSize)
    192         //If it's smaller than the mNrPages, it simply means one or more of the
    193         //other pages have already been committed
    194         if(memInfo.State & MEM_COMMIT)
    195         {//if it's already committed, then the app tried to write to it
    196                 if(!fWriteAccess) {
    197                         dprintf(("Win32MemMap::commitPage: Huh? Already committed and not trying to write (%x,%x) failed for %x", pageAddr, memInfo.RegionSize));
     187//      for(i=0;i<nrpages;i++) {
     188                if(VirtualQuery((LPSTR)pageAddr, &memInfo, nrpages*PAGE_SIZE) == 0) {
     189                        dprintf(("Win32MemMap::commitPage: VirtualQuery (%x,%x) failed for %x", pageAddr, nrpages*PAGE_SIZE));
    198190                        goto fail;
    199191                }
    200                 if(VirtualProtect((LPVOID)pageAddr, memInfo.RegionSize, newProt, &oldProt) == FALSE) {
    201                         dprintf(("Win32MemMap::commitPage: Failed to set write flag on page (%x,%x) failed for %x", pageAddr, memInfo.RegionSize));
    202                         goto fail;
    203                 }
    204         }
    205         else {
    206                 if(VirtualAlloc((LPVOID)pageAddr, memInfo.RegionSize, MEM_COMMIT, PAGE_READWRITE) == FALSE) {
    207                         goto fail;
    208                 }
    209                 offset = pageAddr - (ULONG)pMapping;
    210                 size   = memInfo.RegionSize;
    211                 if(offset + size > mSize) {
    212                         dprintf(("Adjusting size from %d to %d", size, mSize - offset));
    213                         size = mSize - offset;
    214                 }
    215                 if(SetFilePointer(hMemFile, offset, NULL, FILE_BEGIN) != offset) {
    216                         dprintf(("Win32MemMap::commitPage: SetFilePointer failed to set pos to %x", offset));
    217                         goto fail;
    218                 }
    219                 if(ReadFile(hMemFile, (LPSTR)pageAddr, size, &nrBytesRead, NULL) == FALSE) {
    220                         dprintf(("Win32MemMap::commitPage: ReadFile failed for %x", pageAddr));
    221                         goto fail;
    222                 }
    223                 if(nrBytesRead != size) {
    224                         dprintf(("Win32MemMap::commitPage: ReadFile didn't read all bytes for %x", pageAddr));
    225                         goto fail;
    226                 }
    227                 if(mProtFlags != PAGE_READWRITE) {
    228                         if(VirtualProtect((LPVOID)pageAddr, memInfo.RegionSize, newProt, &oldProt) == FALSE) {
     192                //Only changes the state of the pages with the same attribute flags
     193                //(returned in memInfo.RegionSize)
     194                //If it's smaller than the mNrPages, it simply means one or more of the
     195                //other pages have already been committed
     196                if(memInfo.State & MEM_COMMIT)
     197                {//if it's already committed, then the app tried to write to it
     198                        if(!fWriteAccess) {
     199                                dprintf(("Win32MemMap::commitPage: Huh? Already committed and not trying to write (%x,%x) failed for %x", pageAddr, memInfo.RegionSize));
    229200                                goto fail;
    230201                        }
    231                 }
    232         }
     202                        if(VirtualProtect((LPVOID)pageAddr, memInfo.RegionSize, newProt, &oldProt) == FALSE) {
     203                                dprintf(("Win32MemMap::commitPage: Failed to set write flag on page (%x,%x) failed for %x", pageAddr, memInfo.RegionSize));
     204                                goto fail;
     205                        }
     206                }
     207                else {
     208                        if(VirtualAlloc((LPVOID)pageAddr, memInfo.RegionSize, MEM_COMMIT, PAGE_READWRITE) == FALSE) {
     209                                goto fail;
     210                        }
     211                        offset = pageAddr - (ULONG)pMapping;
     212                        size   = memInfo.RegionSize;
     213                        if(offset + size > mSize) {
     214                                dprintf(("Adjusting size from %d to %d", size, mSize - offset));
     215                                size = mSize - offset;
     216                        }
     217                        if(SetFilePointer(hMemFile, offset, NULL, FILE_BEGIN) != offset) {
     218                                dprintf(("Win32MemMap::commitPage: SetFilePointer failed to set pos to %x", offset));
     219                                goto fail;
     220                        }
     221                        if(ReadFile(hMemFile, (LPSTR)pageAddr, size, &nrBytesRead, NULL) == FALSE) {
     222                                dprintf(("Win32MemMap::commitPage: ReadFile failed for %x", pageAddr));
     223                                goto fail;
     224                        }
     225                        if(nrBytesRead != size) {
     226                                dprintf(("Win32MemMap::commitPage: ReadFile didn't read all bytes for %x", pageAddr));
     227                                goto fail;
     228                        }
     229                        if(mProtFlags != PAGE_READWRITE) {
     230                                if(VirtualProtect((LPVOID)pageAddr, memInfo.RegionSize, newProt, &oldProt) == FALSE) {
     231                                        goto fail;
     232                                }
     233                        }
     234                }
     235//              pageAddr += PAGE_SIZE;
     236//      }
    233237  }
    234238  else {
    235         if(VirtualQuery((LPSTR)pageAddr, &memInfo, nrpages*PAGE_SIZE) == 0) {
    236                 dprintf(("Win32MemMap::commitPage: VirtualQuery (%x,%x) failed for %x", pageAddr, nrpages*PAGE_SIZE));
    237                 goto fail;
    238         }
    239         if(!(memInfo.State & MEM_COMMIT))
    240         {//if it's already committed, then the app tried to write to it
    241                 if(VirtualAlloc((LPVOID)pageAddr, memInfo.RegionSize, MEM_COMMIT, newProt) == FALSE)
     239        for(i=0;i<nrpages;i++) {
     240                if(VirtualQuery((LPSTR)pageAddr, &memInfo, PAGE_SIZE) == 0) {
     241                        dprintf(("Win32MemMap::commitPage: VirtualQuery (%x,%x) failed for %x", pageAddr, PAGE_SIZE));
    242242                        goto fail;
    243         }
     243                }
     244                if(!(memInfo.State & MEM_COMMIT))
     245                {//if it's already committed, then the app tried to write to it
     246                        if(VirtualAlloc((LPVOID)pageAddr, memInfo.RegionSize, MEM_COMMIT, newProt) == FALSE)
     247                                goto fail;
     248                }
     249                pageAddr += PAGE_SIZE;
     250        }
    244251  }
    245252
  • trunk/src/kernel32/wprocess.cpp

    r2007 r2053  
    1 /* $Id: wprocess.cpp,v 1.56 1999-12-07 12:28:41 sandervl Exp $ */
     1/* $Id: wprocess.cpp,v 1.57 1999-12-10 14:06:12 sandervl Exp $ */
    22
    33/*
     
    339339  if(module) {
    340340        module->AddRef();
     341        dprintf(("iLoadLibrary: found %s -> handle %x", lpszLibFile, module->getInstanceHandle()));
    341342        return module->getInstanceHandle();
    342343  }
Note: See TracChangeset for help on using the changeset viewer.