Changeset 4523 for trunk/src/kernel32/winimagepeldr.cpp
- Timestamp:
- Oct 23, 2000, 3:42:47 PM (25 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kernel32/winimagepeldr.cpp
r4489 r4523 1 /* $Id: winimagepeldr.cpp,v 1.6 2 2000-10-16 19:15:16sandervl Exp $ */1 /* $Id: winimagepeldr.cpp,v 1.63 2000-10-23 13:42:45 sandervl Exp $ */ 2 2 3 3 /* … … 111 111 HFILE dllfile; 112 112 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, '.')) { 122 117 strcat(szFileName,".EXE"); 123 118 } 124 119 dllfile = OSLibDosOpen(szFileName, OSLIB_ACCESS_READONLY|OSLIB_ACCESS_SHAREDENYNONE); 125 120 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); 145 137 } 146 138 //****************************************************************************** … … 1325 1317 int forwardord; 1326 1318 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); 1342 1332 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) { 1358 1350 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 { 1362 1354 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; 1367 1359 1368 1360 fail: … … 1378 1370 1379 1371 strcpy(modname, pszCurModule); 1372 1380 1373 //rename dll if necessary (i.e. OLE32 -> OLE32OS2) 1381 1374 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 } 1382 1385 1383 1386 if(isPEImage(modname) != ERROR_SUCCESS_W) … … 1386 1389 char szModuleFailure[CCHMAXPATH] = ""; 1387 1390 ULONG hInstanceNewDll; 1388 1391 Win32LxDll *lxdll; 1389 1392 1390 1393 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 } 1395 1397 rc = DosLoadModule(szModuleFailure, sizeof(szModuleFailure), modname, (HMODULE *)&hInstanceNewDll); 1396 1398 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); 1399 1401 errorState = rc; 1400 1402 return NULL; … … 1413 1415 return NULL; 1414 1416 } 1415 1417 WinDll = (Win32DllBase*)lxdll; 1416 1418 } 1417 1419 else { … … 1423 1425 WinMessageBox(HWND_DESKTOP, HWND_DESKTOP, szMemErrorMsg, szErrorTitle, 0, MB_OK | MB_ERROR | MB_MOVEABLE); 1424 1426 errorState = ERROR_INTERNAL; 1425 return NULL;1427 return NULL; 1426 1428 } 1427 1429 dprintf((LOG, "**********************************************************************" )); … … 1430 1432 if(pedll->init(0) == FALSE) { 1431 1433 dprintf((LOG, "Internal WinDll error ", pedll->getError() )); 1432 delete pedll;1433 return NULL;1434 delete pedll; 1435 return NULL; 1434 1436 } 1435 1437 #ifdef DEBUG … … 1440 1442 if(pedll->attachProcess() == FALSE) { 1441 1443 dprintf((LOG, "attachProcess failed!" )); 1442 delete pedll;1444 delete pedll; 1443 1445 errorState = ERROR_INTERNAL; 1444 return NULL;1446 return NULL; 1445 1447 } 1446 1448 WinDll = (Win32DllBase*)pedll; … … 1449 1451 dprintf((LOG, "**********************************************************************" )); 1450 1452 dprintf((LOG, "********************** Finished Loading Module %s ", modname )); 1451 1453 dprintf((LOG, "**********************************************************************" )); 1452 1454 1453 1455 return WinDll; … … 1600 1602 if(WinDll == NULL) 1601 1603 { //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 } 1606 1608 } 1607 1609 else { 1608 WinDll->AddRef(); 1609 1610 dprintf((LOG, "Already found ", pszCurModule)); 1610 WinDll->AddRef(); 1611 dprintf((LOG, "Already found ", pszCurModule)); 1611 1612 } 1612 1613 //add the dll we just loaded to dependency list for this image
Note:
See TracChangeset
for help on using the changeset viewer.