/** * Try to dynamically load the PulseAudio libraries. This function is not * thread-safe, and should be called before attempting to use any of the * PulseAudio functions. * * @returns iprt status code */ int audioLoadPulseLib(void) { int rc = VINF_SUCCESS; unsigned i; static enum { NO = 0, YES, FAIL } isLibLoaded = NO; RTLDRMOD hLib; LogFlowFunc(("\n")); /* If this is not NO then the function has obviously been called twice, which is likely to be a bug. */ if (NO != isLibLoaded) { AssertMsgFailed(("isLibLoaded == %s\n", YES == isLibLoaded ? "YES" : "NO")); return YES == isLibLoaded ? VINF_SUCCESS : VERR_NOT_SUPPORTED; } isLibLoaded = FAIL; rc = RTLdrLoad(VBOX_PULSE_LIB, &hLib); if (RT_FAILURE(rc)) { LogRelFunc(("Failed to load library %s\n", VBOX_PULSE_LIB)); return rc; } for (i=0; i<RT_ELEMENTS(SharedFuncs); i++) { rc = RTLdrGetSymbol(hLib, SharedFuncs[i].name, (void**)SharedFuncs[i].fn); if (RT_FAILURE(rc)) return rc; } isLibLoaded = YES; return rc; }
bool VBoxSolarisLibDlpiFound(void) { RTLDRMOD hLibDlpi; if (g_hLibDlpi && g_fCheckedForLibDlpi) return true; if (g_fCheckedForLibDlpi) return false; if (!RT_SUCCESS(RTLdrLoad(LIB_DLPI, &hLibDlpi))) return false; /* * Unfortunately; we cannot make use of dlpi_get_physaddr because it requires us to * open the VNIC/link which requires root permissions :/ */ if (RT_SUCCESS(RTLdrGetSymbol(hLibDlpi, "dlpi_walk", (void **)&g_pfnLibDlpiWalk))) { g_hLibDlpi = hLibDlpi; g_fCheckedForLibDlpi = true; return true; } else { RTLdrClose(hLibDlpi); g_fCheckedForLibDlpi = true; return false; } }
bool VBoxSolarisLibDlpiFound(void) { RTLDRMOD hLibDlpi; if (g_fCheckedForLibDlpi) return g_hLibDlpi != NIL_RTLDRMOD; g_fCheckedForLibDlpi = true; int rc = RTLdrLoad(LIB_DLPI, &hLibDlpi); if (RT_SUCCESS(rc)) { /* * Unfortunately; we cannot make use of dlpi_get_physaddr because it requires us to * open the VNIC/link which requires root permissions :/ */ rc = RTLdrGetSymbol(hLibDlpi, "dlpi_walk", (void **)&g_pfnLibDlpiWalk); rc |= RTLdrGetSymbol(hLibDlpi, "dlpi_close", (void **)&g_pfnLibDlpiClose); rc |= RTLdrGetSymbol(hLibDlpi, "dlpi_open", (void **)&g_pfnLibDlpiOpen); if (RT_SUCCESS(rc)) { g_hLibDlpi = hLibDlpi; return true; } RTLdrClose(hLibDlpi); } hLibDlpi = NIL_RTLDRMOD; return false; }
RTDECL(int) RTPathUserDocuments(char *pszPath, size_t cchPath) { /* * Validate input */ AssertPtrReturn(pszPath, VERR_INVALID_POINTER); AssertReturn(cchPath, VERR_INVALID_PARAMETER); RTLDRMOD hShell32; int rc = RTLdrLoad("Shell32.dll", &hShell32); if (RT_SUCCESS(rc)) { PFNSHGETFOLDERPATHW pfnSHGetFolderPathW; rc = RTLdrGetSymbol(hShell32, "SHGetFolderPathW", (void**)&pfnSHGetFolderPathW); if (RT_SUCCESS(rc)) { RTUTF16 wszPath[RTPATH_MAX]; HRESULT hrc = pfnSHGetFolderPathW(0, CSIDL_PERSONAL, NULL, SHGFP_TYPE_CURRENT, wszPath); if ( hrc == S_OK /* Found */ || hrc == S_FALSE) /* Found, but doesn't exist */ { /* * Convert and return. */ RTLdrClose(hShell32); return RTUtf16ToUtf8Ex(&wszPath[0], RTSTR_MAX, &pszPath, cchPath, NULL); } } RTLdrClose(hShell32); } return VERR_PATH_NOT_FOUND; }
bool VBoxLibDlpiFound(void) { RTLDRMOD hLibDlpi; if (g_hLibDlpi && g_fCheckedForLibDlpi) return true; if (g_fCheckedForLibDlpi) return false; if (!RT_SUCCESS(RTLdrLoad(LIB_DLPI, &hLibDlpi))) return false; if ( RT_SUCCESS(RTLdrGetSymbol(hLibDlpi, "dlpi_open", (void **)&g_pfnLibDlpiOpen)) && RT_SUCCESS(RTLdrGetSymbol(hLibDlpi, "dlpi_close", (void **)&g_pfnLibDlpiClose)) && RT_SUCCESS(RTLdrGetSymbol(hLibDlpi, "dlpi_info", (void **)&g_pfnLibDlpiInfo)) && RT_SUCCESS(RTLdrGetSymbol(hLibDlpi, "dlpi_bind", (void **)&g_pfnLibDlpiBind)) && RT_SUCCESS(RTLdrGetSymbol(hLibDlpi, "dlpi_promiscon", (void **)&g_pfnLibDlpiPromiscon)) && RT_SUCCESS(RTLdrGetSymbol(hLibDlpi, "dlpi_set_physaddr", (void **)&g_pfnLibDlpiSetPhysAddr)) && RT_SUCCESS(RTLdrGetSymbol(hLibDlpi, "dlpi_recv", (void **)&g_pfnLibDlpiRecv)) && RT_SUCCESS(RTLdrGetSymbol(hLibDlpi, "dlpi_fd", (void **)&g_pfnLibDlpiFd)) ) { g_hLibDlpi = hLibDlpi; g_fCheckedForLibDlpi = true; return true; } else { RTLdrClose(hLibDlpi); g_fCheckedForLibDlpi = true; return false; } }
/** * Loads a dynamic load library (/shared object) image file residing in the * RTPathAppPrivateArch() directory. * * Suffix is not required. * * @returns iprt status code. * @param pszFilename Image filename. No path. * @param phLdrMod Where to store the handle to the loaded module. */ RTDECL(int) RTLdrLoadAppPriv(const char *pszFilename, PRTLDRMOD phLdrMod) { LogFlow(("RTLdrLoadAppPriv: pszFilename=%p:{%s} phLdrMod=%p\n", pszFilename, pszFilename, phLdrMod)); /* * Validate input. */ AssertPtrReturn(phLdrMod, VERR_INVALID_PARAMETER); *phLdrMod = NIL_RTLDRMOD; AssertPtrReturn(pszFilename, VERR_INVALID_PARAMETER); AssertMsgReturn(!RTPathHasPath(pszFilename), ("%s\n", pszFilename), VERR_INVALID_PARAMETER); /* * Check the filename. */ size_t cchFilename = strlen(pszFilename); AssertMsgReturn(cchFilename < (RTPATH_MAX / 4) * 3, ("%zu\n", cchFilename), VERR_INVALID_PARAMETER); const char *pszSuffix = ""; size_t cchSuffix = 0; if (!RTPathHasSuffix(pszFilename)) { pszSuffix = RTLdrGetSuff(); cchSuffix = strlen(pszSuffix); } /* * Construct the private arch path and check if the file exists. */ char szPath[RTPATH_MAX]; int rc = RTPathAppPrivateArch(szPath, sizeof(szPath) - 1 - cchSuffix - cchFilename); AssertRCReturn(rc, rc); char *psz = strchr(szPath, '\0'); *psz++ = RTPATH_SLASH; memcpy(psz, pszFilename, cchFilename); psz += cchFilename; memcpy(psz, pszSuffix, cchSuffix + 1); if (!RTPathExists(szPath)) { LogRel(("RTLdrLoadAppPriv: \"%s\" not found\n", szPath)); return VERR_FILE_NOT_FOUND; } /* * Pass it on to RTLdrLoad. */ rc = RTLdrLoad(szPath, phLdrMod); LogFlow(("RTLdrLoadAppPriv: returns %Rrc\n", rc)); return rc; }
RTDECL(bool) RTLdrIsLoadable(const char *pszFilename) { /* * Try to load the library. */ RTLDRMOD hLib; int rc = RTLdrLoad(pszFilename, &hLib); if (RT_SUCCESS(rc)) { RTLdrClose(hLib); return true; } return false; }
int main(int argc, char **argv) { int rcRet = 0; RTR3InitExe(argc, &argv, 0); /* * If no args, display usage. */ if (argc <= 1) { RTPrintf("Syntax: %s [so/dll [so/dll [..]]\n", argv[0]); return 1; } /* * Iterate the arguments and treat all of them as so/dll paths. */ for (int i = 1; i < argc; i++) { RTLDRMOD hLdrMod = (RTLDRMOD)0xbaadffaa; int rc = RTLdrLoad(argv[i], &hLdrMod); if (RT_SUCCESS(rc)) { RTPrintf("tstLdrLoad: %d - %s\n", i, argv[i]); rc = RTLdrClose(hLdrMod); if (RT_FAILURE(rc)) { RTPrintf("tstLdrLoad: rc=%Rrc RTLdrClose()\n", rc); rcRet++; } } else { RTPrintf("tstLdrLoad: rc=%Rrc RTLdrOpen('%s')\n", rc, argv[i]); rcRet++; } } /* * Summary. */ if (!rcRet) RTPrintf("tstLdrLoad: SUCCESS\n"); else RTPrintf("tstLdrLoad: FAILURE - %d errors\n", rcRet); return !!rcRet; }
bool gLibHalCheckPresence(void) { RTLDRMOD hLibHal; if (ghLibHal != 0 && gCheckedForLibHal == true) return true; if (gCheckedForLibHal == true) return false; if (!RT_SUCCESS(RTLdrLoad(LIB_HAL, &hLibHal))) { return false; } if ( RT_SUCCESS(RTLdrGetSymbol(hLibHal, "dbus_error_init", (void **) &gDBusErrorInit)) && RT_SUCCESS(RTLdrGetSymbol(hLibHal, "dbus_bus_get", (void **) &gDBusBusGet)) && RT_SUCCESS(RTLdrGetSymbol(hLibHal, "dbus_error_free", (void **) &gDBusErrorFree)) && RT_SUCCESS(RTLdrGetSymbol(hLibHal, "dbus_connection_unref", (void **) &gDBusConnectionUnref)) && RT_SUCCESS(RTLdrGetSymbol(hLibHal, "libhal_ctx_new", (void **) &gLibHalCtxNew)) && RT_SUCCESS(RTLdrGetSymbol(hLibHal, "libhal_ctx_set_dbus_connection", (void **) &gLibHalCtxSetDBusConnection)) && RT_SUCCESS(RTLdrGetSymbol(hLibHal, "libhal_ctx_init", (void **) &gLibHalCtxInit)) && RT_SUCCESS(RTLdrGetSymbol(hLibHal, "libhal_manager_find_device_string_match", (void **) &gLibHalFindDeviceStringMatch)) && RT_SUCCESS(RTLdrGetSymbol(hLibHal, "libhal_device_get_property_string", (void **) &gLibHalDeviceGetPropertyString)) && RT_SUCCESS(RTLdrGetSymbol(hLibHal, "libhal_free_string", (void **) &gLibHalFreeString)) && RT_SUCCESS(RTLdrGetSymbol(hLibHal, "libhal_free_string_array", (void **) &gLibHalFreeStringArray)) && RT_SUCCESS(RTLdrGetSymbol(hLibHal, "libhal_ctx_shutdown", (void **) &gLibHalCtxShutdown)) && RT_SUCCESS(RTLdrGetSymbol(hLibHal, "libhal_ctx_free", (void **) &gLibHalCtxFree)) ) { ghLibHal = hLibHal; gCheckedForLibHal = true; return true; } else { RTLdrClose(hLibHal); gCheckedForLibHal = true; return false; } }
/** * Retrieves the module name of a given process. * * @return IPRT status code. * @param pProc * @param pszBuf * @param cbBuf */ static int VBoxServiceVMInfoWinProcessesGetModuleName(PVBOXSERVICEVMINFOPROC const pProc, TCHAR *pszName, size_t cbName) { AssertPtrReturn(pProc, VERR_INVALID_POINTER); AssertPtrReturn(pszName, VERR_INVALID_POINTER); AssertReturn(cbName, VERR_INVALID_PARAMETER); OSVERSIONINFOEX OSInfoEx; RT_ZERO(OSInfoEx); OSInfoEx.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); if ( !GetVersionEx((LPOSVERSIONINFO) &OSInfoEx) || OSInfoEx.dwPlatformId != VER_PLATFORM_WIN32_NT) { /* Platform other than NT (e.g. Win9x) not supported. */ return VERR_NOT_SUPPORTED; } int rc = VINF_SUCCESS; DWORD dwFlags = PROCESS_QUERY_INFORMATION | PROCESS_VM_READ; if (OSInfoEx.dwMajorVersion >= 6 /* Vista or later */) dwFlags = 0x1000; /* = PROCESS_QUERY_LIMITED_INFORMATION; less privileges needed. */ HANDLE h = OpenProcess(dwFlags, FALSE, pProc->id); if (h == NULL) { DWORD dwErr = GetLastError(); if (g_cVerbosity) VBoxServiceError("Unable to open process with PID=%ld, error=%ld\n", pProc->id, dwErr); rc = RTErrConvertFromWin32(dwErr); } else { /* Since GetModuleFileNameEx has trouble with cross-bitness stuff (32-bit apps cannot query 64-bit apps and vice verse) we have to use a different code path for Vista and up. */ /* Note: For 2000 + NT4 we might just use GetModuleFileName() instead. */ if (OSInfoEx.dwMajorVersion >= 6 /* Vista or later */) { /* Loading the module and getting the symbol for each and every process is expensive * -- since this function (at the moment) only is used for debugging purposes it's okay. */ RTLDRMOD hMod; rc = RTLdrLoad("kernel32.dll", &hMod); if (RT_SUCCESS(rc)) { PFNQUERYFULLPROCESSIMAGENAME pfnQueryFullProcessImageName; rc = RTLdrGetSymbol(hMod, "QueryFullProcessImageNameA", (void **)&pfnQueryFullProcessImageName); if (RT_SUCCESS(rc)) { DWORD dwLen = cbName / sizeof(TCHAR); if (!pfnQueryFullProcessImageName(h, 0 /*PROCESS_NAME_NATIVE*/, pszName, &dwLen)) rc = VERR_ACCESS_DENIED; } RTLdrClose(hMod); } } else { if (!GetModuleFileNameEx(h, NULL /* Get main executable */, pszName, cbName / sizeof(TCHAR))) rc = VERR_ACCESS_DENIED; } CloseHandle(h); } return rc; }