VBoxServiceUtils.cpp revision d3203e1a8d5b114c66238ae33506f6e1a3d79b9e
7a61a5714b9a39ac3bd59e52b0843ef498350a35vboxsync * VBoxServiceUtils - Some utility functions.
7a61a5714b9a39ac3bd59e52b0843ef498350a35vboxsync * Copyright (C) 2009 Sun Microsystems, Inc.
7a61a5714b9a39ac3bd59e52b0843ef498350a35vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
7a61a5714b9a39ac3bd59e52b0843ef498350a35vboxsync * available from http://www.virtualbox.org. This file is free software;
7a61a5714b9a39ac3bd59e52b0843ef498350a35vboxsync * you can redistribute it and/or modify it under the terms of the GNU
7a61a5714b9a39ac3bd59e52b0843ef498350a35vboxsync * General Public License (GPL) as published by the Free Software
7a61a5714b9a39ac3bd59e52b0843ef498350a35vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
7a61a5714b9a39ac3bd59e52b0843ef498350a35vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
7a61a5714b9a39ac3bd59e52b0843ef498350a35vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
7a61a5714b9a39ac3bd59e52b0843ef498350a35vboxsync * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
7a61a5714b9a39ac3bd59e52b0843ef498350a35vboxsync * Clara, CA 95054 USA or visit http://www.sun.com if you need
7a61a5714b9a39ac3bd59e52b0843ef498350a35vboxsync * additional information or have any questions.
7a61a5714b9a39ac3bd59e52b0843ef498350a35vboxsync/*******************************************************************************
7a61a5714b9a39ac3bd59e52b0843ef498350a35vboxsync* Header Files *
7a61a5714b9a39ac3bd59e52b0843ef498350a35vboxsync*******************************************************************************/
bc6df168670cfc0df5ae3be50ccbf098ba2cebc7vboxsync * Reads a guest property.
bc6df168670cfc0df5ae3be50ccbf098ba2cebc7vboxsync * @returns VBox status code, fully bitched.
bc6df168670cfc0df5ae3be50ccbf098ba2cebc7vboxsync * @param u32ClientId The HGCM client ID for the guest property session.
bc6df168670cfc0df5ae3be50ccbf098ba2cebc7vboxsync * @param pszPropName The property name.
bc6df168670cfc0df5ae3be50ccbf098ba2cebc7vboxsync * @param ppszValue Where to return the value. This is always set
bc6df168670cfc0df5ae3be50ccbf098ba2cebc7vboxsync * to NULL. Free it using RTStrFree().
bc6df168670cfc0df5ae3be50ccbf098ba2cebc7vboxsync * @param ppszFlags Where to return the value flags. Free it
bc6df168670cfc0df5ae3be50ccbf098ba2cebc7vboxsync * using RTStrFree(). Optional.
bc6df168670cfc0df5ae3be50ccbf098ba2cebc7vboxsync * @param puTimestamp Where to return the timestamp. This is only set
bc6df168670cfc0df5ae3be50ccbf098ba2cebc7vboxsync * on success. Optional.
bc6df168670cfc0df5ae3be50ccbf098ba2cebc7vboxsyncint VBoxServiceReadProp(uint32_t u32ClientId, const char *pszPropName, char **ppszValue, char **ppszFlags, uint64_t *puTimestamp)
bc6df168670cfc0df5ae3be50ccbf098ba2cebc7vboxsync * (Re-)Allocate the buffer and try read the property.
bc6df168670cfc0df5ae3be50ccbf098ba2cebc7vboxsync VBoxServiceError("Guest Property: Failed to allocate %zu bytes\n", cbBuf);
bc6df168670cfc0df5ae3be50ccbf098ba2cebc7vboxsync /* try again with a bigger buffer. */
bc6df168670cfc0df5ae3be50ccbf098ba2cebc7vboxsync VBoxServiceVerbose(2, "Guest Property: %s not found\n", pszPropName);
bc6df168670cfc0df5ae3be50ccbf098ba2cebc7vboxsync VBoxServiceError("Guest Property: Failed to query \"%s\": %Rrc\n", pszPropName, rc);
bc6df168670cfc0df5ae3be50ccbf098ba2cebc7vboxsync VBoxServiceVerbose(2, "Guest Property: Read \"%s\" = \"%s\", timestamp %RU64n\n",
bc6df168670cfc0df5ae3be50ccbf098ba2cebc7vboxsync VBoxServiceError("Guest Property: RTStrDup failed for \"%s\"\n", pszValue);
bc6df168670cfc0df5ae3be50ccbf098ba2cebc7vboxsync break; /* done */
bc6df168670cfc0df5ae3be50ccbf098ba2cebc7vboxsync * Reads a guest property as a 32-bit value.
bc6df168670cfc0df5ae3be50ccbf098ba2cebc7vboxsync * @returns VBox status code, fully bitched.
bc6df168670cfc0df5ae3be50ccbf098ba2cebc7vboxsync * @param u32ClientId The HGCM client ID for the guest property session.
bc6df168670cfc0df5ae3be50ccbf098ba2cebc7vboxsync * @param pszPropName The property name.
bc6df168670cfc0df5ae3be50ccbf098ba2cebc7vboxsync * @param pu32 Where to store the 32-bit value.
bc6df168670cfc0df5ae3be50ccbf098ba2cebc7vboxsyncint VBoxServiceReadPropUInt32(uint32_t u32ClientId, const char *pszPropName, uint32_t *pu32, uint32_t u32Min, uint32_t u32Max)
bc6df168670cfc0df5ae3be50ccbf098ba2cebc7vboxsync int rc = VBoxServiceReadProp(u32ClientId, pszPropName, &pszValue,
4893c4e3513fece2ef56f559aa2370c25f12a745vboxsync rc = VBoxServiceError("The guest property value %s = %RU32 is out of range [%RU32..%RU32].\n",
019f39cc548f50d58cfdf91965f58eab1ded841bvboxsync * Wrapper around VbglR3GuestPropWriteValue that does value formatting and
019f39cc548f50d58cfdf91965f58eab1ded841bvboxsync * @returns VBox status code. Errors will be logged.
019f39cc548f50d58cfdf91965f58eab1ded841bvboxsync * @param u32ClientId The HGCM client ID for the guest property session.
019f39cc548f50d58cfdf91965f58eab1ded841bvboxsync * @param pszName The property name.
019f39cc548f50d58cfdf91965f58eab1ded841bvboxsync * @param pszValueFormat The property format string. If this is NULL then
eb360054919960bec0e41ea49932c591096c2f5fvboxsync * the property will be deleted (if possible).
019f39cc548f50d58cfdf91965f58eab1ded841bvboxsync * @param ... Format arguments.
324b7b7cb0e3e95595f5fb069043ff3643891ba2vboxsyncint VBoxServiceWritePropF(uint32_t u32ClientId, const char *pszName, const char *pszValueFormat, ...)
d3203e1a8d5b114c66238ae33506f6e1a3d79b9evboxsync VBoxServiceVerbose(3, "Writing guest property \"%s\" = \"%N\"\n", pszName, pszValueFormat, &va);
23776fb44216ff7aa3b47916ef4975748de89de1vboxsync rc = VbglR3GuestPropWriteValueV(u32ClientId, pszName, pszValueFormat, va);
23776fb44216ff7aa3b47916ef4975748de89de1vboxsync VBoxServiceError("Error writing guest property \"%s\" (rc=%Rrc)\n", pszName, rc);
d3203e1a8d5b114c66238ae33506f6e1a3d79b9evboxsync VBoxServiceVerbose(3, "Deleting guest property \"%s\"\n", pszName);
23776fb44216ff7aa3b47916ef4975748de89de1vboxsync rc = VbglR3GuestPropWriteValue(u32ClientId, pszName, NULL);
eb360054919960bec0e41ea49932c591096c2f5fvboxsync VBoxServiceError("Error deleting guest property \"%s\" (rc=%Rrc)\n", pszName, rc);
b0b8c85eb454e2a7ad926bbefda6d908932291e3vboxsync#endif /* VBOX_WITH_GUEST_PROPS */
7da4d6056248b76ff6c265010bc3b8ceb06be93fvboxsync/** @todo return an iprt status code instead of BOOL */
324b7b7cb0e3e95595f5fb069043ff3643891ba2vboxsyncBOOL VBoxServiceGetFileString(const char* pszFileName,
7a61a5714b9a39ac3bd59e52b0843ef498350a35vboxsync /* The VS_FIXEDFILEINFO structure contains version information about a file.
7a61a5714b9a39ac3bd59e52b0843ef498350a35vboxsync This information is language and code page independent. */
7a61a5714b9a39ac3bd59e52b0843ef498350a35vboxsync dwLen = GetFileVersionInfoSize(pszFileName, &dwHandle);
7da4d6056248b76ff6c265010bc3b8ceb06be93fvboxsync /* Don't print this to release log -- this confuses people if a file
7da4d6056248b76ff6c265010bc3b8ceb06be93fvboxsync * isn't present because it's optional / was not installed intentionally. */
7da4d6056248b76ff6c265010bc3b8ceb06be93fvboxsync VBoxServiceVerbose(3, "No file information found! File = %s, Error: %Rrc\n",
7da4d6056248b76ff6c265010bc3b8ceb06be93fvboxsync pszFileName, RTErrConvertFromWin32(GetLastError()));
7da4d6056248b76ff6c265010bc3b8ceb06be93fvboxsync VBoxServiceError("Could not allocate temp buffer for file string lookup!\n");
7a61a5714b9a39ac3bd59e52b0843ef498350a35vboxsync if (GetFileVersionInfo(pszFileName, dwHandle, dwLen, lpData))
7a61a5714b9a39ac3bd59e52b0843ef498350a35vboxsync if((bRet = VerQueryValue(lpData, pszBlock, (LPVOID*)&lpValue, (PUINT)&uiValueLen)))
7da4d6056248b76ff6c265010bc3b8ceb06be93fvboxsync else VBoxServiceVerbose(3, "No file string value for \"%s\" in file \"%s\" available!\n", pszBlock, pszFileName);
7da4d6056248b76ff6c265010bc3b8ceb06be93fvboxsync else VBoxServiceVerbose(3, "No file version table for file \"%s\" available!\n", pszFileName);
7da4d6056248b76ff6c265010bc3b8ceb06be93fvboxsync/** @todo return an iprt status code instead of BOOL */
324b7b7cb0e3e95595f5fb069043ff3643891ba2vboxsyncBOOL VBoxServiceGetFileVersion(const char* pszFileName,
7a61a5714b9a39ac3bd59e52b0843ef498350a35vboxsync /* The VS_FIXEDFILEINFO structure contains version information about a file.
7a61a5714b9a39ac3bd59e52b0843ef498350a35vboxsync This information is language and code page independent. */
7a61a5714b9a39ac3bd59e52b0843ef498350a35vboxsync dwLen = GetFileVersionInfoSize(pszFileName, &dwHandle);
7a61a5714b9a39ac3bd59e52b0843ef498350a35vboxsync /* Try own fields defined in block "\\StringFileInfo\\040904b0\\FileVersion". */
324b7b7cb0e3e95595f5fb069043ff3643891ba2vboxsync bRet = VBoxServiceGetFileString(pszFileName, "\\StringFileInfo\\040904b0\\FileVersion", szValue, &uiSize);
f65e6cba3e74ffd3dc9e6053828dcc82b367e8devboxsync sscanf(pszValue, "%ld.%ld.%ld.%ld", pdwMajor, pdwMinor, pdwBuildNumber, pdwRevisionNumber);
7a61a5714b9a39ac3bd59e52b0843ef498350a35vboxsync else if (dwLen > 0)
7a61a5714b9a39ac3bd59e52b0843ef498350a35vboxsync /* Try regular fields - this maybe is not file provided by VBox! */
7da4d6056248b76ff6c265010bc3b8ceb06be93fvboxsync VBoxServiceError("Could not allocate temp buffer for file version string!\n");
7a61a5714b9a39ac3bd59e52b0843ef498350a35vboxsync if (GetFileVersionInfo(pszFileName, dwHandle, dwLen, lpData))
f65e6cba3e74ffd3dc9e6053828dcc82b367e8devboxsync if((bRet = VerQueryValue(lpData, "\\", (LPVOID*)&pFileInfo, (PUINT)&BufLen)))
7a61a5714b9a39ac3bd59e52b0843ef498350a35vboxsync *pdwBuildNumber = HIWORD(pFileInfo->dwFileVersionLS);
7a61a5714b9a39ac3bd59e52b0843ef498350a35vboxsync *pdwRevisionNumber = LOWORD(pFileInfo->dwFileVersionLS);
7da4d6056248b76ff6c265010bc3b8ceb06be93fvboxsync else VBoxServiceVerbose(3, "No file version value for file \"%s\" available!\n", pszFileName);
7da4d6056248b76ff6c265010bc3b8ceb06be93fvboxsync else VBoxServiceVerbose(3, "No file version struct for file \"%s\" available!\n", pszFileName);
324b7b7cb0e3e95595f5fb069043ff3643891ba2vboxsyncBOOL VBoxServiceGetFileVersionString(const char* pszPath, const char* pszFileName, char* pszVersion, UINT uiSize)
f65e6cba3e74ffd3dc9e6053828dcc82b367e8devboxsync RTStrPrintf(szFullPath, 4096, "%s\\%s", pszPath, pszFileName);
324b7b7cb0e3e95595f5fb069043ff3643891ba2vboxsync bRet = VBoxServiceGetFileVersion(szFullPath, &dwMajor, &dwMinor, &dwBuild, &dwRev);
7a61a5714b9a39ac3bd59e52b0843ef498350a35vboxsync RTStrPrintf(pszVersion, uiSize, "%ld.%ld.%ldr%ld", dwMajor, dwMinor, dwBuild, dwRev);
7a61a5714b9a39ac3bd59e52b0843ef498350a35vboxsync#endif /* !RT_OS_WINDOWS */