Changeset 4250 for trunk/src/kernel32/wprocess.cpp
- Timestamp:
- Sep 13, 2000, 12:47:58 AM (25 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kernel32/wprocess.cpp
r4237 r4250 1 /* $Id: wprocess.cpp,v 1.9 2 2000-09-12 04:32:36bird Exp $ */1 /* $Id: wprocess.cpp,v 1.93 2000-09-12 22:47:58 bird Exp $ */ 2 2 3 3 /* … … 74 74 //TODO: This should not be here: (need to rearrange NTDLL; kernel32 can't depend on ntdll) 75 75 BOOLEAN (* WINAPI RtlAllocateAndInitializeSid) ( PSID_IDENTIFIER_AUTHORITY pIdentifierAuthority, 76 77 78 79 80 81 82 83 84 85 76 BYTE nSubAuthorityCount, 77 DWORD nSubAuthority0, 78 DWORD nSubAuthority1, 79 DWORD nSubAuthority2, 80 DWORD nSubAuthority3, 81 DWORD nSubAuthority4, 82 DWORD nSubAuthority5, 83 DWORD nSubAuthority6, 84 DWORD nSubAuthority7, 85 PSID *pSid); 86 86 static HINSTANCE hInstNTDll = 0; 87 87 … … 91 91 { 92 92 if(TIBFlatPtr == NULL) { 93 93 DebugInt3(); 94 94 return 0; 95 95 } … … 231 231 //Initialize thread security objects (TODO: Not complete) 232 232 if(hInstNTDll == 0) { 233 234 235 236 237 233 hInstNTDll = LoadLibraryA("NTDLL.DLL"); 234 *(ULONG *)&RtlAllocateAndInitializeSid = (ULONG)GetProcAddress(hInstNTDll, "RtlAllocateAndInitializeSid"); 235 if(RtlAllocateAndInitializeSid == NULL) { 236 DebugInt3(); 237 } 238 238 } 239 239 SID_IDENTIFIER_AUTHORITY sidIdAuth = {0}; … … 445 445 //SvL: Ignore FreeLibary for executable 446 446 if(WinExe && hinstance == WinExe->getInstanceHandle()) { 447 447 return TRUE; 448 448 } 449 449 … … 700 700 lpszLibFile, hFile, dwFlags)); 701 701 SetLastError(ERROR_INVALID_PARAMETER); 702 702 return NULL; 703 703 } 704 704 705 705 706 706 /** @sketch 707 * First we'll see if the module is allready loaded. 707 * First we'll see if the module is allready loaded - either as the EXE or as DLL. 708 * IF Executable present AND libfile matches the modname of the executable THEN 709 * RETURN instance handle of executable. 710 * Endif 708 711 * IF allready loaded THEN 709 712 * IF it's a LX dll which isn't loaded and we're using the PeLoader THEN … … 715 718 * Endif 716 719 */ 717 if(WinExe) { 718 char szDllName[CCHMAXPATH]; 719 char *dot; 720 721 strcpy(szDllName, OSLibStripPath((char *)lpszLibFile)); 722 strupr(szDllName); 723 dot = strstr(szDllName, "."); 724 if(dot) 725 *dot = 0; 726 727 if(!strcmp(szDllName, WinExe->getModuleName())) { 728 return WinExe->getInstanceHandle(); 729 } 730 } 720 if (WinExe != NULL && WinExe->matchModName(lpszLibFile)) 721 return WinExe->getInstanceHandle(); 731 722 pModule = Win32DllBase::findModule((LPSTR)lpszLibFile); 732 723 if (pModule) … … 790 781 if (hDll) 791 782 { 792 /* OS/2 dll, system dll, converted dll or win32k took care of it. */783 /* OS/2 dll, system dll, converted dll or win32k took care of it. */ 793 784 pModule = (Win32DllBase *)Win32LxDll::findModuleByOS2Handle(hDll); 794 785 if(pModule) … … 797 788 if(pModule->isLxDll()) 798 789 { 799 ((Win32LxDll *)pModule)->setDllHandleOS2(hDll); 800 if(fPeLoader) { 801 pModule->AddRef(); 802 } 790 ((Win32LxDll *)pModule)->setDllHandleOS2(hDll); 791 if (fPeLoader) 792 pModule->AddRef(); 803 793 } 804 794 pModule->incDynamicLib(); 805 795 } 806 else {796 else 807 797 return hDll; //happens when LoadLibrary is called in kernel32's initterm (nor harmful) 808 }809 798 dprintf(("KERNEL32: LoadLibraryExA(%s, 0x%x, 0x%x): returns 0x%x. Loaded %s using O32_LoadLibrary.", 810 799 lpszLibFile, hFile, dwFlags, hDll, szModname)); … … 895 884 { 896 885 peldrDll->AddRef(); 897 if (peldrDll->attachProcess()) { 886 if (peldrDll->attachProcess()) 887 { 898 888 hDll = peldrDll->getInstanceHandle(); 899 889 //Must be called *after* attachprocess, since attachprocess may also 900 890 //trigger LoadLibrary calls 901 891 //Those dlls must not be put in front of this dll in the dynamic … … 1058 1048 1059 1049 /** 1060 * Internal function which gets the commandline .1050 * Internal function which gets the commandline (string) used to start the current process. 1061 1051 * @returns OS/2 / Windows return code 1062 1052 * On successful return (NO_ERROR) the global variables … … 1375 1365 1376 1366 1377 DWORD WIN32API GetModuleFileNameA(HMODULE hinstModule, LPTSTR lpszPath, DWORD cchPath) 1378 { 1379 DWORD rc; 1380 Win32ImageBase *module; 1381 char *fpath = NULL; 1382 1383 dprintf(("GetModuleFileName %X", hinstModule)); 1384 if(hinstModule == 0 || hinstModule == -1 || (WinExe && hinstModule == WinExe->getInstanceHandle())) { 1385 module = (Win32ImageBase *)WinExe; 1386 } 1387 else { 1388 module = (Win32ImageBase *)Win32DllBase::findModule(hinstModule); 1389 } 1390 1391 if(module) { 1392 fpath = module->getFullPath(); 1393 } 1394 if(fpath) { 1395 //SvL: 13-9-98: +1 1396 rc = min(strlen(fpath)+1, cchPath); 1397 strncpy(lpszPath, fpath, rc); 1398 lpszPath[rc-1] = 0; 1399 } 1400 //only needed for call inside kernel32's initterm (profile init) 1401 else rc = O32_GetModuleFileName(hinstModule, lpszPath, cchPath); 1402 1403 if(rc) { 1404 dprintf(("KERNEL32: GetModuleFileName %s %d\n", lpszPath, hinstModule)); 1405 } 1406 else dprintf(("KERNEL32: WARNING: GetModuleFileName %x not found!", hinstModule)); 1407 return(rc); 1408 } 1409 //****************************************************************************** 1410 //****************************************************************************** 1411 DWORD WIN32API GetModuleFileNameW(HMODULE hModule, LPWSTR lpFileName, DWORD nSize) 1412 { 1413 char *asciifilename = (char *)malloc(nSize+1); 1414 DWORD rc; 1415 1416 dprintf(("KERNEL32: OSLibGetModuleFileNameW\n")); 1417 rc = GetModuleFileNameA(hModule, asciifilename, nSize); 1418 if(rc) AsciiToUnicode(asciifilename, lpFileName); 1419 free(asciifilename); 1420 return(rc); 1421 } 1367 /** 1368 * GetModuleFileName gets the full path and file name for the specified module. 1369 * @returns Bytes written to the buffer (lpszPath). This count includes the 1370 * terminating '\0'. 1371 * On error 0 is returned. Last error is set. 1372 * @param hModule Handle to the module you like to get the file name to. 1373 * @param lpszPath Output buffer for full path and file name. 1374 * @param cchPath Size of the lpszPath buffer. 1375 * @sketch Validate lpszPath. 1376 * Find the module object using handle. 1377 * If found Then 1378 * Get full path from module object. 1379 * If found path Then 1380 * Copy path to buffer and set the number of bytes written. 1381 * Else 1382 * IPE! 1383 * Else 1384 * Call Open32 GetModuleFileName. (kernel32 initterm needs/needed this) 1385 * Log result. 1386 * Return number of bytes written to the buffer. 1387 * 1388 * @status Completely implemented, Open32. 1389 * @author knut st. osmundsen (knut.stange.osmundsen@mynd.no) 1390 * Sander van Leeuwen (sandervl@xs4all.nl) 1391 * @remark - Do we still have to call Open32? 1392 * - Do we set ERROR_BUFFER_OVERFLOW when cch > cchPath? 1393 * - Does NT really set the last error? 1394 */ 1395 DWORD WIN32API GetModuleFileNameA(HMODULE hModule, LPTSTR lpszPath, DWORD cchPath) 1396 { 1397 Win32ImageBase * pMod; /* Pointer to the module object. */ 1398 DWORD cch; /* Length of the */ 1399 1400 if (!VALID_PSZ(lpszPath)) 1401 { 1402 dprintf(("KERNEL32: GetModuleFileNameA(0x%x, 0x%x, 0x%x): invalid pointer lpszLibFile = 0x%x\n", 1403 hModule, lpszPath, cchPath, lpszPath)); 1404 SetLastError(ERROR_INVALID_PARAMETER); //or maybe ERROR_ACCESS_DENIED is more appropriate? 1405 return 0; 1406 } 1407 1408 pMod = Win32ImageBase::findModule(hModule); 1409 if (pMod != NULL) 1410 { 1411 const char *pszFn = pMod->getFullPath(); 1412 if (pszFn) 1413 { 1414 cch = strlen(pszFn) + 1; 1415 if (cch > cchPath) 1416 cch = cchPath; 1417 memcpy(lpszPath, pszFn, cch); 1418 lpszPath[cch - 1] = '\0'; 1419 } 1420 else 1421 { 1422 dprintf(("KERNEL32: GetModuleFileNameA(%x,...): IPE - getFullPath returned NULL or empty string\n")); 1423 DebugInt3(); 1424 SetLastError(ERROR_INVALID_HANDLE); 1425 } 1426 } 1427 else 1428 { 1429 SetLastError(ERROR_INVALID_HANDLE); 1430 //only needed for call inside kernel32's initterm (profile init) 1431 //(console init only it seems...) 1432 cch = O32_GetModuleFileName(hModule, lpszPath, cchPath); 1433 if (cch > 0) cch++; /* Open32 doesn't count the terminator. */ 1434 } 1435 1436 if (cch > 0) 1437 dprintf(("KERNEL32: GetModuleFileNameA(%x,...): %s %d\n", lpszPath, hModule, cch)); 1438 else 1439 dprintf(("KERNEL32: WARNING: GetModuleFileNameA(%x,...) - not found!", hModule)); 1440 1441 return cch; 1442 } 1443 1444 1445 /** 1446 * GetModuleFileName gets the full path and file name for the specified module. 1447 * @returns Bytes written to the buffer (lpszPath). This count includes the 1448 * terminating '\0'. 1449 * On error 0 is returned. Last error is set. 1450 * @param hModule Handle to the module you like to get the file name to. 1451 * @param lpszPath Output buffer for full path and file name. 1452 * @param cchPath Size of the lpszPath buffer. 1453 * @sketch Find the module object using handle. 1454 * If found Then 1455 * get full path from module object. 1456 * If found path Then 1457 * Determin path length. 1458 * Translate the path to into the buffer. 1459 * Else 1460 * IPE. 1461 * else 1462 * SetLastError to invalid handle. 1463 * Log result. 1464 * return number of bytes written to the buffer. 1465 * 1466 * @status Completely implemented. 1467 * @author knut st. osmundsen (knut.stange.osmundsen@mynd.no) 1468 * @remark - We do _NOT_ call Open32. 1469 * - Do we set ERROR_BUFFER_OVERFLOW when cch > cchPath? 1470 * - Does NT really set the last error? 1471 */ 1472 DWORD WIN32API GetModuleFileNameW(HMODULE hModule, LPWSTR lpszPath, DWORD cchPath) 1473 { 1474 Win32ImageBase * pMod; 1475 DWORD cch = 0; 1476 1477 if (!VALID_PSZ(lpszPath)) 1478 { 1479 dprintf(("KERNEL32: GetModuleFileNameW(0x%x, 0x%x, 0x%x): invalid pointer lpszLibFile = 0x%x\n", 1480 hModule, lpszPath, cchPath, lpszPath)); 1481 SetLastError(ERROR_INVALID_PARAMETER); //or maybe ERROR_ACCESS_DENIED is more appropriate? 1482 return 0; 1483 } 1484 1485 pMod = Win32ImageBase::findModule(hModule); 1486 if (pMod != NULL) 1487 { 1488 const char *pszFn = pMod->getFullPath(); 1489 if (pszFn || *pszFn != '\0') 1490 { 1491 cch = strlen(pszFn) + 1; 1492 if (cch > cchPath) 1493 cch = cchPath; 1494 AsciiToUnicodeN(pszFn, lpszPath, cch); 1495 } 1496 else 1497 { 1498 dprintf(("KERNEL32: GetModuleFileNameW(%x,...): IPE - getFullPath returned NULL or empty string\n")); 1499 DebugInt3(); 1500 SetLastError(ERROR_INVALID_HANDLE); 1501 } 1502 } 1503 else 1504 SetLastError(ERROR_INVALID_HANDLE); 1505 1506 if (cch > 0) 1507 dprintf(("KERNEL32: GetModuleFileNameW(%x,...): %s %d\n", lpszPath, hModule, cch)); 1508 else 1509 dprintf(("KERNEL32: WARNING: GetModuleFileNameW(%x,...) - not found!", hModule)); 1510 1511 return cch; 1512 } 1513 1514 1422 1515 //****************************************************************************** 1423 1516 //NOTE: GetModuleHandleA does NOT support files with multiple dots (i.e. … … 1648 1741 ulAPIOrdinal = (ULONG)lpszProc; 1649 1742 if (ulAPIOrdinal <= 0x0000FFFF) { 1650 1743 proc = (FARPROC)winmod->getApi((int)ulAPIOrdinal); 1651 1744 } 1652 1745 else proc = (FARPROC)winmod->getApi((char *)lpszProc); 1653 1746 if(proc == 0) { 1654 1747 #ifdef DEBUG 1655 1656 1657 1658 elsedprintf(("GetProcAddress %x %s not found!", hModule, lpszProc));1748 if(ulAPIOrdinal <= 0x0000FFFF) { 1749 dprintf(("GetProcAddress %x %x not found!", hModule, ulAPIOrdinal)); 1750 } 1751 else dprintf(("GetProcAddress %x %s not found!", hModule, lpszProc)); 1659 1752 #endif 1660 1661 1662 1663 1664 elsedprintf(("KERNEL32: GetProcAddress %x from %X returned %X\n", lpszProc, hModule, proc));1665 1753 SetLastError(ERROR_PROC_NOT_FOUND); 1754 } 1755 if(HIWORD(lpszProc)) 1756 dprintf(("KERNEL32: GetProcAddress %s from %X returned %X\n", lpszProc, hModule, proc)); 1757 else dprintf(("KERNEL32: GetProcAddress %x from %X returned %X\n", lpszProc, hModule, proc)); 1758 return proc; 1666 1759 } 1667 1760 proc = O32_GetProcAddress(hModule, lpszProc); 1668 1761 if(HIWORD(lpszProc)) 1669 1762 dprintf(("KERNEL32: GetProcAddress %s from %X returned %X\n", lpszProc, hModule, proc)); 1670 1763 else dprintf(("KERNEL32: GetProcAddress %x from %X returned %X\n", lpszProc, hModule, proc)); 1671 1764 return(proc);
Note:
See TracChangeset
for help on using the changeset viewer.