Ignore:
Timestamp:
Nov 4, 2006, 3:30:19 AM (19 years ago)
Author:
bird
Message:

More code.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/kLdr/kLdrModPE.c

    r2854 r2855  
    9999static int kldrModPEQueryForwarder(PKLDRMODPE pModPE, const void *pvBits, const char *pszForwarder,
    100100                                   PFNKLDRMODGETIMPORT pfnGetImport, void *pvUser, PKLDRADDR puValue, uint32_t *pfKind);
     101static int32_t kldrModPENumberOfImports(PKLDRMOD pMod, const void *pvBits);
    101102
    102103
     
    643644{
    644645    const IMAGE_IMPORT_DESCRIPTOR *paImpDir;
    645     uint32_t        cImpModules;
    646646    uint32_t        iImpModule;
    647647    uint32_t        cchImpModule;
     
    718718     * entry for the module... not sure if this is right though.
    719719     */
    720     cImpModules = pModPE->Hdrs.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].Size
    721                 / sizeof(IMAGE_IMPORT_DESCRIPTOR);
     720    if (    !pModPE->Hdrs.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].Size
     721        ||  !pModPE->Hdrs.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress)
     722        return KLDR_ERR_PE_FORWARDER_IMPORT_NOT_FOUND;
    722723    paImpDir = KLDRMODPE_RVA2TYPE(pvBits,
    723724                                  pModPE->Hdrs.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress,
    724725                                  const IMAGE_IMPORT_DESCRIPTOR *);
    725     for (iImpModule = 0; iImpModule < cImpModules; cImpModules++)
    726     {
    727         const char     *pszName = KLDRMODPE_RVA2TYPE(pvBits, paImpDir[iImpModule].Name, const char *);
    728         const size_t    cchName = kLdrHlpStrLen(pszName);
     726
     727    kldrModPENumberOfImports(pModPE->pMod, pvBits);
     728    for (iImpModule = 0; iImpModule < pModPE->cImportModules; iImpModule++)
     729    {
     730        const char *pszName = KLDRMODPE_RVA2TYPE(pvBits, paImpDir[iImpModule].Name, const char *);
     731        size_t      cchName = kLdrHlpStrLen(pszName);
    729732        if (    (   cchName == cchImpModule
    730733                 || (   cchName > cchImpModule
     
    736739            &&  kLdrHlpMemIComp(pszName, pszForwarder, cchImpModule)
    737740           )
    738             break;
    739     }
    740     if (iImpModule >= cImpModules)
    741         return KLDR_ERR_PE_FORWARDER_IMPORT_NOT_FOUND;
    742 
    743     /*
    744      * Now the rest is up to the callback (almost).
    745      */
    746     rc = pfnGetForwarder(pModPE->pMod, iImpModule, uSymbol, pszSymbol, puValue, pfKind, pvUser);
    747     if (!rc && pfKind)
    748         *pfKind |= KLDRSYMKIND_FORWARDER;
    749     return rc;
     741        {
     742            /*
     743             * Now the rest is up to the callback (almost).
     744             */
     745            rc = pfnGetForwarder(pModPE->pMod, iImpModule, uSymbol, pszSymbol, puValue, pfKind, pvUser);
     746            if (!rc && pfKind)
     747                *pfKind |= KLDRSYMKIND_FORWARDER;
     748            return rc;
     749        }
     750    }
     751    return KLDR_ERR_PE_FORWARDER_IMPORT_NOT_FOUND;
    750752}
    751753
     
    831833
    832834/** @copydoc kLdrModGetImport */
    833 int (* pfnGetImport)(PKLDRMOD pMod, void *pvBits, uint32_t iImport, const char *pszName, size_t cchName);
     835static int kldrModPEGetImport(PKLDRMOD pMod, void *pvBits, uint32_t iImport, char *pszName, size_t cchName)
     836{
     837    PKLDRMODPE                      pModPE = (PKLDRMODPE)pMod->pvData;
     838    const IMAGE_IMPORT_DESCRIPTOR  *pImpDesc;
     839    const char                     *pszImportName;
     840    size_t                          cchImportName;
     841    int                             rc;
     842
     843    /*
     844     * Make sure we've got mapped bits and resolve any base address aliases.
     845     */
     846    rc = kldrModPEBitsAndBaseAddress(pModPE, &pvBits, NULL);
     847    if (rc)
     848        return rc;
     849
     850    /*
     851     * Simple bounds check.
     852     */
     853    if (iImport >= (uint32_t)kldrModPENumberOfImports(pMod, pvBits))
     854        return KLDR_ERR_IMPORT_ORDINAL_OUT_OF_BOUNDS;
     855
     856    /*
     857     * Get the name.
     858     */
     859    pImpDesc = KLDRMODPE_RVA2TYPE(pvBits,
     860                                  pModPE->Hdrs.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress
     861                                  + sizeof(IMAGE_IMPORT_DESCRIPTOR) * iImport,
     862                                  const IMAGE_IMPORT_DESCRIPTOR *);
     863    pszImportName = KLDRMODPE_RVA2TYPE(pvBits, pImpDesc->Name, const char *);
     864    cchImportName = strlen(pszImportName);
     865    if (cchImportName < cchName)
     866    {
     867        kLdrHlpMemCopy(pszName, pszImportName, cchImportName + 1);
     868        rc = 0;
     869    }
     870    else
     871    {
     872        kLdrHlpMemCopy(pszName, pszImportName, cchName);
     873        if (cchName)
     874            pszName[cchName - 1] = '\0';
     875        rc = KLDR_ERR_BUFFER_OVERFLOW;
     876    }
     877
     878    return rc;
     879}
     880
     881
    834882/** @copydoc kLdrModNumberOfImports */
    835 int32_t (* pfnNumberOfImports)(PKLDRMOD pMod, void *pvBits);
    836 /** @copydoc kLdrModCanExecuteOn */
    837 int (* pfnCanExecuteOn)(PKLDRMOD pMod, void *pvBits, KLDRARCH enmArch, KLDRCPU enmCpu);
     883static int32_t kldrModPENumberOfImports(PKLDRMOD pMod, const void *pvBits)
     884{
     885    PKLDRMODPE pModPE = (PKLDRMODPE)pMod->pvData;
     886    if (pModPE->cImportModules == ~(uint32_t)0)
     887    {
     888        /*
     889         * We'll have to walk the import descriptors to figure out their number.
     890         * First, make sure we've got mapped bits and resolve any base address aliases.
     891         */
     892        if (kldrModPEBitsAndBaseAddress(pModPE, &pvBits, NULL))
     893            return -1;
     894        pModPE->cImportModules = 0;
     895        if (    pModPE->Hdrs.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].Size
     896            &&  pModPE->Hdrs.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress)
     897        {
     898            const IMAGE_IMPORT_DESCRIPTOR  *pImpDesc;
     899
     900            pImpDesc = KLDRMODPE_RVA2TYPE(pvBits,
     901                                          pModPE->Hdrs.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress,
     902                                          const IMAGE_IMPORT_DESCRIPTOR *);
     903            while (pImpDesc->Name && pImpDesc->FirstThunk)
     904            {
     905                pModPE->cImportModules = 0;
     906                pImpDesc++;
     907            }
     908        }
     909    }
     910    return pModPE->cImportModules;
     911}
     912
     913
    838914/** @copydoc kLdrModGetStackInfo */
    839 int (* pfnGetStackInfo)(PKLDRMOD pMod, void *pvBits, KLDRADDR BaseAddress, PKLDRSTACKINFO pStackInfo);
     915static int kldrModPEGetStackInfo(PKLDRMOD pMod, const void *pvBits, KLDRADDR BaseAddress, PKLDRSTACKINFO pStackInfo)
     916{
     917    PKLDRMODPE pModPE = (PKLDRMODPE)pMod->pvData;
     918
     919    pStackInfo->Address = NIL_KLDRADDR;
     920    pStackInfo->LinkAddress = NIL_KLDRADDR;
     921    pStackInfo->cbStack = pStackInfo->cbStackThread = pModPE->Hdrs.OptionalHeader.SizeOfStackReserve;
     922
     923    return 0;
     924}
     925
     926
    840927/** @copydoc kLdrModQueryMainEntrypoint */
    841 int (* pfnQueryMainEntrypoint)(PKLDRMOD pMod, void *pvBits, KLDRADDR BaseAddress, PKLDRADDR pMainEPAddress);
     928static int kldrModPEQueryMainEntrypoint(PKLDRMOD pMod, const void *pvBits, KLDRADDR BaseAddress, PKLDRADDR pMainEPAddress)
     929{
     930    PKLDRMODPE pModPE = (PKLDRMODPE)pMod->pvData;
     931    int rc;
     932
     933    rc = kldrModPEBitsAndBaseAddress(pModPE, NULL, &BaseAddress);
     934    if (rc)
     935        return rc;
     936
     937    *pMainEPAddress = pModPE->Hdrs.OptionalHeader.AddressOfEntryPoint
     938        ? BaseAddress + pModPE->Hdrs.OptionalHeader.AddressOfEntryPoint
     939        : NIL_KLDRADDR;
     940    return 0;
     941}
     942
     943
    842944/** @copydoc kLdrModEnumDbgInfo */
    843 int (* pfnEnumDbgInfo)(PKLDRMOD pMod, void *pvBits, PFNKLDRENUMDBG pfnCallback, void *pvUser);
     945int (* pfnEnumDbgInfo)(PKLDRMOD pMod, const void *pvBits, PFNKLDRENUMDBG pfnCallback, void *pvUser);
     946
    844947/** @copydoc kLdrModHasDbgInfo */
    845 int (* pfnHasDbgInfo)(PKLDRMOD pMod, void *pvBits);
     948int (* pfnHasDbgInfo)(PKLDRMOD pMod, const void *pvBits);
    846949/** @copydoc kLdrModMap */
    847950int (* pfnMap)(PKLDRMOD pMod);
Note: See TracChangeset for help on using the changeset viewer.