Ignore:
Timestamp:
Mar 31, 2001, 1:59:09 AM (24 years ago)
Author:
sandervl
Message:

Fix for loading executable with sections not starting on page boundary (LOAD_LIBRARY_AS_DATAFILE)

File:
1 edited

Legend:

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

    r5332 r5408  
    1 /* $Id: winimagepeldr.cpp,v 1.70 2001-03-19 19:27:13 sandervl Exp $ */
     1/* $Id: winimagepeldr.cpp,v 1.71 2001-03-30 23:59:09 sandervl Exp $ */
    22
    33/*
     
    410410        if(GetSectionHdrByImageDir(win32file, IMAGE_DIRECTORY_ENTRY_RESOURCE, &sh))
    411411        {
     412            dprintf((LOG, "*************************PE SECTIONS START**************************" ));
     413            dprintf((LOG, "Raw data size:        %x", sh.SizeOfRawData ));
     414            dprintf((LOG, "Virtual Address:      %x", sh.VirtualAddress ));
     415            dprintf((LOG, "Virtual Address Start:%x", sh.VirtualAddress+oh.ImageBase ));
     416            dprintf((LOG, "Virtual Address End:  %x", sh.VirtualAddress+oh.ImageBase+sh.Misc.VirtualSize ));
     417            dprintf((LOG, "Virtual Size:         %x", sh.Misc.VirtualSize ));
     418            dprintf((LOG, "Pointer to raw data:  %x", sh.PointerToRawData ));
     419            dprintf((LOG, "Section flags:        %x\n\n", sh.Characteristics ));
    412420            addSection(SECTION_RESOURCE, sh.PointerToRawData,
    413421                       sh.SizeOfRawData, sh.VirtualAddress + oh.ImageBase,
     
    447455    }
    448456
    449     if(realBaseAddress != oh.ImageBase) {
     457    if(realBaseAddress != oh.ImageBase && !(dwFlags & FLAG_PELDR_LOADASDATAFILE)) {
    450458        pFixups     = (PIMAGE_BASE_RELOCATION)ImageDirectoryOffset(win32file, IMAGE_DIRECTORY_ENTRY_BASERELOC);
    451459        dwFixupSize = ImageDirectorySize(win32file, IMAGE_DIRECTORY_ENTRY_BASERELOC);
     
    684692 Section *section;
    685693 ULONG    offset, size, sectionsize, protflags, fileoffset, range, attr;
    686  ULONG    ulNewPos, ulRead;
     694 ULONG    ulNewPos, ulRead, orgVirtAddress = virtAddress;
    687695 APIRET   rc;
    688696
     
    691699
    692700    section = findSectionByOS2Addr(virtAddress);
     701    if(section == NULL) {
     702        section = findSectionByOS2Addr(orgVirtAddress);
     703        if(section) {
     704            virtAddress = orgVirtAddress;
     705        }
     706    }
    693707    if(section == NULL) {
    694708        size        = 4096;
Note: See TracChangeset for help on using the changeset viewer.