VirtualBox

Ignore:
Timestamp:
Jul 2, 2013 8:16:43 AM (12 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
86884
Message:

VBoxDisp,VBoxVideo,VBoxControl: registry flags to tweak the Windows guest graphics driver.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/common/VBoxControl/VBoxControl.cpp

    r46895 r46896  
    7676    GET_VIDEO_ACCEL,
    7777    SET_VIDEO_ACCEL,
     78    VIDEO_FLAGS,
    7879    LIST_CUST_MODES,
    7980    ADD_CUST_MODE,
     
    113114    if (eWhich  == SET_VIDEO_ACCEL || eWhich == USAGE_ALL)
    114115        doUsage("<on|off>", g_pszProgName, "setvideoacceleration");
     116    if (eWhich  == VIDEO_FLAGS || eWhich == USAGE_ALL)
     117        doUsage("<get|set|clear|delete> [hex mask]", g_pszProgName, "videoflags");
    115118    if (eWhich  == LIST_CUST_MODES || eWhich == USAGE_ALL)
    116119        doUsage("", g_pszProgName, "listcustommodes");
     
    779782    }
    780783    return RTEXITCODE_SUCCESS;
     784}
     785
     786static RTEXITCODE videoFlagsGet(void)
     787{
     788    HKEY hkeyVideo = getVideoKey(false);
     789
     790    if (hkeyVideo)
     791    {
     792        DWORD dwFlags = 0;
     793        DWORD len = sizeof(dwFlags);
     794        DWORD dwKeyType;
     795        ULONG status = RegQueryValueExA(hkeyVideo, "VBoxVideoFlags", NULL, &dwKeyType, (LPBYTE)&dwFlags, &len);
     796        if (status != ERROR_SUCCESS)
     797            RTPrintf("Video flags: default\n");
     798        else
     799            RTPrintf("Video flags: 0x%08X\n", dwFlags);
     800        RegCloseKey(hkeyVideo);
     801        return RTEXITCODE_SUCCESS;
     802    }
     803
     804    return RTEXITCODE_FAILURE;
     805}
     806
     807static RTEXITCODE videoFlagsDelete(void)
     808{
     809    HKEY hkeyVideo = getVideoKey(true);
     810
     811    if (hkeyVideo)
     812    {
     813        ULONG status = RegDeleteValueA(hkeyVideo, "VBoxVideoFlags");
     814        if (status != ERROR_SUCCESS)
     815            VBoxControlError("Error %d deleting video flags.\n", status);
     816        RegCloseKey(hkeyVideo);
     817        return RTEXITCODE_SUCCESS;
     818    }
     819
     820    return RTEXITCODE_FAILURE;
     821}
     822
     823static RTEXITCODE videoFlagsModify(bool fSet, int argc, char *argv[])
     824{
     825    if (argc != 1)
     826    {
     827        VBoxControlError("Mask required.\n");
     828        return RTEXITCODE_FAILURE;
     829    }
     830
     831    uint32_t u32Mask = 0;
     832    int rc = RTStrToUInt32Full(argv[0], 16, &u32Mask);
     833    if (RT_FAILURE(rc))
     834    {
     835        VBoxControlError("Invalid video flags mask.\n");
     836        return RTEXITCODE_FAILURE;
     837    }
     838
     839    RTEXITCODE exitCode = RTEXITCODE_SUCCESS;
     840
     841    HKEY hkeyVideo = getVideoKey(true);
     842    if (hkeyVideo)
     843    {
     844        DWORD dwFlags = 0;
     845        DWORD len = sizeof(dwFlags);
     846        DWORD dwKeyType;
     847        ULONG status = RegQueryValueExA(hkeyVideo, "VBoxVideoFlags", NULL, &dwKeyType, (LPBYTE)&dwFlags, &len);
     848        if (status != ERROR_SUCCESS)
     849        {
     850            dwFlags = 0;
     851        }
     852
     853        dwFlags = fSet? (dwFlags | u32Mask):
     854                        (dwFlags & ~u32Mask);
     855
     856        status = RegSetValueExA(hkeyVideo, "VBoxVideoFlags", 0, REG_DWORD, (LPBYTE)&dwFlags, sizeof(dwFlags));
     857        if (status != ERROR_SUCCESS)
     858        {
     859            VBoxControlError("Error %d writing video flags.\n", status);
     860            exitCode = RTEXITCODE_FAILURE;
     861        }
     862
     863        RegCloseKey(hkeyVideo);
     864    }
     865    else
     866    {
     867        exitCode = RTEXITCODE_FAILURE;
     868    }
     869
     870    return exitCode;
     871}
     872
     873static RTEXITCODE handleVideoFlags(int argc, char *argv[])
     874{
     875    /* Must have a keyword and optional value (32 bit hex string). */
     876    if (argc != 1 && argc != 2)
     877    {
     878        VBoxControlError("Invalid number of arguments.\n");
     879        usage(VIDEO_FLAGS);
     880        return RTEXITCODE_FAILURE;
     881    }
     882
     883    RTEXITCODE exitCode = RTEXITCODE_SUCCESS;
     884
     885    if (RTStrICmp(argv[0], "get") == 0)
     886    {
     887        exitCode = videoFlagsGet();
     888    }
     889    else if (RTStrICmp(argv[0], "delete") == 0)
     890    {
     891        exitCode = videoFlagsDelete();
     892    }
     893    else if (RTStrICmp(argv[0], "set") == 0)
     894    {
     895        exitCode = videoFlagsModify(true, argc - 1, &argv[1]);
     896    }
     897    else if (RTStrICmp(argv[0], "clear") == 0)
     898    {
     899        exitCode = videoFlagsModify(false, argc - 1, &argv[1]);
     900    }
     901    else
     902    {
     903        VBoxControlError("Invalid command.\n");
     904        exitCode = RTEXITCODE_FAILURE;
     905    }
     906
     907    if (exitCode != RTEXITCODE_SUCCESS)
     908    {
     909        usage(VIDEO_FLAGS);
     910    }
     911
     912    return exitCode;
    781913}
    782914
     
    16631795    { "getvideoacceleration",   handleGetVideoAcceleration },
    16641796    { "setvideoacceleration",   handleSetVideoAcceleration },
     1797    { "videoflags",             handleVideoFlags },
    16651798    { "listcustommodes",        handleListCustomModes },
    16661799    { "addcustommode",          handleAddCustomMode },
Note: See TracChangeset for help on using the changeset viewer.

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