Changeset 81 for trunk/kLdr/kLdrModPE.c


Ignore:
Timestamp:
Aug 19, 2016, 12:10:38 AM (9 years ago)
Author:
bird
Message:

kLdr: some refactoring and fixes.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/kLdr/kLdrModPE.c

    r79 r81  
    121121                                    PFNKLDRMODGETIMPORT pfnGetImport, void *pvUser);
    122122static int  kldrModPEDoImports(PKLDRMODPE pModPE, void *pvMapping, PFNKLDRMODGETIMPORT pfnGetImport, void *pvUser);
    123 static int  kldrModPEDoCallDLL(PKLDRMODPE pModPE, unsigned uOp, KUPTR uHandle);
    124 static int  kldrModPEDoCallTLS(PKLDRMODPE pModPE, unsigned uOp, KUPTR uHandle);
     123static int  kldrModPEDoCallDLL(PKLDRMODPE pModPE, void *pvMapping, unsigned uOp, KUPTR uHandle);
     124static int  kldrModPEDoCallTLS(PKLDRMODPE pModPE, void *pvMapping, unsigned uOp, KUPTR uHandle);
    125125static KI32 kldrModPEDoCall(KUPTR uEntrypoint, KUPTR uHandle, KU32 uOp, void *pvReserved);
    126126
     
    12831283
    12841284/** @copydoc kLdrModAllocTLS */
    1285 static int kldrModPEAllocTLS(PKLDRMOD pMod)
     1285static int kldrModPEAllocTLS(PKLDRMOD pMod, void *pvMapping)
    12861286{
    12871287    PKLDRMODPE  pModPE = (PKLDRMODPE)pMod->pvData;
     
    12901290     * Mapped?
    12911291     */
    1292     if (!pModPE->pvMapping)
    1293         return KLDR_ERR_NOT_MAPPED;
     1292    if (pvMapping == KLDRMOD_INT_MAP)
     1293    {
     1294        pvMapping = pModPE->pvMapping;
     1295        if (!pvMapping)
     1296            return KLDR_ERR_NOT_MAPPED;
     1297    }
    12941298
    12951299    /*
     
    13051309
    13061310/** @copydoc kLdrModFreeTLS */
    1307 static void kldrModPEFreeTLS(PKLDRMOD pMod)
     1311static void kldrModPEFreeTLS(PKLDRMOD pMod, void *pvMapping)
    13081312{
    13091313    PKLDRMODPE  pModPE = (PKLDRMODPE)pMod->pvData;
     
    13121316     * Mapped?
    13131317     */
    1314     if (!pModPE->pvMapping)
    1315         return;
     1318    if (pvMapping == KLDRMOD_INT_MAP)
     1319    {
     1320        pvMapping = pModPE->pvMapping;
     1321        if (!pvMapping)
     1322            return;
     1323    }
    13161324
    13171325    /*
     
    17091717
    17101718/** @copydoc kLdrModCallInit */
    1711 static int kldrModPECallInit(PKLDRMOD pMod, KUPTR uHandle)
     1719static int kldrModPECallInit(PKLDRMOD pMod, void *pvMapping, KUPTR uHandle)
    17121720{
    17131721    PKLDRMODPE pModPE = (PKLDRMODPE)pMod->pvData;
     
    17171725     * Mapped?
    17181726     */
    1719     if (!pModPE->pvMapping)
    1720         return KLDR_ERR_NOT_MAPPED;
     1727    if (pvMapping == KLDRMOD_INT_MAP)
     1728    {
     1729        pvMapping = pModPE->pvMapping;
     1730        if (!pvMapping)
     1731            return KLDR_ERR_NOT_MAPPED;
     1732    }
    17211733
    17221734    /*
    17231735     * Do TLS callbacks first and then call the init/term function if it's a DLL.
    17241736     */
    1725     rc = kldrModPEDoCallTLS(pModPE, DLL_PROCESS_ATTACH, uHandle);
     1737    rc = kldrModPEDoCallTLS(pModPE, pvMapping, DLL_PROCESS_ATTACH, uHandle);
    17261738    if (    !rc
    17271739        &&  (pModPE->Hdrs.FileHeader.Characteristics & IMAGE_FILE_DLL))
    17281740    {
    1729         rc = kldrModPEDoCallDLL(pModPE, DLL_PROCESS_ATTACH, uHandle);
     1741        rc = kldrModPEDoCallDLL(pModPE, pvMapping, DLL_PROCESS_ATTACH, uHandle);
    17301742        if (rc)
    1731             kldrModPEDoCallTLS(pModPE, DLL_PROCESS_DETACH, uHandle);
     1743            kldrModPEDoCallTLS(pModPE, pvMapping, DLL_PROCESS_DETACH, uHandle);
    17321744    }
    17331745
     
    17421754 * @returns KLDR_ERR_MODULE_INIT_FAILED  or KLDR_ERR_THREAD_ATTACH_FAILED on failure.
    17431755 * @param   pModPE          The PE module interpreter instance.
     1756 * @param   pvMapping       The module mapping to use (resolved).
    17441757 * @param   uOp             The operation (DLL_*).
    17451758 * @param   uHandle         The module handle to present.
    17461759 */
    1747 static int  kldrModPEDoCallDLL(PKLDRMODPE pModPE, unsigned uOp, KUPTR uHandle)
     1760static int  kldrModPEDoCallDLL(PKLDRMODPE pModPE, void *pvMapping, unsigned uOp, KUPTR uHandle)
    17481761{
    17491762    int rc;
     
    17581771     * Invoke the entrypoint and convert the boolean result to a kLdr status code.
    17591772     */
    1760     rc = kldrModPEDoCall((KUPTR)pModPE->pvMapping + pModPE->Hdrs.OptionalHeader.AddressOfEntryPoint,
    1761                          uHandle, uOp, NULL);
     1773    rc = kldrModPEDoCall((KUPTR)pvMapping + pModPE->Hdrs.OptionalHeader.AddressOfEntryPoint, uHandle, uOp, NULL);
    17621774    if (rc)
    17631775        rc = 0;
     
    17781790 * @returns KLDR_ERR_THREAD_ATTACH_FAILED on failure.
    17791791 * @param   pModPE          The PE module interpreter instance.
     1792 * @param   pvMapping       The module mapping to use (resolved).
    17801793 * @param   uOp             The operation (DLL_*).
    17811794 * @param   uHandle         The module handle to present.
    17821795 */
    1783 static int  kldrModPEDoCallTLS(PKLDRMODPE pModPE, unsigned uOp, KUPTR uHandle)
     1796static int  kldrModPEDoCallTLS(PKLDRMODPE pModPE, void *pvMapping, unsigned uOp, KUPTR uHandle)
    17841797{
    17851798    /** @todo implement TLS support. */
    17861799    K_NOREF(pModPE);
     1800    K_NOREF(pvMapping);
    17871801    K_NOREF(uOp);
    17881802    K_NOREF(uHandle);
     
    18621876
    18631877/** @copydoc kLdrModCallTerm */
    1864 static int kldrModPECallTerm(PKLDRMOD pMod, KUPTR uHandle)
     1878static int kldrModPECallTerm(PKLDRMOD pMod, void *pvMapping, KUPTR uHandle)
    18651879{
    18661880    PKLDRMODPE  pModPE = (PKLDRMODPE)pMod->pvData;
     
    18691883     * Mapped?
    18701884     */
    1871     if (!pModPE->pvMapping)
    1872         return KLDR_ERR_NOT_MAPPED;
     1885    if (pvMapping == KLDRMOD_INT_MAP)
     1886    {
     1887        pvMapping = pModPE->pvMapping;
     1888        if (!pvMapping)
     1889            return KLDR_ERR_NOT_MAPPED;
     1890    }
    18731891
    18741892    /*
    18751893     * Do TLS callbacks first.
    18761894     */
    1877     kldrModPEDoCallTLS(pModPE, DLL_PROCESS_DETACH, uHandle);
     1895    kldrModPEDoCallTLS(pModPE, pvMapping, DLL_PROCESS_DETACH, uHandle);
    18781896    if (pModPE->Hdrs.FileHeader.Characteristics & IMAGE_FILE_DLL)
    1879         kldrModPEDoCallDLL(pModPE, DLL_PROCESS_DETACH, uHandle);
     1897        kldrModPEDoCallDLL(pModPE, pvMapping, DLL_PROCESS_DETACH, uHandle);
    18801898
    18811899    return 0;
     
    18841902
    18851903/** @copydoc kLdrModCallThread */
    1886 static int kldrModPECallThread(PKLDRMOD pMod, KUPTR uHandle, unsigned fAttachingOrDetaching)
     1904static int kldrModPECallThread(PKLDRMOD pMod, void *pvMapping, KUPTR uHandle, unsigned fAttachingOrDetaching)
    18871905{
    18881906    PKLDRMODPE  pModPE = (PKLDRMODPE)pMod->pvData;
     
    18911909
    18921910    /*
     1911     * Mapped?
     1912     */
     1913    if (pvMapping == KLDRMOD_INT_MAP)
     1914    {
     1915        pvMapping = pModPE->pvMapping;
     1916        if (!pvMapping)
     1917            return KLDR_ERR_NOT_MAPPED;
     1918    }
     1919
     1920    /*
    18931921     * Do TLS callbacks first and then call the init/term function if it's a DLL.
    18941922     */
    1895     rc = kldrModPEDoCallTLS(pModPE, uOp, uHandle);
     1923    rc = kldrModPEDoCallTLS(pModPE, pvMapping, uOp, uHandle);
    18961924    if (!fAttachingOrDetaching)
    18971925        rc = 0;
     
    18991927        &&  (pModPE->Hdrs.FileHeader.Characteristics & IMAGE_FILE_DLL))
    19001928    {
    1901         rc = kldrModPEDoCallDLL(pModPE, uOp, uHandle);
     1929        rc = kldrModPEDoCallDLL(pModPE, pvMapping, uOp, uHandle);
    19021930        if (!fAttachingOrDetaching)
    19031931            rc = 0;
    19041932        if (rc)
    1905             kldrModPEDoCallTLS(pModPE, uOp, uHandle);
     1933            kldrModPEDoCallTLS(pModPE, pvMapping, uOp, uHandle);
    19061934    }
    19071935
Note: See TracChangeset for help on using the changeset viewer.