VirtualBox

Changeset 55314 in vbox for trunk/src/VBox/Main/src-client


Ignore:
Timestamp:
Apr 16, 2015 5:13:00 PM (10 years ago)
Author:
vboxsync
Message:

Main/Console: report installed driver versions to VM release log

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Main/src-client/ConsoleImpl2.cpp

    r55259 r55314  
    819819
    820820
     821#ifdef RT_OS_WINDOWS
     822#include <psapi.h>
     823
     824/**
     825 * Report versions of installed drivers to release log.
     826 */
     827static void reportDriverVersions(void)
     828{
     829    DWORD   err;
     830    HRESULT hrc;
     831    LPVOID  aDrivers[1024];
     832    LPVOID *pDrivers      = aDrivers;
     833    UINT    cNeeded       = 0;
     834    TCHAR   szSystemRoot[MAX_PATH];
     835    TCHAR  *pszSystemRoot = szSystemRoot;
     836    LPVOID  pVerInfo      = NULL;
     837    DWORD   cbVerInfo     = 0;
     838
     839    do
     840    {
     841        cNeeded = GetWindowsDirectory(szSystemRoot, RT_ELEMENTS(szSystemRoot));
     842        if (cNeeded == 0)
     843        {
     844            err = GetLastError();
     845            hrc = HRESULT_FROM_WIN32(err);
     846            AssertLogRelMsgFailed(("GetWindowsDirectory failed, hr=%Rhrc (0x%x) err=%u\n",
     847                                                   hrc, hrc, err));
     848            break;
     849        }
     850        else if (cNeeded > RT_ELEMENTS(szSystemRoot))
     851        {
     852            /* The buffer is too small, allocate big one. */
     853            pszSystemRoot = (TCHAR *)RTMemTmpAlloc(cNeeded * sizeof(_TCHAR));
     854            if (!pszSystemRoot)
     855            {
     856                AssertLogRelMsgFailed(("RTMemTmpAlloc failed to allocate %d bytes\n", cNeeded));
     857                break;
     858            }
     859            if (GetWindowsDirectory(pszSystemRoot, cNeeded) == 0)
     860            {
     861                err = GetLastError();
     862                hrc = HRESULT_FROM_WIN32(err);
     863                AssertLogRelMsgFailed(("GetWindowsDirectory failed, hr=%Rhrc (0x%x) err=%u\n",
     864                                                   hrc, hrc, err));
     865                break;
     866            }
     867        }
     868
     869        DWORD  cbNeeded = 0;
     870        if (!EnumDeviceDrivers(aDrivers, sizeof(aDrivers), &cbNeeded) || cbNeeded > sizeof(aDrivers))
     871        {
     872            pDrivers = (LPVOID *)RTMemTmpAlloc(cbNeeded);
     873            if (!EnumDeviceDrivers(pDrivers, cbNeeded, &cbNeeded))
     874            {
     875                err = GetLastError();
     876                hrc = HRESULT_FROM_WIN32(err);
     877                AssertLogRelMsgFailed(("EnumDeviceDrivers failed, hr=%Rhrc (0x%x) err=%u\n",
     878                                                   hrc, hrc, err));
     879                break;
     880            }
     881        }
     882
     883        LogRel(("Installed Drivers:\n"));
     884
     885        TCHAR szDriver[1024];
     886        int cDrivers = cbNeeded / sizeof(pDrivers[0]);
     887        for (int i = 0; i < cDrivers; i++)
     888        {
     889            if (GetDeviceDriverBaseName(pDrivers[i], szDriver, sizeof(szDriver) / sizeof(szDriver[0])))
     890            {
     891                if (_tcsnicmp(TEXT("vbox"), szDriver, 4))
     892                    continue;
     893            }
     894            else
     895                continue;
     896            if (GetDeviceDriverFileName(pDrivers[i], szDriver, sizeof(szDriver) / sizeof(szDriver[0])))
     897            {
     898                _TCHAR szTmpDrv[1024];
     899                _TCHAR *pszDrv = szDriver;
     900                if (!_tcsncmp(TEXT("\\SystemRoot"), szDriver, 11))
     901                {
     902                    _tcscpy_s(szTmpDrv, pszSystemRoot);
     903                    _tcsncat_s(szTmpDrv, szDriver + 11, sizeof(szTmpDrv) / sizeof(szTmpDrv[0]) - _tclen(pszSystemRoot));
     904                    pszDrv = szTmpDrv;
     905                }
     906                else if (!_tcsncmp(TEXT("\\??\\"), szDriver, 4))
     907                    pszDrv = szDriver + 4;
     908
     909                /* Allocate a buffer for version info. Reuse if large enough. */
     910                DWORD cbNewVerInfo = GetFileVersionInfoSize(pszDrv, NULL);
     911                if (cbNewVerInfo > cbVerInfo)
     912                {
     913                    if (pVerInfo)
     914                        RTMemTmpFree(pVerInfo);
     915                    cbVerInfo = cbNewVerInfo;
     916                    pVerInfo = RTMemTmpAlloc(cbVerInfo);
     917                    if (!pVerInfo)
     918                    {
     919                        AssertLogRelMsgFailed(("RTMemTmpAlloc failed to allocate %d bytes\n", cbVerInfo));
     920                        break;
     921                    }
     922                }
     923                       
     924                if (GetFileVersionInfo(pszDrv, NULL, cbVerInfo, pVerInfo))
     925                {
     926                    UINT   cbSize = 0;
     927                    LPBYTE lpBuffer = NULL;
     928                    if (VerQueryValue(pVerInfo, TEXT("\\"), (VOID FAR* FAR*)&lpBuffer, &cbSize))
     929                    {
     930                        if (cbSize)
     931                        {
     932                            VS_FIXEDFILEINFO *pFileInfo = (VS_FIXEDFILEINFO *)lpBuffer;
     933                            if (pFileInfo->dwSignature == 0xfeef04bd)
     934                            {
     935                                LogRel(("  %ls (Version: %d.%d.%d.%d)\n", pszDrv,
     936                                        (pFileInfo->dwFileVersionMS >> 16) & 0xffff,
     937                                        (pFileInfo->dwFileVersionMS >> 0) & 0xffff,
     938                                        (pFileInfo->dwFileVersionLS >> 16) & 0xffff,
     939                                        (pFileInfo->dwFileVersionLS >> 0) & 0xffff));
     940                            }
     941                        }
     942                    }
     943                }
     944            }
     945        }
     946
     947    }
     948    while (0);
     949
     950    if (pVerInfo)
     951        RTMemTmpFree(pVerInfo);
     952
     953    if (pDrivers != aDrivers)
     954        RTMemTmpFree(pDrivers);
     955
     956    if (pszSystemRoot != szSystemRoot)
     957        RTMemTmpFree(pszSystemRoot);
     958}
     959#else /* !RT_OS_WINDOWS */
     960static void reportDriverVersions(void)
     961{
     962}
     963#endif /* !RT_OS_WINDOWS */
     964
     965
    821966/**
    822967 * Worker for configConstructor.
     
    9101055    ULONG maxNetworkAdapters;
    9111056    hrc = systemProperties->GetMaxNetworkAdapters(chipsetType, &maxNetworkAdapters);        H();
     1057
     1058    reportDriverVersions();
    9121059    /*
    9131060     * Get root node first.
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette