Ignore:
Timestamp:
Oct 23, 2000, 3:42:47 PM (25 years ago)
Author:
sandervl
Message:

Vio fix for high memory + fixes&updates for dll name lookup with extension

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/kernel32/winimagepeldr.cpp

    r4489 r4523  
    1 /* $Id: winimagepeldr.cpp,v 1.62 2000-10-16 19:15:16 sandervl Exp $ */
     1/* $Id: winimagepeldr.cpp,v 1.63 2000-10-23 13:42:45 sandervl Exp $ */
    22
    33/*
     
    111111 HFILE  dllfile;
    112112
    113   strcpy(szFileName, pszFileName);
    114   strupr(szFileName);
    115   if(isExe) {
    116     if(!strchr(szFileName, '.')) {
    117         strcat(szFileName,".EXE");
    118     }
    119     dllfile = OSLibDosOpen(szFileName, OSLIB_ACCESS_READONLY|OSLIB_ACCESS_SHAREDENYNONE);
    120     if(dllfile == NULL) {
    121         if(!strstr(szFileName, ".EXE")) {
     113    strcpy(szFileName, pszFileName);
     114    strupr(szFileName);
     115    if(isExe) {
     116        if(!strchr(szFileName, '.')) {
    122117            strcat(szFileName,".EXE");
    123118        }
    124119        dllfile = OSLibDosOpen(szFileName, OSLIB_ACCESS_READONLY|OSLIB_ACCESS_SHAREDENYNONE);
    125120        if(dllfile == NULL) {
    126             OSLibDosSearchPath(OSLIB_SEARCHENV, "PATH", szFileName, szFileName, sizeof(szFileName));
    127         }
    128     }
    129     else    OSLibDosClose(dllfile);
    130   }
    131   else {
    132     findDll(szFileName, szModule, sizeof(szModule));
    133     strcpy(szFileName, szModule);
    134   }
    135   strcpy(szModule, OSLibStripPath(szFileName));
    136   strupr(szModule);
    137   char *dot = strstr(szModule, ".");
    138   while(dot) {
    139     char *newdot = strstr(dot+1, ".");
    140     if(newdot == NULL)  break;
    141     dot = newdot;
    142   }
    143   if(dot)
    144     *dot = 0;
     121            if(!strstr(szFileName, ".EXE")) {
     122                strcat(szFileName,".EXE");
     123            }
     124            dllfile = OSLibDosOpen(szFileName, OSLIB_ACCESS_READONLY|OSLIB_ACCESS_SHAREDENYNONE);
     125            if(dllfile == NULL) {
     126                OSLibDosSearchPath(OSLIB_SEARCHENV, "PATH", szFileName, szFileName, sizeof(szFileName));
     127            }
     128        }
     129        else    OSLibDosClose(dllfile);
     130    }
     131    else {
     132        findDll(szFileName, szModule, sizeof(szModule));
     133        strcpy(szFileName, szModule);
     134    }
     135    strcpy(szModule, OSLibStripPath(szFileName));
     136    strupr(szModule);
    145137}
    146138//******************************************************************************
     
    13251317 int           forwardord;
    13261318
    1327   forwarddll = strdup(forward);
    1328   if(forwarddll == NULL) {
    1329     return FALSE;
    1330   }
    1331   forwardapi = strchr(forwarddll, '.');
    1332   if(forwardapi == NULL) {
    1333     goto fail;
    1334   }
    1335   *forwardapi++ = 0;
    1336   if(strlen(forwarddll) == 0 || strlen(forwardapi) == 0) {
    1337     goto fail;
    1338   }
    1339   WinDll = Win32DllBase::findModule(forwarddll);
    1340   if(WinDll == NULL) {
    1341     WinDll = loadDll(forwarddll);
     1319    forwarddll = strdup(forward);
     1320    if(forwarddll == NULL) {
     1321        return FALSE;
     1322    }
     1323    forwardapi = strchr(forwarddll, '.');
     1324    if(forwardapi == NULL) {
     1325        goto fail;
     1326    }
     1327    *forwardapi++ = 0;
     1328    if(strlen(forwarddll) == 0 || strlen(forwardapi) == 0) {
     1329        goto fail;
     1330    }
     1331    WinDll = Win32DllBase::findModule(forwarddll);
    13421332    if(WinDll == NULL) {
    1343         dprintf((LOG, "ERROR: couldn't find forwarder %s.%s", forwarddll, forwardapi));
    1344         goto fail;
    1345     }
    1346   }
    1347   //check if name or ordinal forwarder
    1348   forwardord = 0;
    1349   if(*forwardapi >= '0' && *forwardapi <= '9') {
    1350     forwardord = atoi(forwardapi);
    1351   }
    1352   if(forwardord != 0 || (strlen(forwardapi) == 1 && *forwardapi == '0')) {
    1353     exportaddr = WinDll->getApi(forwardord);
    1354   }
    1355   else  exportaddr = WinDll->getApi(forwardapi);
    1356 
    1357   if(apiname) {
     1333        WinDll = loadDll(forwarddll);
     1334        if(WinDll == NULL) {
     1335            dprintf((LOG, "ERROR: couldn't find forwarder %s.%s", forwarddll, forwardapi));
     1336            goto fail;
     1337        }
     1338    }
     1339    //check if name or ordinal forwarder
     1340    forwardord = 0;
     1341    if(*forwardapi >= '0' && *forwardapi <= '9') {
     1342        forwardord = atoi(forwardapi);
     1343    }
     1344    if(forwardord != 0 || (strlen(forwardapi) == 1 && *forwardapi == '0')) {
     1345        exportaddr = WinDll->getApi(forwardord);
     1346    }
     1347    else  exportaddr = WinDll->getApi(forwardapi);
     1348
     1349    if(apiname) {
    13581350        dprintf((LOG, "address 0x%x %s @%d (0x%08x) forwarder %s.%s", virtaddr - oh.ImageBase, apiname, ordinal, virtaddr, forwarddll, forwardapi));
    1359     AddNameExport(exportaddr, apiname, ordinal, TRUE);
    1360   }
    1361   else {
     1351        AddNameExport(exportaddr, apiname, ordinal, TRUE);
     1352    }
     1353    else {
    13621354        dprintf((LOG, "address 0x%x @%d (0x%08x) forwarder %s.%s", virtaddr - oh.ImageBase, ordinal, virtaddr, forwarddll, forwardapi));
    1363         AddOrdExport(exportaddr, ordinal, TRUE);
    1364   }
    1365   free(forwarddll);
    1366   return TRUE;
     1355         AddOrdExport(exportaddr, ordinal, TRUE);
     1356    }
     1357    free(forwarddll);
     1358    return TRUE;
    13671359
    13681360fail:
     
    13781370
    13791371    strcpy(modname, pszCurModule);
     1372
    13801373    //rename dll if necessary (i.e. OLE32 -> OLE32OS2)
    13811374    Win32DllBase::renameDll(modname);
     1375
     1376    char szModName2[CCHMAXPATH];
     1377    strcpy(szModName2, modname);
     1378    if (!Win32ImageBase::findDll(szModName2, modname, sizeof(modname)))
     1379    {
     1380            dprintf((LOG, "Module %s not found!", modname));
     1381            sprintf(szErrorModule, "%s", modname);
     1382            errorState = 2;
     1383            return NULL;
     1384    }
    13821385
    13831386    if(isPEImage(modname) != ERROR_SUCCESS_W)
     
    13861389        char   szModuleFailure[CCHMAXPATH] = "";
    13871390        ULONG  hInstanceNewDll;
    1388                 Win32LxDll *lxdll;
     1391        Win32LxDll *lxdll;
    13891392
    13901393        char *dot = strchr(modname, '.');
    1391         if(dot) {
    1392             *dot = 0;
    1393         }
    1394         strcat(modname, ".DLL");
     1394        if(dot == NULL) {
     1395            strcat(modname, DLL_EXTENSION);
     1396        }
    13951397        rc = DosLoadModule(szModuleFailure, sizeof(szModuleFailure), modname, (HMODULE *)&hInstanceNewDll);
    13961398        if(rc) {
    1397             dprintf((LOG, "DosLoadModule returned %X for %s\n", rc, szModuleFailure));
    1398             sprintf(szErrorModule, "%s.DLL", szModuleFailure);
     1399            dprintf((LOG, "DosLoadModule returned %X for %s", rc, szModuleFailure));
     1400            sprintf(szErrorModule, "%s", szModuleFailure);
    13991401            errorState = rc;
    14001402            return NULL;
     
    14131415            return NULL;
    14141416        }
    1415                 WinDll = (Win32DllBase*)lxdll;
     1417        WinDll = (Win32DllBase*)lxdll;
    14161418    }
    14171419    else {
     
    14231425                WinMessageBox(HWND_DESKTOP, HWND_DESKTOP, szMemErrorMsg, szErrorTitle, 0, MB_OK | MB_ERROR | MB_MOVEABLE);
    14241426                errorState = ERROR_INTERNAL;
    1425             return NULL;
     1427                return NULL;
    14261428            }
    14271429            dprintf((LOG, "**********************************************************************" ));
     
    14301432            if(pedll->init(0) == FALSE) {
    14311433                dprintf((LOG, "Internal WinDll error ", pedll->getError() ));
    1432             delete pedll;
    1433             return NULL;
     1434                delete pedll;
     1435                return NULL;
    14341436            }
    14351437#ifdef DEBUG
     
    14401442            if(pedll->attachProcess() == FALSE) {
    14411443                dprintf((LOG, "attachProcess failed!" ));
    1442             delete pedll;
     1444                delete pedll;
    14431445                errorState = ERROR_INTERNAL;
    1444             return NULL;
     1446                return NULL;
    14451447            }
    14461448        WinDll = (Win32DllBase*)pedll;
     
    14491451    dprintf((LOG, "**********************************************************************" ));
    14501452    dprintf((LOG, "**********************  Finished Loading Module %s ", modname ));
    1451         dprintf((LOG, "**********************************************************************" ));
     1453    dprintf((LOG, "**********************************************************************" ));
    14521454
    14531455    return WinDll;
     
    16001602    if(WinDll == NULL)
    16011603    {  //not found, so load it
    1602     WinDll = loadDll(pszCurModule);
    1603     if(WinDll == NULL) {
    1604         return FALSE;
    1605     }
     1604        WinDll = loadDll(pszCurModule);
     1605        if(WinDll == NULL) {
     1606            return FALSE;
     1607        }
    16061608    }
    16071609    else {
    1608     WinDll->AddRef();
    1609 
    1610     dprintf((LOG, "Already found ", pszCurModule));
     1610        WinDll->AddRef();
     1611        dprintf((LOG, "Already found ", pszCurModule));
    16111612    }
    16121613    //add the dll we just loaded to dependency list for this image
Note: See TracChangeset for help on using the changeset viewer.