int VBoxDispMPVHWAQueryInfo(HANDLE hDriver, VHWAQUERYINFO *pInfo) { DWORD dwrc; ULONG cbReturned; LOGF_ENTER(); memset(pInfo, 0, sizeof(VHWAQUERYINFO)); dwrc = EngDeviceIoControl(hDriver, IOCTL_VIDEO_VHWA_QUERY_INFO, NULL, 0, pInfo, sizeof(VHWAQUERYINFO), &cbReturned); VBOX_CHECK_WINERR_RETRC(dwrc, VERR_DEV_IO_ERROR); VBOX_WARN_IOCTLCB_RETRC("IOCTL_VIDEO_VHWA_QUERY_INFO", cbReturned, sizeof(VHWAQUERYINFO), VERR_DEV_IO_ERROR); LOGF_LEAVE(); return VINF_SUCCESS; }
int VBoxDispMPShareVideoMemory(HANDLE hDriver, PVIDEO_SHARE_MEMORY pSMem, PVIDEO_SHARE_MEMORY_INFORMATION pSMemInfo) { DWORD dwrc; ULONG cbReturned; LOGF_ENTER(); dwrc = EngDeviceIoControl(hDriver, IOCTL_VIDEO_SHARE_VIDEO_MEMORY, pSMem, sizeof(VIDEO_SHARE_MEMORY), pSMemInfo, sizeof(VIDEO_SHARE_MEMORY_INFORMATION), &cbReturned); VBOX_CHECK_WINERR_RETRC(dwrc, VERR_DEV_IO_ERROR); VBOX_WARN_IOCTLCB_RETRC("IOCTL_VIDEO_SHARE_VIDEO_MEMORY", cbReturned, sizeof(VIDEO_SHARE_MEMORY_INFORMATION), VERR_DEV_IO_ERROR); LOGF_LEAVE(); return VINF_SUCCESS; }
int VBoxDispMPHGSMIQueryPortProcs(HANDLE hDriver, HGSMIQUERYCPORTPROCS *pPortProcs) { DWORD dwrc; ULONG cbReturned; LOGF_ENTER(); memset(pPortProcs, 0, sizeof(HGSMIQUERYCPORTPROCS)); dwrc = EngDeviceIoControl(hDriver, IOCTL_VIDEO_HGSMI_QUERY_PORTPROCS, NULL, 0, pPortProcs, sizeof(HGSMIQUERYCPORTPROCS), &cbReturned); VBOX_CHECK_WINERR_RETRC(dwrc, VERR_DEV_IO_ERROR); VBOX_WARN_IOCTLCB_RETRC("IOCTL_VIDEO_HGSMI_QUERY_PORTPROCS", cbReturned, sizeof(HGSMIQUERYCPORTPROCS), VERR_DEV_IO_ERROR); LOGF_LEAVE(); return VINF_SUCCESS; }
int VBoxDispMPQueryHGSMICallbacks(HANDLE hDriver, HGSMIQUERYCALLBACKS *pCallbacks) { DWORD dwrc; ULONG cbReturned; LOGF_ENTER(); memset(pCallbacks, 0, sizeof(HGSMIQUERYCALLBACKS)); dwrc = EngDeviceIoControl(hDriver, IOCTL_VIDEO_HGSMI_QUERY_CALLBACKS, NULL, 0, pCallbacks, sizeof(HGSMIQUERYCALLBACKS), &cbReturned); VBOX_CHECK_WINERR_RETRC(dwrc, VERR_DEV_IO_ERROR); VBOX_WARN_IOCTLCB_RETRC("IOCTL_VIDEO_HGSMI_QUERY_CALLBACKS", cbReturned, sizeof(HGSMIQUERYCALLBACKS), VERR_DEV_IO_ERROR); LOGF_LEAVE(); return VINF_SUCCESS; }
/* Query miniport for mouse pointer caps */ int VBoxDispMPGetPointerCaps(HANDLE hDriver, PVIDEO_POINTER_CAPABILITIES pCaps) { DWORD dwrc; ULONG cbReturned; LOGF_ENTER(); memset(pCaps, 0, sizeof(VIDEO_POINTER_CAPABILITIES)); dwrc = EngDeviceIoControl(hDriver, IOCTL_VIDEO_QUERY_POINTER_CAPABILITIES, NULL, 0, pCaps, sizeof(VIDEO_POINTER_CAPABILITIES), &cbReturned); VBOX_CHECK_WINERR_RETRC(dwrc, VERR_DEV_IO_ERROR); VBOX_WARN_IOCTLCB_RETRC("IOCTL_VIDEO_QUERY_POINTER_CAPABILITIES", cbReturned, sizeof(VIDEO_POINTER_CAPABILITIES), VERR_DEV_IO_ERROR); LOGF_LEAVE(); return VINF_SUCCESS; }
int VBoxDispMPQueryRegistryFlags(HANDLE hDriver, ULONG *pulFlags) { DWORD dwrc; ULONG cbReturned; ULONG ulInfoLevel; LOGF_ENTER(); *pulFlags = 0; ulInfoLevel = VBOXVIDEO_INFO_LEVEL_REGISTRY_FLAGS; dwrc = EngDeviceIoControl(hDriver, IOCTL_VIDEO_QUERY_VBOXVIDEO_INFO, &ulInfoLevel, sizeof(DWORD), pulFlags, sizeof(DWORD), &cbReturned); VBOX_CHECK_WINERR_RETRC(dwrc, VERR_DEV_IO_ERROR); VBOX_WARN_IOCTLCB_RETRC("IOCTL_VIDEO_QUERY_INFO", cbReturned, sizeof(DWORD), VERR_DEV_IO_ERROR); if (*pulFlags != 0) LogRel(("VBoxDisp: video flags 0x%08X\n", *pulFlags)); LOGF_LEAVE(); return VINF_SUCCESS; }
/* Map device framebuffer and VRAM to our virtual address space */ int VBoxDispMPMapMemory(PVBOXDISPDEV pDev, PVIDEO_MEMORY_INFORMATION pMemInfo) { DWORD dwrc; ULONG cbReturned; VIDEO_MEMORY vMem; VIDEO_MEMORY_INFORMATION vMemInfo; LOGF_ENTER(); Assert(!pDev->memInfo.FrameBufferBase && !pDev->memInfo.VideoRamBase); vMem.RequestedVirtualAddress = NULL; dwrc = EngDeviceIoControl(pDev->hDriver, IOCTL_VIDEO_MAP_VIDEO_MEMORY, &vMem, sizeof(vMem), &vMemInfo, sizeof(vMemInfo), &cbReturned); VBOX_CHECK_WINERR_RETRC(dwrc, VERR_DEV_IO_ERROR); VBOX_WARN_IOCTLCB_RETRC("IOCTL_VIDEO_MAP_VIDEO_MEMORY", cbReturned, sizeof(vMemInfo), VERR_DEV_IO_ERROR); if (vMemInfo.FrameBufferBase != vMemInfo.VideoRamBase) { WARN(("FrameBufferBase!=VideoRamBase.")); return VERR_GENERAL_FAILURE; } /* Check if we can access mapped memory */ uint32_t magic = (*(ULONG *)vMemInfo.FrameBufferBase == 0xDEADF00D) ? 0xBAADF00D : 0xDEADF00D; ASMAtomicWriteU32((uint32_t *)vMemInfo.FrameBufferBase, magic); if (ASMAtomicReadU32((uint32_t *)vMemInfo.FrameBufferBase) != magic) { WARN(("can't write to framebuffer memory!")); return VERR_GENERAL_FAILURE; } memcpy(pMemInfo, &vMemInfo, sizeof(vMemInfo)); LOGF_LEAVE(); return VINF_SUCCESS; }