Ignore:
Timestamp:
Mar 15, 2020, 4:23:36 PM (5 years ago)
Author:
bird
Message:

kLdrModNative: Added KLDRMOD_OPEN_FLAGS_NATIVE_ALLOW_INIT_TERM to allow kWorker to re-init mspdb100.dll when _MSPDBSRV_ENDPOINT_ changes.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/kLdr/kLdrModNative.c

    r82 r117  
    165165                               KLDRFOFF offNewHdr, PPKLDRMOD ppMod)
    166166{
    167     int rc = kLdrModOpenNative(kRdrName(pRdr), ppMod);
     167    int rc = kLdrModOpenNative(kRdrName(pRdr), fFlags, ppMod);
    168168    if (rc)
    169169        return rc;
     
    180180 * @returns non-zero native or kLdr status code on failure.
    181181 * @param   pszFilename         The filename or module name to be loaded.
     182 * @param   fFlags              Module open flags, KLDRMOD_OPEN_FLAGS_XXX.
    182183 * @param   ppMod               Where to store the module interpreter instance pointer.
    183184 */
    184 int kLdrModOpenNative(const char *pszFilename, PPKLDRMOD ppMod)
     185int kLdrModOpenNative(const char *pszFilename, KU32 fFlags, PPKLDRMOD ppMod)
    185186{
    186187    int rc;
     
    191192#if K_OS == K_OS_OS2
    192193    HMODULE hmod;
     194    kHlpAssertReturn(!(fFlags & ~KLDRMOD_OPEN_FLAGS_VALID_MASK), KERR_INVALID_PARAMETER);
    193195
    194196    rc = DosLoadModule(NULL, 0, (PCSZ)pszFilename, &hmod);
    195197    if (rc)
    196198        return rc;
    197     rc = kLdrModOpenNativeByHandle((KUPTR)hmod, ppMod);
     199    rc = kLdrModOpenNativeByHandle((KUPTR)hmod, fFlags, ppMod);
    198200    if (rc)
    199201        DosFreeModule(hmod);
     
    201203#elif K_OS == K_OS_WINDOWS
    202204    HMODULE hmod;
     205    kHlpAssertReturn(!(fFlags & ~KLDRMOD_OPEN_FLAGS_VALID_MASK), KERR_INVALID_PARAMETER);
    203206
    204207    hmod = LoadLibrary(pszFilename);
    205208    if (!hmod)
    206209        return GetLastError();
    207     rc = kLdrModOpenNativeByHandle((KUPTR)hmod, ppMod);
     210    rc = kLdrModOpenNativeByHandle((KUPTR)hmod, fFlags, ppMod);
    208211    if (rc)
    209212        FreeLibrary(hmod);
     
    211214#elif K_OS == K_OS_DARWIN
    212215    void *pvMod;
     216    kHlpAssertReturn(!(fFlags & ~KLDRMOD_OPEN_FLAGS_VALID_MASK), KERR_INVALID_PARAMETER);
    213217
    214218    pvMod = dlopen(pszFilename, 0);
    215219    if (!pvMod)
    216220        return ENOENT;
    217     rc = kLdrModOpenNativeByHandle((KUPTR)pvMod, ppMod);
     221    rc = kLdrModOpenNativeByHandle((KUPTR)pvMod, fFlags, ppMod);
    218222    if (rc)
    219223        dlclose(pvMod);
     
    233237 * @returns non-zero native or kLdr status code on failure.
    234238 * @param   pszFilename         The filename or module name to be loaded.
     239 * @param   fFlags              Module open flags, KLDRMOD_OPEN_FLAGS_XXX.
    235240 * @param   ppMod               Where to store the module interpreter instance pointer.
    236241 * @remark  This will not make the native loader increment the load count.
    237242 */
    238 int kLdrModOpenNativeByHandle(KUPTR uHandle, PPKLDRMOD ppMod)
     243int kLdrModOpenNativeByHandle(KUPTR uHandle, KU32 fFlags, PPKLDRMOD ppMod)
    239244{
    240245    KSIZE cb;
     
    305310# error "Port me"
    306311#endif
     312
     313    kHlpAssertReturn(!(fFlags & ~KLDRMOD_OPEN_FLAGS_VALID_MASK), KERR_INVALID_PARAMETER);
    307314
    308315    /*
     
    328335    pMod->pszName = kHlpGetFilename(pMod->pszFilename); /** @todo get soname */
    329336    pMod->cchName = cchFilename - (KU32)(pMod->pszName - pMod->pszFilename);
    330     pMod->fFlags = 0;
     337    pMod->fFlags = fFlags;
    331338#if defined(__i386__) || defined(__X86__) || defined(_M_IX86)
    332339    pMod->enmCpu = KCPU_I386;
     
    10501057
    10511058
     1059#if K_OS == K_OS_OS2 || K_OS == K_OS_WINDOWS || defined(__NT__)
     1060/** Common worker on platforms where there is one entrypoint which does both. */
     1061static int kLdrModNativeCallInitTerm(PKLDRMODNATIVE pModNative, KUPTR uHandle, KBOOL fInit)
     1062{
     1063# if K_OS == K_OS_WINDOWS || defined(__NT__)
     1064    /* No TLS init/term for now. */
     1065    KU32 const uRvaEntrypoint = pModNative->pNtHdrs->OptionalHeader.AddressOfEntryPoint;
     1066    if (   uRvaEntrypoint != 0
     1067        && uRvaEntrypoint < pModNative->pNtHdrs->OptionalHeader.SizeOfCode
     1068        && (pModNative->pNtHdrs->FileHeader.Characteristics & IMAGE_FILE_DLL))
     1069    {
     1070        KI32 rc = kldrModPEDoCall(uRvaEntrypoint + (KUPTR)pModNative->hmod, uHandle,
     1071                                  fInit ? DLL_PROCESS_ATTACH : DLL_PROCESS_DETACH, NULL /*pvReserved*/);
     1072        if (rc)
     1073            return 0;
     1074        return fInit ? KLDR_ERR_MODULE_INIT_FAILED : KLDR_ERR_THREAD_ATTACH_FAILED;
     1075    }
     1076# elif K_OS == K_OS_OS2
     1077    //KI32 kldrModLXDoCall(KUPTR uEntrypoint, KUPTR uHandle, KU32 uOp, void *pvReserved)
     1078# endif
     1079    return 0;
     1080}
     1081#endif
     1082
    10521083/** @copydoc kLdrModCallInit */
    10531084static int kldrModNativeCallInit(PKLDRMOD pMod, void *pvMapping, KUPTR uHandle)
    10541085{
     1086#if K_OS == K_OS_OS2 || K_OS == K_OS_WINDOWS || defined(__NT__)
     1087    if (pMod->fFlags & KLDRMOD_OPEN_FLAGS_NATIVE_ALLOW_INIT_TERM)
     1088        return kLdrModNativeCallInitTerm((PKLDRMODNATIVE)pMod->pvData, uHandle, K_TRUE /*fInit*/);
     1089#endif
    10551090    return 0;
    10561091}
     
    10601095static int kldrModNativeCallTerm(PKLDRMOD pMod, void *pvMapping, KUPTR uHandle)
    10611096{
     1097#if K_OS == K_OS_OS2 || K_OS == K_OS_WINDOWS || defined(__NT__)
     1098    if (pMod->fFlags & KLDRMOD_OPEN_FLAGS_NATIVE_ALLOW_INIT_TERM)
     1099        return kLdrModNativeCallInitTerm((PKLDRMODNATIVE)pMod->pvData, uHandle, K_FALSE /*fInit*/);
     1100#endif
    10621101    return 0;
    10631102}
Note: See TracChangeset for help on using the changeset viewer.