Changeset 81 for trunk/kLdr/kLdrModLX.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/kLdrModLX.c

    r80 r81  
    128128static void kLdrModLXMemCopyW(KU8 *pbDst, const KU8 *pbSrc, int cb);
    129129static int kldrModLXDoProtect(PKLDRMODLX pModLX, void *pvBits, unsigned fUnprotectOrProtect);
    130 static int kldrModLXDoCallDLL(PKLDRMODLX pModLX, unsigned uOp, KUPTR uHandle);
     130static int kldrModLXDoCallDLL(PKLDRMODLX pModLX, void *pvMapping, unsigned uOp, KUPTR uHandle);
    131131static int kldrModLXDoForwarderQuery(PKLDRMODLX pModLX, const struct e32_entry *pEntry,
    132132                                     PFNKLDRMODGETIMPORT pfnGetForwarder, void *pvUser, PKLDRADDR puValue, KU32 *pfKind);
     
    19371937
    19381938/** @copydoc kLdrModAllocTLS */
    1939 static int kldrModLXAllocTLS(PKLDRMOD pMod)
     1939static int kldrModLXAllocTLS(PKLDRMOD pMod, void *pvMapping)
    19401940{
    19411941    PKLDRMODLX  pModLX = (PKLDRMODLX)pMod->pvData;
    19421942
    19431943    /* no tls, just do the error checking. */
    1944     if (!pModLX->pvMapping)
     1944    if (   pvMapping == KLDRMOD_INT_MAP
     1945        && pModLX->pvMapping)
    19451946        return KLDR_ERR_NOT_MAPPED;
    19461947    return 0;
     
    19491950
    19501951/** @copydoc kLdrModFreeTLS */
    1951 static void kldrModLXFreeTLS(PKLDRMOD pMod)
     1952static void kldrModLXFreeTLS(PKLDRMOD pMod, void *pvMapping)
    19521953{
    19531954    /* no tls. */
    19541955    K_NOREF(pMod);
     1956    K_NOREF(pvMapping);
    19551957
    19561958}
     
    20272029
    20282030/** @copydoc kLdrModCallInit */
    2029 static int kldrModLXCallInit(PKLDRMOD pMod, KUPTR uHandle)
     2031static int kldrModLXCallInit(PKLDRMOD pMod, void *pvMapping, KUPTR uHandle)
    20302032{
    20312033    PKLDRMODLX pModLX = (PKLDRMODLX)pMod->pvData;
     
    20352037     * Mapped?
    20362038     */
    2037     if (!pModLX->pvMapping)
    2038         return KLDR_ERR_NOT_MAPPED;
     2039    if (pvMapping == KLDRMOD_INT_MAP)
     2040    {
     2041        pvMapping = pModLX->pvMapping;
     2042        if (!pvMapping)
     2043            return KLDR_ERR_NOT_MAPPED;
     2044    }
    20392045
    20402046    /*
     
    20422048     */
    20432049    if ((pModLX->Hdr.e32_mflags & E32MODMASK) == E32MODDLL)
    2044         rc = kldrModLXDoCallDLL(pModLX, 0 /* attach */, uHandle);
     2050        rc = kldrModLXDoCallDLL(pModLX, pvMapping, 0 /* attach */, uHandle);
    20452051    else
    20462052        rc = 0;
     
    20552061 * @returns KLDR_ERR_MODULE_INIT_FAILED  or KLDR_ERR_THREAD_ATTACH_FAILED on failure.
    20562062 * @param   pModLX          The LX module interpreter instance.
     2063 * @param   pvMapping       The module mapping to use (resolved).
    20572064 * @param   uOp             The operation (DLL_*).
    20582065 * @param   uHandle         The module handle to present.
    20592066 */
    2060 static int kldrModLXDoCallDLL(PKLDRMODLX pModLX, unsigned uOp, KUPTR uHandle)
     2067static int kldrModLXDoCallDLL(PKLDRMODLX pModLX, void *pvMapping, unsigned uOp, KUPTR uHandle)
    20612068{
    20622069    int rc;
     
    20722079     * Invoke the entrypoint and convert the boolean result to a kLdr status code.
    20732080     */
    2074     rc = kldrModLXDoCall((KUPTR)pModLX->pvMapping
     2081    rc = kldrModLXDoCall((KUPTR)pvMapping
    20752082                         + (KUPTR)pModLX->pMod->aSegments[pModLX->Hdr.e32_startobj - 1].RVA
    20762083                         + pModLX->Hdr.e32_eip,
     
    21502157
    21512158/** @copydoc kLdrModCallTerm */
    2152 static int kldrModLXCallTerm(PKLDRMOD pMod, KUPTR uHandle)
     2159static int kldrModLXCallTerm(PKLDRMOD pMod, void *pvMapping, KUPTR uHandle)
    21532160{
    21542161    PKLDRMODLX  pModLX = (PKLDRMODLX)pMod->pvData;
     
    21572164     * Mapped?
    21582165     */
    2159     if (!pModLX->pvMapping)
    2160         return KLDR_ERR_NOT_MAPPED;
     2166    if (pvMapping == KLDRMOD_INT_MAP)
     2167    {
     2168        pvMapping = pModLX->pvMapping;
     2169        if (!pvMapping)
     2170            return KLDR_ERR_NOT_MAPPED;
     2171    }
    21612172
    21622173    /*
     
    21642175     */
    21652176    if ((pModLX->Hdr.e32_mflags & E32MODMASK) == E32MODDLL)
    2166         kldrModLXDoCallDLL(pModLX, 1 /* detach */, uHandle);
     2177        kldrModLXDoCallDLL(pModLX, pvMapping, 1 /* detach */, uHandle);
    21672178
    21682179    return 0;
     
    21712182
    21722183/** @copydoc kLdrModCallThread */
    2173 static int kldrModLXCallThread(PKLDRMOD pMod, KUPTR uHandle, unsigned fAttachingOrDetaching)
     2184static int kldrModLXCallThread(PKLDRMOD pMod, void *pvMapping, KUPTR uHandle, unsigned fAttachingOrDetaching)
    21742185{
    21752186    /* no thread attach/detach callout. */
    21762187    K_NOREF(pMod);
     2188    K_NOREF(pvMapping);
    21772189    K_NOREF(uHandle);
    21782190    K_NOREF(fAttachingOrDetaching);
Note: See TracChangeset for help on using the changeset viewer.