/* Called for IOCTL_VIDEO_QUERY_AVAIL_MODES. * Returns information about supported video modes. */ BOOLEAN VBoxMPQueryAvailModes(PVBOXMP_DEVEXT pExt, PVIDEO_MODE_INFORMATION pModes, PSTATUS_BLOCK pStatus) { LOGF_ENTER(); ULONG ulSize = VBoxMPXpdmGetVideoModesCount()*sizeof(VIDEO_MODE_INFORMATION); pStatus->Information = ulSize; VideoPortMoveMemory(pModes, VBoxMPCmnGetVideoModeInfo(0), ulSize); LOGF_LEAVE(); return TRUE; }
/* Called for IOCTL_VIDEO_SET_CURRENT_MODE. * Sets adapter video mode. */ BOOLEAN VBoxMPSetCurrentMode(PVBOXMP_DEVEXT pExt, PVIDEO_MODE pMode, PSTATUS_BLOCK pStatus) { ULONG RequestedMode; VIDEO_MODE_INFORMATION *pModeInfo; LOGF(("mode=%#x", pMode->RequestedMode)); /* Get requested mode info */ RequestedMode = pMode->RequestedMode & ~(VIDEO_MODE_NO_ZERO_MEMORY|VIDEO_MODE_MAP_MEM_LINEAR); if (RequestedMode!=pMode->RequestedMode) { WARN(("ignoring set VIDEO_MODE_NO_ZERO_MEMORY or VIDEO_MODE_MAP_MEM_LINEAR")); } pModeInfo = VBoxMPCmnGetVideoModeInfo(RequestedMode-1); if (!pModeInfo) { pStatus->Status = ERROR_INVALID_PARAMETER; return FALSE; } LOG(("screen [%d] mode %d width %d, height %d, bpp %d", pExt->iDevice, pModeInfo->ModeIndex, pModeInfo->VisScreenWidth, pModeInfo->VisScreenHeight, pModeInfo->BitsPerPlane)); /* Update device info */ pExt->CurrentMode = RequestedMode; pExt->CurrentModeWidth = pModeInfo->VisScreenWidth; pExt->CurrentModeHeight = pModeInfo->VisScreenHeight; pExt->CurrentModeBPP = pModeInfo->BitsPerPlane; if (pExt->iDevice>0) { LOG(("skipping non-primary display %d", pExt->iDevice)); return TRUE; } /* Perform actual mode switch */ VBoxVideoSetModeRegisters((USHORT)pModeInfo->VisScreenWidth, (USHORT)pModeInfo->VisScreenHeight, (USHORT)pModeInfo->VisScreenWidth, (USHORT)pModeInfo->BitsPerPlane, 0, 0, 0); /*@todo read back from port to check if mode switch was successful */ LOGF_LEAVE(); return TRUE; }
VIDEO_MODE_INFORMATION* VBoxMPXpdmCurrentVideoMode(PVBOXMP_DEVEXT pExt) { return VBoxMPCmnGetVideoModeInfo(pExt, pExt->CurrentMode - 1); }