Ignore:
Timestamp:
Nov 6, 2006, 5:48:53 AM (19 years ago)
Author:
bird
Message:

More debugging.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/kLdr/kLdrModPE.c

    r2858 r2859  
    193193        ||  (   s.FileHdr.SizeOfOptionalHeader != sizeof(IMAGE_OPTIONAL_HEADER32)
    194194             && s.FileHdr.SizeOfOptionalHeader != sizeof(IMAGE_OPTIONAL_HEADER64))
     195        ||  !(s.FileHdr.Characteristics & IMAGE_FILE_EXECUTABLE_IMAGE)
    195196       )
    196197        return KLDR_ERR_PE_BAD_FILE_HEADER;
     
    241242    }
    242243    pMod->enmFmt = KLDRFMT_PE;
     244    if (s.FileHdr.Characteristics & IMAGE_FILE_DLL)
     245        pMod->enmType = s.FileHdr.Characteristics & IMAGE_FILE_RELOCS_STRIPPED
     246            ? KLDRTYPE_SHARED_LIBRARY_RELOCATABLE
     247            : KLDRTYPE_SHARED_LIBRARY_FIXED;
     248    else
     249        pMod->enmType = s.FileHdr.Characteristics & IMAGE_FILE_RELOCS_STRIPPED
     250            ? KLDRTYPE_EXECUTABLE_RELOCATABLE
     251            : KLDRTYPE_EXECUTABLE_FIXED;
    243252    pMod->u32Magic = 0;     /* set upon success. */
    244253
     
    286295    pMod->aSegments[0].pchName = "TheHeaders";
    287296    pMod->aSegments[0].cchName = sizeof("TheHeaders") - 1;
     297    pMod->aSegments[0].enmProt = KLDRPROT_READONLY;
    288298    pMod->aSegments[0].cb = pModPE->Hdrs.OptionalHeader.SizeOfHeaders;
     299    pMod->aSegments[0].Alignment = pModPE->Hdrs.OptionalHeader.SectionAlignment;
    289300    pMod->aSegments[0].LinkAddress = pModPE->Hdrs.OptionalHeader.ImageBase;
    290     pMod->aSegments[0].MapAddress = NIL_KLDRADDR;
    291     pMod->aSegments[0].enmProt = KLDRPROT_READONLY;
     301    pMod->aSegments[0].offFile = 0;
     302    pMod->aSegments[0].cbFile = pModPE->Hdrs.OptionalHeader.SizeOfHeaders;
     303    pMod->aSegments[0].RVA = 0;
     304    if (pMod->cSegments > 1)
     305        pMod->aSegments[0].cbMapped = pModPE->aShdrs[0].VirtualAddress;
     306    else
     307        pMod->aSegments[0].cbMapped = pModPE->Hdrs.OptionalHeader.SizeOfHeaders;
     308    pMod->aSegments[0].MapAddress = 0;
    292309
    293310    /* The section headers. */
     
    295312    {
    296313        char *pch;
     314
     315        /* unused */
    297316        pMod->aSegments[i + 1].pvUser = NULL;
     317        pMod->aSegments[i + 1].MapAddress = 0;
     318
     319        /* name */
    298320        pMod->aSegments[i + 1].pchName = pch = &pModPE->aShdrs[i].Name[0];
    299321        cb = IMAGE_SIZEOF_SHORT_NAME;
     
    302324            cb--;
    303325        pMod->aSegments[i + 1].cchName = cb;
     326
     327        /* size and addresses */
    304328        if (!(pModPE->aShdrs[i].Characteristics & IMAGE_SCN_TYPE_NOLOAD))
    305329        {
    306             pMod->aSegments[i + 1].cb = pModPE->aShdrs[i].Misc.VirtualSize;
    307             pMod->aSegments[i + 1].LinkAddress = pModPE->aShdrs[i].VirtualAddress;
     330            pMod->aSegments[i + 1].cb          = pModPE->aShdrs[i].Misc.VirtualSize;
     331            pMod->aSegments[i + 1].LinkAddress = pModPE->aShdrs[i].VirtualAddress
     332                                               + pModPE->Hdrs.OptionalHeader.ImageBase;
     333            pMod->aSegments[i + 1].RVA         = pModPE->aShdrs[i].VirtualAddress;
     334            pMod->aSegments[i + 1].cbMapped    = pModPE->aShdrs[i].Misc.VirtualSize;
     335            if (i + 2 < pMod->cSegments)
     336                pMod->aSegments[i + 1].cbMapped= pModPE->aShdrs[i + 1].VirtualAddress
     337                                               - pModPE->aShdrs[i].VirtualAddress;
    308338        }
    309339        else
    310340        {
    311             pMod->aSegments[i + 1].cb = 0;
     341            pMod->aSegments[i + 1].cb          = 0;
     342            pMod->aSegments[i + 1].cbMapped    = 0;
    312343            pMod->aSegments[i + 1].LinkAddress = NIL_KLDRADDR;
     344            pMod->aSegments[i + 1].RVA         = 0;
    313345        }
    314         pMod->aSegments[i + 1].MapAddress = NIL_KLDRADDR;
     346
     347        /* file location */
     348        pMod->aSegments[i + 1].offFile = pModPE->aShdrs[i].PointerToRawData;
     349        pMod->aSegments[i + 1].cbFile = pModPE->aShdrs[i].SizeOfRawData;
     350        if (    pMod->aSegments[i + 1].cbMapped > 0 /* if mapped */
     351            &&  (KLDRSIZE)pMod->aSegments[i + 1].cbFile > pMod->aSegments[i + 1].cbMapped)
     352            pMod->aSegments[i + 1].cbFile = pMod->aSegments[i + 1].cbMapped;
     353
     354        /* protection */
    315355        switch (  pModPE->aShdrs[i].Characteristics
    316356                & (IMAGE_SCN_MEM_SHARED | IMAGE_SCN_MEM_EXECUTE | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE))
     
    349389                break;
    350390        }
     391
     392        /* alignment. */
    351393        switch (pModPE->aShdrs[i].Characteristics & IMAGE_SCN_ALIGN_MASK)
    352394        {
    353             default: kldrHlpAssert(0);
    354             case 0:                             pMod->aSegments[i + 1].Alignment = 0; break;
     395            case 0: /* hope this is right... */
     396                pMod->aSegments[i + 1].Alignment = pModPE->Hdrs.OptionalHeader.SectionAlignment;
     397                break;
    355398            case IMAGE_SCN_ALIGN_1BYTES:        pMod->aSegments[i + 1].Alignment = 1; break;
    356399            case IMAGE_SCN_ALIGN_2BYTES:        pMod->aSegments[i + 1].Alignment = 2; break;
     
    367410            case IMAGE_SCN_ALIGN_4096BYTES:     pMod->aSegments[i + 1].Alignment = 4096; break;
    368411            case IMAGE_SCN_ALIGN_8192BYTES:     pMod->aSegments[i + 1].Alignment = 8192; break;
     412            default: kldrHlpAssert(0);          pMod->aSegments[i + 1].Alignment = 0; break;
    369413        }
    370414    }
     
    558602     * Get bits.
    559603     */
    560     if (!*ppvBits)
     604    if (ppvBits && !*ppvBits)
    561605    {
    562606        if (pModPE->pvMapping)
     
    576620
    577621/** @copydoc kLdrModQuerySymbol */
    578 static int kldrModPEQuerySymbol(PKLDRMOD pMod, const void *pvBits, KLDRADDR BaseAddress, uint32_t uSymbol,
     622static int kldrModPEQuerySymbol(PKLDRMOD pMod, const void *pvBits, KLDRADDR BaseAddress, uint32_t iSymbol,
    579623                                const char *pszSymbol, PFNKLDRMODGETIMPORT pfnGetForwarder, void *pvUser,
    580624                                PKLDRADDR puValue, uint32_t *pfKind)
     
    605649         * Simple, calculate the unbased ordinal and bounds check it.
    606650         */
    607         iExpOrd = uSymbol - pExpDir->Base;
     651        iExpOrd = iSymbol - pExpDir->Base;
    608652        if (iExpOrd >= KLDR_MAX(pExpDir->NumberOfNames, pExpDir->NumberOfFunctions))
    609653            return KLDR_ERR_SYMBOL_NOT_FOUND;
     
    702746    uint32_t        cchImpModule;
    703747    const char     *pszSymbol;
    704     uint32_t        uSymbol;
     748    uint32_t        iSymbol;
    705749    int             rc;
    706750
     
    738782
    739783        /* ascii to integer */
    740         uSymbol = 0;
     784        iSymbol = 0;
    741785        for (;;)
    742786        {
     
    757801
    758802            /* insert the digit */
    759             uSymbol *= uBase;
    760             uSymbol += uDigit;
     803            iSymbol *= uBase;
     804            iSymbol += uDigit;
    761805        }
    762806
     
    764808    }
    765809    else
    766         uSymbol = NIL_KLDRMOD_SYM_ORDINAL; /* no ordinal number. */
     810        iSymbol = NIL_KLDRMOD_SYM_ORDINAL; /* no ordinal number. */
    767811
    768812
     
    798842             * Now the rest is up to the callback (almost).
    799843             */
    800             rc = pfnGetForwarder(pModPE->pMod, iImpModule, uSymbol, pszSymbol, puValue, pfKind, pvUser);
     844            rc = pfnGetForwarder(pModPE->pMod, iImpModule, iSymbol, pszSymbol, puValue, pfKind, pvUser);
    801845            if (!rc && pfKind)
    802846                *pfKind |= KLDRSYMKIND_FORWARDER;
     
    831875    if (    pModPE->Hdrs.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].Size
    832876        <   sizeof(IMAGE_EXPORT_DIRECTORY))
    833         return KLDR_ERR_SYMBOL_NOT_FOUND;
     877        return 0; /* no exports to enumerate, return success. */
     878
    834879    pExpDir = KLDRMODPE_RVA2TYPE(pvBits,
    835880                                 pModPE->Hdrs.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress,
     
    863908        for (iName = 0; iName < cNames; iName++)
    864909        {
    865             if (!paOrdinals[iName] != iFunction)
     910            if (paOrdinals[iName] != iFunction)
    866911                continue;
    867912            fFoundName = 1;
    868             rc = pfnCallback(pMod, iName + pExpDir->Base, KLDRMODPE_RVA2TYPE(pvBits, paRVANames[iName], const char *),
     913            rc = pfnCallback(pMod, iFunction + pExpDir->Base, KLDRMODPE_RVA2TYPE(pvBits, paRVANames[iName], const char *),
    869914                             uValue, fKind, pvUser);
    870915            if (rc)
     
    877922        if (!fFoundName)
    878923        {
    879             rc = pfnCallback(pMod, iName + pExpDir->Base, NULL, uValue, fKind, pvUser);
     924            rc = pfnCallback(pMod, iFunction + pExpDir->Base, NULL, uValue, fKind, pvUser);
    880925            if (rc)
    881926                return rc;
     
    9581003            while (pImpDesc->Name && pImpDesc->FirstThunk)
    9591004            {
    960                 pModPE->cImportModules = 0;
     1005                pModPE->cImportModules++;
    9611006                pImpDesc++;
    9621007            }
Note: See TracChangeset for help on using the changeset viewer.