void VBoxSeamlessCheckWindows() { VBOX_ENUM_PARAM param; param.hdc = GetDC(HWND_DESKTOP); param.hrgn = 0; EnumWindows(VBoxEnumFunc, (LPARAM)¶m); if (param.hrgn) { DWORD cbSize; cbSize = GetRegionData(param.hrgn, 0, NULL); if (cbSize) { PVBOXDISPIFESCAPE lpEscapeData = (PVBOXDISPIFESCAPE)malloc(VBOXDISPIFESCAPE_SIZE(cbSize)); if (lpEscapeData) { lpEscapeData->escapeCode = VBOXESC_SETVISIBLEREGION; LPRGNDATA lpRgnData = VBOXDISPIFESCAPE_DATA(lpEscapeData, RGNDATA); memset(lpRgnData, 0, cbSize); cbSize = GetRegionData(param.hrgn, cbSize, lpRgnData); if (cbSize) { #ifdef DEBUG RECT *lpRect = (RECT *)&lpRgnData->Buffer[0]; Log(("VBoxTray: New visible region: \n")); for (DWORD i=0;i<lpRgnData->rdh.nCount;i++) { Log(("VBoxTray: visible rect (%d,%d)(%d,%d)\n", lpRect[i].left, lpRect[i].top, lpRect[i].right, lpRect[i].bottom)); } #endif LPRGNDATA lpCtxRgnData = VBOXDISPIFESCAPE_DATA(gCtx.lpEscapeData, RGNDATA); if ( !gCtx.lpEscapeData || (lpCtxRgnData->rdh.dwSize + lpCtxRgnData->rdh.nRgnSize != cbSize) || memcmp(lpCtxRgnData, lpRgnData, cbSize)) { /* send to display driver */ VBoxDispIfEscape(&gCtx.pEnv->dispIf, lpEscapeData, cbSize); if (gCtx.lpEscapeData) free(gCtx.lpEscapeData); gCtx.lpEscapeData = lpEscapeData; } else Log(("VBoxTray: Visible rectangles haven't changed; ignore\n")); } if (lpEscapeData != gCtx.lpEscapeData) free(lpEscapeData); } } DeleteObject(param.hrgn); } ReleaseDC(HWND_DESKTOP, param.hdc); }
static bool vboxWddmReinitVideoModes(VBOXDISPLAYCONTEXT *pCtx) { VBOXDISPIFESCAPE escape = {0}; escape.escapeCode = VBOXESC_REINITVIDEOMODES; DWORD err = VBoxDispIfEscape(&pCtx->pEnv->dispIf, &escape, 0); if (err != NO_ERROR) { Log((__FUNCTION__": VBoxDispIfEscape failed with err (%d)\n", err)); return false; } return true; }
void VBoxRestoreCheckVRDP() { VBOXDISPIFESCAPE escape = {0}; escape.escapeCode = VBOXESC_ISVRDPACTIVE; /* Check VRDP activity. */ /* Send to display driver. */ DWORD dwRet = VBoxDispIfEscape(&gCtx.pEnv->dispIf, &escape, 0); Log(("VBoxTray: VBoxRestoreCheckVRDP -> VRDP activate state = %d\n", dwRet)); if (dwRet != gCtx.fRDPState) { DWORD cbReturnIgnored; if (!DeviceIoControl(gCtx.pEnv->hDriver, dwRet == NO_ERROR ? VBOXGUEST_IOCTL_ENABLE_VRDP_SESSION : VBOXGUEST_IOCTL_DISABLE_VRDP_SESSION, NULL, 0, NULL, 0, &cbReturnIgnored, NULL)) { Log(("VBoxTray: VBoxRestoreCheckVRDP: DeviceIOControl failed, error = %ld\n", GetLastError())); } gCtx.fRDPState = dwRet; } }