Ignore:
Timestamp:
Feb 23, 2000, 12:53:03 AM (26 years ago)
Author:
sandervl
Message:

Fixed bug in commitPage (winimagepeldr.cpp)

File:
1 edited

Legend:

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

    r2859 r2863  
    1 /* $Id: winimagepeldr.cpp,v 1.32 2000-02-22 19:12:53 sandervl Exp $ */
     1/* $Id: winimagepeldr.cpp,v 1.33 2000-02-22 23:53:03 sandervl Exp $ */
    22
    33/*
     
    1919 *
    2020 */
    21 #define DEBUG
    2221#define INCL_DOSFILEMGR          /* File Manager values      */
    2322#define INCL_DOSMODULEMGR
     
    570569 APIRET   rc;
    571570
    572   rc = DosQueryMem((PVOID)virtAddress, &range, &attr);
    573   if(rc) {
    574         dprintf((LOG, "Win32PeLdrImage::commitPage: DosQueryMem for %x returned %d", virtAddress, rc));
    575         return FALSE;
    576   }
    577   if(attr & PAG_COMMIT) {
    578         dprintf((LOG, "Win32PeLdrImage::commitPage: Memory at 0x%x already committed!", virtAddress));
    579         return FALSE;
    580   }
    581 
    582571  section = findSectionByOS2Addr(virtAddress);
    583572  if(section == NULL) {
     
    587576        section = findPreviousSectionByOS2Addr(virtAddress);
    588577        if(section == NULL) {//access to header
     578                offset     = 0;
    589579                fileoffset = virtAddress - realBaseAddress;
    590580        }
    591581        else {
    592                 offset = virtAddress - (section->realvirtaddr + section->virtualsize);
     582                offset     = virtAddress - (section->realvirtaddr + section->virtualsize);
    593583                fileoffset = section->rawoffset + section->rawsize + offset;
    594584        }
     
    598588        offset      = virtAddress - section->realvirtaddr;
    599589        sectionsize = section->virtualsize - offset;
     590
    600591        if(offset > section->rawsize || section->type == SECTION_UNINITDATA) {
    601592                //unintialized data (set to 0)
     
    612603        }
    613604  }
     605  //Check range of pages with the same attributes starting at virtAddress
     606  //(some pages might already have been loaded)
     607  range = sectionsize;
     608  rc = DosQueryMem((PVOID)virtAddress, &range, &attr);
     609  if(rc) {
     610        dprintf((LOG, "Win32PeLdrImage::commitPage: DosQueryMem for %x returned %d", virtAddress, rc));
     611        return FALSE;
     612  }
     613  if(attr & PAG_COMMIT) {
     614        dprintf((LOG, "Win32PeLdrImage::commitPage: Memory at 0x%x already committed!", virtAddress));
     615        return FALSE;
     616  }
     617
    614618  if(fPageCmd == SINGLE_PAGE) {
    615619        size = min(size, PAGE_SIZE);
     
    782786  realBaseAddress = 0;
    783787
    784 #if 1
    785788  //Allocated in peldr.dll
    786789  if(reservedMem && reservedMem == oh.ImageBase) {
     
    788791        return TRUE;
    789792  }
    790 #else
    791   if(reservedMem && reservedMem <= oh.ImageBase &&
    792      ((oh.ImageBase - reservedMem) + imageSize < PELDR_RESERVEDMEMSIZE))
    793   {
    794         //ok, it fits perfectly; free it now and allocate it below
    795         DosFreeMem((PVOID)reservedMem);
    796 //              realBaseAddress = oh.ImageBase;
    797 //      return TRUE;
    798   }
    799 #endif
    800793
    801794  //Reserve enough space to store 4096 pointers to 1MB memory chunks
     
    903896
    904897  virtAddress -= realBaseAddress;
    905 
     898  //round size to next page boundary
     899  size  = (size-1) & ~0xFFF;
     900  size += PAGE_SIZE;
     901 
    906902  if(prel) {
    907903        j = 1;
     
    971967                                DosSetMem((PVOID)newpage, PAGE_SIZE, section->pageflags);
    972968                        }
    973 
    974969                }
    975970                prel = (PIMAGE_BASE_RELOCATION)((char*)prel + prel->SizeOfBlock);
Note: See TracChangeset for help on using the changeset viewer.