Changeset 105641 in vbox for trunk/src/VBox/Additions/common
- Timestamp:
- Aug 9, 2024 6:41:43 PM (7 months ago)
- svn:sync-xref-src-repo-rev:
- 164331
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Additions/common/VBoxService/VBoxServiceDisplayConfig.cpp
r105527 r105641 25 25 */ 26 26 27 #include <iprt/win/windows.h> 28 #include <wtsapi32.h> 29 #include <ntsecapi.h> 30 27 31 #include <iprt/errcore.h> 28 32 … … 48 52 static PFND3DKMT_ESCAPE g_pfnD3DKMTEscape; 49 53 54 static decltype(WTSFreeMemory) *g_pfnWTSFreeMemory = NULL; 55 static decltype(WTSQuerySessionInformationA) *g_pfnWTSQuerySessionInformationA = NULL; 56 static decltype(WTSEnumerateSessionsA) *g_pfnWTSEnumerateSessionsA = NULL; 57 50 58 /** 51 59 * @interface_method_impl{VBOXSERVICE,pfnInit} … … 68 76 } 69 77 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 } 71 100 72 101 return VINF_SUCCESS; … … 85 114 } 86 115 87 VGSvcVerbose( 2, "ReconnectDisplays u32Mask 0x%x\n", u32Mask);116 VGSvcVerbose(3, "ReconnectDisplays u32Mask 0x%x\n", u32Mask); 88 117 89 118 EnumAdapters.NumAdapters = RT_ELEMENTS(EnumAdapters.Adapters); 90 119 rcNt = g_pfnD3DKMTEnumAdapters(&EnumAdapters); 91 120 92 VGSvcVerbose( 2, "D3DKMTEnumAdapters rcNt=%#x NumAdapters=%d\n", rcNt, EnumAdapters.NumAdapters);121 VGSvcVerbose(3, "D3DKMTEnumAdapters rcNt=%#x NumAdapters=%d\n", rcNt, EnumAdapters.NumAdapters); 93 122 94 123 for(ULONG id = 0; id < EnumAdapters.NumAdapters; id++) 95 124 { 96 125 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, 98 127 pAdapterInfo->NumOfSources, pAdapterInfo->hAdapter, pAdapterInfo->AdapterLuid.HighPart, pAdapterInfo->AdapterLuid.LowPart); 99 128 } … … 103 132 OpenAdapterData.AdapterLuid = EnumAdapters.Adapters[0].AdapterLuid; 104 133 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); 106 135 107 136 hAdapter = OpenAdapterData.hAdapter; … … 121 150 122 151 rcNt = g_pfnD3DKMTEscape(&EscapeData); 123 VGSvcVerbose( 2, "D3DKMTEscape rcNt=%#x\n", rcNt);152 VGSvcVerbose(3, "D3DKMTEscape rcNt=%#x\n", rcNt); 124 153 125 154 D3DKMT_CLOSEADAPTER CloseAdapter; … … 127 156 128 157 rcNt = g_pfnD3DKMTCloseAdapter(&CloseAdapter); 129 VGSvcVerbose(2, "D3DKMTCloseAdapter rcNt=%#x\n", rcNt); 130 } 158 VGSvcVerbose(3, "D3DKMTCloseAdapter rcNt=%#x\n", rcNt); 159 } 160 } 161 162 static 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 181 bool 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; 131 213 } 132 214 … … 147 229 148 230 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); 150 232 151 233 for (;;) … … 153 235 uint32_t fEvents = 0; 154 236 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()) 162 238 { 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)) 169 250 { 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) 171 257 { 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]); 175 266 } 176 177 ReconnectDisplays(cDisplays, &aDisplays[0]);178 267 } 268 269 rc = VbglR3AcquireGuestCaps(0, VMMDEV_GUEST_SUPPORTS_GRAPHICS, false); 270 VGSvcVerbose(3, "VbglR3AcquireGuestCaps release VMMDEV_GUEST_SUPPORTS_GRAPHICS rc=%Rrc\n", rc); 179 271 } 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);185 272 186 273 if (*pfShutdown) … … 189 276 190 277 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); 192 279 193 280 return rc;
Note:
See TracChangeset
for help on using the changeset viewer.