VBoxMPCm.cpp revision 3c5c04d7b0973be0757addef8ba44b9352b38386
29bdc01040c07a3dd482a94a2cb8f0a90f8587a7vboxsync * VBox WDDM Miniport driver
29bdc01040c07a3dd482a94a2cb8f0a90f8587a7vboxsync * Copyright (C) 2011 Oracle Corporation
29bdc01040c07a3dd482a94a2cb8f0a90f8587a7vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
29bdc01040c07a3dd482a94a2cb8f0a90f8587a7vboxsync * available from http://www.virtualbox.org. This file is free software;
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * you can redistribute it and/or modify it under the terms of the GNU
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * General Public License (GPL) as published by the Free Software
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
29bdc01040c07a3dd482a94a2cb8f0a90f8587a7vboxsynctypedef enum
29bdc01040c07a3dd482a94a2cb8f0a90f8587a7vboxsync VBOXVIDEOCM_CMD_CTL_KM_TYPE_DUMMY_32BIT = 0x7fffffff
29bdc01040c07a3dd482a94a2cb8f0a90f8587a7vboxsynctypedef DECLCALLBACK(VOID) FNVBOXVIDEOCM_CMD_CB(PVBOXVIDEOCM_CTX pContext, struct VBOXVIDEOCM_CMD_CTL_KM *pCmd, PVOID pvContext);
29bdc01040c07a3dd482a94a2cb8f0a90f8587a7vboxsynctypedef FNVBOXVIDEOCM_CMD_CB *PFNVBOXVIDEOCM_CMD_CB;
8e034cd2a6b0c86697554278e970163287003bb9vboxsyncAssertCompile(VBOXWDDM_ROUNDBOUND(RT_OFFSETOF(VBOXVIDEOCM_CMD_DR, CmdHdr), 8) == RT_OFFSETOF(VBOXVIDEOCM_CMD_DR, CmdHdr));
8e034cd2a6b0c86697554278e970163287003bb9vboxsync#define VBOXVIDEOCM_HEADER_SIZE() (VBOXWDDM_ROUNDBOUND(sizeof (VBOXVIDEOCM_CMD_DR), 8))
8e034cd2a6b0c86697554278e970163287003bb9vboxsync#define VBOXVIDEOCM_SIZE_FROMBODYSIZE(_s) (VBOXVIDEOCM_HEADER_SIZE() + (_s))
8e034cd2a6b0c86697554278e970163287003bb9vboxsync//#define VBOXVIDEOCM_SIZE(_t) (VBOXVIDEOCM_SIZE_FROMBODYSIZE(sizeof (_t)))
8e034cd2a6b0c86697554278e970163287003bb9vboxsync#define VBOXVIDEOCM_BODY(_pCmd, _t) ( (_t*)(((uint8_t*)(_pCmd)) + VBOXVIDEOCM_HEADER_SIZE()) )
8e034cd2a6b0c86697554278e970163287003bb9vboxsync#define VBOXVIDEOCM_HEAD(_pCmd) ( (PVBOXVIDEOCM_CMD_DR)(((uint8_t*)(_pCmd)) - VBOXVIDEOCM_HEADER_SIZE()) )
8e034cd2a6b0c86697554278e970163287003bb9vboxsync#define VBOXVIDEOCM_SENDSIZE_FROMBODYSIZE(_s) ( VBOXVIDEOCM_SIZE_FROMBODYSIZE(_s) - RT_OFFSETOF(VBOXVIDEOCM_CMD_DR, CmdHdr))
29bdc01040c07a3dd482a94a2cb8f0a90f8587a7vboxsync//#define VBOXVIDEOCM_BODY_FIELD_OFFSET(_ot, _t, _f) ( (_ot)( VBOXVIDEOCM_BODY(0, uint8_t) + RT_OFFSETOF(_t, _f) ) )
29bdc01040c07a3dd482a94a2cb8f0a90f8587a7vboxsync /* contexts in this session */
29bdc01040c07a3dd482a94a2cb8f0a90f8587a7vboxsync /* contexts in this session */
29bdc01040c07a3dd482a94a2cb8f0a90f8587a7vboxsync /* commands list */
089c21a647af46044cad04a78cfdcfae814d2105vboxsync /* post process commands list */
089c21a647af46044cad04a78cfdcfae814d2105vboxsync /* event used to notify UMD about pending commands */
8e034cd2a6b0c86697554278e970163287003bb9vboxsync /* sync lock */
8e034cd2a6b0c86697554278e970163287003bb9vboxsync /* indicates whether event signaling is needed on cmd add */
8e034cd2a6b0c86697554278e970163287003bb9vboxsync#define VBOXCMENTRY_2_CMD(_pE) ((PVBOXVIDEOCM_CMD_DR)((uint8_t*)(_pE) - RT_OFFSETOF(VBOXVIDEOCM_CMD_DR, QueueList)))
29bdc01040c07a3dd482a94a2cb8f0a90f8587a7vboxsyncvoid* vboxVideoCmCmdReinitForContext(void *pvCmd, PVBOXVIDEOCM_CTX pContext)
29bdc01040c07a3dd482a94a2cb8f0a90f8587a7vboxsync PVBOXVIDEOCM_CMD_DR pHdr = VBOXVIDEOCM_HEAD(pvCmd);
29bdc01040c07a3dd482a94a2cb8f0a90f8587a7vboxsyncvoid* vboxVideoCmCmdCreate(PVBOXVIDEOCM_CTX pContext, uint32_t cbSize)
8e034cd2a6b0c86697554278e970163287003bb9vboxsync uint32_t cbCmd = VBOXVIDEOCM_SIZE_FROMBODYSIZE(cbSize);
8e034cd2a6b0c86697554278e970163287003bb9vboxsync PVBOXVIDEOCM_CMD_DR pCmd = (PVBOXVIDEOCM_CMD_DR)vboxWddmMemAllocZero(cbCmd);
8e034cd2a6b0c86697554278e970163287003bb9vboxsync pCmd->cbMaxCmdSize = VBOXVIDEOCM_SENDSIZE_FROMBODYSIZE(cbSize);
8e034cd2a6b0c86697554278e970163287003bb9vboxsyncstatic PVBOXVIDEOCM_CMD_CTL_KM vboxVideoCmCmdCreateKm(PVBOXVIDEOCM_CTX pContext, VBOXVIDEOCM_CMD_CTL_KM_TYPE enmType,
PVBOXVIDEOCM_CMD_CTL_KM pCmd = (PVBOXVIDEOCM_CMD_CTL_KM)vboxVideoCmCmdCreate(pContext, cbSize + sizeof (*pCmd));
return pCmd;
static DECLCALLBACK(VOID) vboxVideoCmCmdCbSetEventAndDereference(PVBOXVIDEOCM_CTX pContext, PVBOXVIDEOCM_CMD_CTL_KM pCmd, PVOID pvContext)
PVBOXVIDEOCM_CMD_CTL_KM pCmd = vboxVideoCmCmdCreateKm(pContext, VBOXVIDEOCM_CMD_CTL_KM_TYPE_POST_INVOKE,
if (!pCmd)
return STATUS_NO_MEMORY;
return STATUS_SUCCESS;
if (!cRefs)
static void vboxVideoCmCmdPostByHdr(PVBOXVIDEOCM_SESSION pSession, PVBOXVIDEOCM_CMD_DR pHdr, uint32_t cbSize)
bool bSignalEvent = false;
bSignalEvent = true;
if (bSignalEvent)
NTSTATUS vboxVideoCmCmdVisit(PVBOXVIDEOCM_CTX pContext, BOOLEAN bEntireSession, PFNVBOXVIDEOCMCMDVISITOR pfnVisitor, PVOID pvVisitor)
return STATUS_SUCCESS;
static void vboxVideoCmSessionCtxAddLocked(PVBOXVIDEOCM_SESSION pSession, PVBOXVIDEOCM_CTX pContext)
static void vboxVideoCmSessionCtxDetachCmdsLocked(PLIST_ENTRY pEntriesHead, PVBOXVIDEOCM_CTX pContext, PLIST_ENTRY pDstHead)
bool bDestroy;
if (bDestroy)
if (bDestroy)
return bDestroy;
NTSTATUS vboxVideoCmSessionCreateLocked(PVBOXVIDEOCM_MGR pMgr, PVBOXVIDEOCM_SESSION *ppSession, PKEVENT pUmEvent, PVBOXVIDEOCM_CTX pContext)
PVBOXVIDEOCM_SESSION pSession = (PVBOXVIDEOCM_SESSION)vboxWddmMemAllocZero(sizeof (VBOXVIDEOCM_SESSION));
if (pSession)
return STATUS_SUCCESS;
return Status;
#define VBOXCMENTRY_2_SESSION(_pE) ((PVBOXVIDEOCM_SESSION)((uint8_t*)(_pE) - RT_OFFSETOF(VBOXVIDEOCM_SESSION, QueueEntry)))
NTSTATUS vboxVideoCmCtxAdd(PVBOXVIDEOCM_MGR pMgr, PVBOXVIDEOCM_CTX pContext, HANDLE hUmEvent, uint64_t u64UmData)
NTSTATUS Status = ObReferenceObjectByHandle(hUmEvent, EVENT_MODIFY_STATE, *ExEventObjectType, UserMode,
NULL);
bool bFound = false;
for (PLIST_ENTRY pEntry = pMgr->SessionList.Flink; pEntry != &pMgr->SessionList; pEntry = pEntry->Flink)
bFound = true;
if (!bFound)
return STATUS_SUCCESS;
return Status;
if (!pSession)
return STATUS_SUCCESS;
return Status;
return STATUS_SUCCESS;
return STATUS_SUCCESS;
NTSTATUS vboxVideoCmEscape(PVBOXVIDEOCM_CTX pContext, PVBOXDISPIFESCAPE_GETVBOXVIDEOCMCMD pCmd, uint32_t cbCmd)
return STATUS_BUFFER_TOO_SMALL;
bool bDetachMode = true;
if (bDetachMode)
bDetachMode = false;
case VBOXVIDEOCM_CMD_TYPE_UM:
return STATUS_SUCCESS;
for (PLIST_ENTRY pEntry = pMgr->SessionList.Flink; pEntry != &pMgr->SessionList; pEntry = pEntry->Flink)
return TRUE;
return FALSE;
if (!cIters)
--cIters;
return Status;
return STATUS_SUCCESS;
if (!cIters)
--cIters;
if (!cIters)
return STATUS_TIMEOUT;