VirtualBox

Changeset 105641 in vbox for trunk/src/VBox/Additions/common


Ignore:
Timestamp:
Aug 9, 2024 6:41:43 PM (7 months ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
164331
Message:

GA/Windows: Do not acquire VMMDEV_GUEST_SUPPORTS_GRAPHICS if an active TS session exists. bugref:10714

File:
1 edited

Legend:

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

    r105527 r105641  
    2525 */
    2626
     27#include <iprt/win/windows.h>
     28#include <wtsapi32.h>
     29#include <ntsecapi.h>
     30
    2731#include <iprt/errcore.h>
    2832
     
    4852static PFND3DKMT_ESCAPE g_pfnD3DKMTEscape;
    4953
     54static decltype(WTSFreeMemory)                 *g_pfnWTSFreeMemory = NULL;
     55static decltype(WTSQuerySessionInformationA)   *g_pfnWTSQuerySessionInformationA = NULL;
     56static decltype(WTSEnumerateSessionsA)         *g_pfnWTSEnumerateSessionsA = NULL;
     57
    5058/**
    5159 * @interface_method_impl{VBOXSERVICE,pfnInit}
     
    6876    }
    6977
    70     VGSvcVerbose(2, "DXGK d3dkmthk callbacks are %s\n", RT_SUCCESS(rc) ? "Ok" : "Fail");
     78    VGSvcVerbose(3, "DXGK d3dkmthk callbacks are %s\n", RT_SUCCESS(rc) ? "Ok" : "Fail");
     79
     80    rc = RTLdrLoadSystem("wtsapi32.dll", true /*fNoUnload*/, &hLdrMod);
     81    if (RT_SUCCESS(rc))
     82    {
     83        rc = RTLdrGetSymbol(hLdrMod, "WTSFreeMemory", (void **)&g_pfnWTSFreeMemory);
     84        if (RT_SUCCESS(rc))
     85            rc = RTLdrGetSymbol(hLdrMod, "WTSQuerySessionInformationA", (void **)&g_pfnWTSQuerySessionInformationA);
     86        if (RT_SUCCESS(rc))
     87            rc = RTLdrGetSymbol(hLdrMod, "WTSEnumerateSessionsA", (void **)&g_pfnWTSEnumerateSessionsA);
     88        AssertRC(rc);
     89        RTLdrClose(hLdrMod);
     90    }
     91
     92    if (RT_FAILURE(rc))
     93    {
     94        VGSvcVerbose(1, "WtsApi32.dll APIs are not available (%Rrc)\n", rc);
     95        g_pfnWTSFreeMemory = NULL;
     96        g_pfnWTSQuerySessionInformationA = NULL;
     97        g_pfnWTSEnumerateSessionsA = NULL;
     98        // Assert(RTSystemGetNtVersion() < RTSYSTEM_MAKE_NT_VERSION(5, 0, 0));
     99    }
    71100
    72101    return VINF_SUCCESS;
     
    85114    }
    86115
    87     VGSvcVerbose(2, "ReconnectDisplays u32Mask 0x%x\n", u32Mask);
     116    VGSvcVerbose(3, "ReconnectDisplays u32Mask 0x%x\n", u32Mask);
    88117
    89118    EnumAdapters.NumAdapters = RT_ELEMENTS(EnumAdapters.Adapters);
    90119    rcNt = g_pfnD3DKMTEnumAdapters(&EnumAdapters);
    91120
    92     VGSvcVerbose(2, "D3DKMTEnumAdapters  rcNt=%#x NumAdapters=%d\n", rcNt, EnumAdapters.NumAdapters);
     121    VGSvcVerbose(3, "D3DKMTEnumAdapters  rcNt=%#x NumAdapters=%d\n", rcNt, EnumAdapters.NumAdapters);
    93122
    94123    for(ULONG id = 0; id < EnumAdapters.NumAdapters; id++)
    95124    {
    96125        D3DKMT_ADAPTERINFO *pAdapterInfo = &EnumAdapters.Adapters[id];
    97         VGSvcVerbose(2, "#%d: NumOfSources=%d hAdapter=0x%p Luid(%u, %u)\n", id,
     126        VGSvcVerbose(3, "#%d: NumOfSources=%d hAdapter=0x%p Luid(%u, %u)\n", id,
    98127            pAdapterInfo->NumOfSources, pAdapterInfo->hAdapter, pAdapterInfo->AdapterLuid.HighPart, pAdapterInfo->AdapterLuid.LowPart);
    99128    }
     
    103132    OpenAdapterData.AdapterLuid = EnumAdapters.Adapters[0].AdapterLuid;
    104133    rcNt = g_pfnD3DKMTOpenAdapterFromLuid(&OpenAdapterData);
    105     VGSvcVerbose(2, "D3DKMTOpenAdapterFromLuid  rcNt=%#x hAdapter=0x%p\n", rcNt, OpenAdapterData.hAdapter);
     134    VGSvcVerbose(3, "D3DKMTOpenAdapterFromLuid  rcNt=%#x hAdapter=0x%p\n", rcNt, OpenAdapterData.hAdapter);
    106135
    107136    hAdapter = OpenAdapterData.hAdapter;
     
    121150
    122151        rcNt = g_pfnD3DKMTEscape(&EscapeData);
    123         VGSvcVerbose(2, "D3DKMTEscape rcNt=%#x\n", rcNt);
     152        VGSvcVerbose(3, "D3DKMTEscape rcNt=%#x\n", rcNt);
    124153
    125154        D3DKMT_CLOSEADAPTER CloseAdapter;
     
    127156
    128157        rcNt = g_pfnD3DKMTCloseAdapter(&CloseAdapter);
    129         VGSvcVerbose(2, "D3DKMTCloseAdapter rcNt=%#x\n", rcNt);
    130     }
     158        VGSvcVerbose(3, "D3DKMTCloseAdapter rcNt=%#x\n", rcNt);
     159    }
     160}
     161
     162static char* WTSSessionState2Str(WTS_CONNECTSTATE_CLASS State)
     163{
     164    switch(State)
     165    {
     166        RT_CASE_RET_STR(WTSActive);
     167        RT_CASE_RET_STR(WTSConnected);
     168        RT_CASE_RET_STR(WTSConnectQuery);
     169        RT_CASE_RET_STR(WTSShadow);
     170        RT_CASE_RET_STR(WTSDisconnected);
     171        RT_CASE_RET_STR(WTSIdle);
     172        RT_CASE_RET_STR(WTSListen);
     173        RT_CASE_RET_STR(WTSReset);
     174        RT_CASE_RET_STR(WTSDown);
     175        RT_CASE_RET_STR(WTSInit);
     176        default:
     177            return "Unknown";
     178    }
     179}
     180
     181bool HasActiveLocalUser(void)
     182{
     183    WTS_SESSION_INFO *paSessionInfos = NULL;
     184    DWORD cSessionInfos = 0;
     185    bool fRet = false;
     186
     187    if (g_pfnWTSEnumerateSessionsA(WTS_CURRENT_SERVER_HANDLE, 0, 1, &paSessionInfos, &cSessionInfos))
     188    {
     189        VGSvcVerbose(3, "WTSEnumerateSessionsA got %u sessions\n", cSessionInfos);
     190
     191        for(DWORD i = 0; i < cSessionInfos; i++)
     192        {
     193            VGSvcVerbose(3, "WTS session[%u] SessionId (%u) pWinStationName (%s) State (%s %u)\n", i,
     194                paSessionInfos[i].SessionId, paSessionInfos[i].pWinStationName,
     195                WTSSessionState2Str(paSessionInfos[i].State), paSessionInfos[i].State);
     196
     197            if (paSessionInfos[i].State == WTSActive && RTStrNICmpAscii(paSessionInfos[i].pWinStationName, RT_STR_TUPLE("Console")) == 0)
     198            {
     199                VGSvcVerbose(2, "Found active WTS session %u connected to Console\n", paSessionInfos[i].SessionId);
     200                fRet = true;
     201            }
     202        }
     203    }
     204    else
     205    {
     206        VGSvcError("WTSEnumerateSessionsA failed %#x\n", GetLastError());
     207    }
     208
     209    if (paSessionInfos)
     210        g_pfnWTSFreeMemory(paSessionInfos);
     211
     212    return fRet;
    131213}
    132214
     
    147229
    148230    rc = VbglR3CtlFilterMask(VMMDEV_EVENT_DISPLAY_CHANGE_REQUEST, 0);
    149     VGSvcVerbose(2, "VbglR3CtlFilterMask set rc=%Rrc\n", rc);
     231    VGSvcVerbose(3, "VbglR3CtlFilterMask set rc=%Rrc\n", rc);
    150232
    151233    for (;;)
     
    153235        uint32_t fEvents = 0;
    154236
    155         rc = VbglR3AcquireGuestCaps(VMMDEV_GUEST_SUPPORTS_GRAPHICS, 0, false);
    156         VGSvcVerbose(2, "VbglR3AcquireGuestCaps acquire VMMDEV_GUEST_SUPPORTS_GRAPHICS rc=%Rrc\n", rc);
    157 
    158         rc = VbglR3WaitEvent(VMMDEV_EVENT_DISPLAY_CHANGE_REQUEST, 1000 /*ms*/, &fEvents);
    159         VGSvcVerbose(2, "VbglR3WaitEvent rc=%Rrc\n", rc);
    160 
    161         if (RT_SUCCESS(rc))
     237        if (HasActiveLocalUser())
    162238        {
    163             VMMDevDisplayDef aDisplays[64];
    164             uint32_t cDisplays = RT_ELEMENTS(aDisplays);
    165 
    166             rc = VbglR3GetDisplayChangeRequestMulti(cDisplays, &cDisplays, &aDisplays[0], true);
    167             VGSvcVerbose(2, "VbglR3GetDisplayChangeRequestMulti rc=%Rrc cDisplays=%d\n", rc, cDisplays);
    168             if (cDisplays > 0)
     239            RTThreadSleep(1000);
     240        }
     241        else
     242        {
     243            rc = VbglR3AcquireGuestCaps(VMMDEV_GUEST_SUPPORTS_GRAPHICS, 0, false);
     244            VGSvcVerbose(3, "VbglR3AcquireGuestCaps acquire VMMDEV_GUEST_SUPPORTS_GRAPHICS rc=%Rrc\n", rc);
     245
     246            rc = VbglR3WaitEvent(VMMDEV_EVENT_DISPLAY_CHANGE_REQUEST, 2000 /*ms*/, &fEvents);
     247            VGSvcVerbose(3, "VbglR3WaitEvent rc=%Rrc\n", rc);
     248
     249            if (RT_SUCCESS(rc))
    169250            {
    170                 for(uint32_t i = 0; i < cDisplays; i++)
     251                VMMDevDisplayDef aDisplays[64];
     252                uint32_t cDisplays = RT_ELEMENTS(aDisplays);
     253
     254                rc = VbglR3GetDisplayChangeRequestMulti(cDisplays, &cDisplays, &aDisplays[0], true);
     255                VGSvcVerbose(3, "VbglR3GetDisplayChangeRequestMulti rc=%Rrc cDisplays=%d\n", rc, cDisplays);
     256                if (cDisplays > 0)
    171257                {
    172                     VGSvcVerbose(2, "Display[%i] flags=%#x (%dx%d)\n", i,
    173                         aDisplays[i].fDisplayFlags,
    174                         aDisplays[i].cx, aDisplays[i].cy);
     258                    for(uint32_t i = 0; i < cDisplays; i++)
     259                    {
     260                        VGSvcVerbose(2, "Display[%i] flags=%#x (%dx%d)\n", i,
     261                            aDisplays[i].fDisplayFlags,
     262                            aDisplays[i].cx, aDisplays[i].cy);
     263                    }
     264
     265                    ReconnectDisplays(cDisplays, &aDisplays[0]);
    175266                }
    176 
    177                 ReconnectDisplays(cDisplays, &aDisplays[0]);
    178267            }
     268
     269            rc = VbglR3AcquireGuestCaps(0, VMMDEV_GUEST_SUPPORTS_GRAPHICS, false);
     270            VGSvcVerbose(3, "VbglR3AcquireGuestCaps release VMMDEV_GUEST_SUPPORTS_GRAPHICS rc=%Rrc\n", rc);
    179271        }
    180 
    181         rc = VbglR3AcquireGuestCaps(0, VMMDEV_GUEST_SUPPORTS_GRAPHICS, false);
    182         VGSvcVerbose(2, "VbglR3AcquireGuestCaps release VMMDEV_GUEST_SUPPORTS_GRAPHICS rc=%Rrc\n", rc);
    183 
    184         RTThreadSleep(1000);
    185272
    186273        if (*pfShutdown)
     
    189276
    190277    rc = VbglR3CtlFilterMask(0, VMMDEV_EVENT_DISPLAY_CHANGE_REQUEST);
    191     VGSvcVerbose(2, "VbglR3CtlFilterMask cleared rc=%Rrc\n", rc);
     278    VGSvcVerbose(3, "VbglR3CtlFilterMask cleared rc=%Rrc\n", rc);
    192279
    193280    return rc;
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