/** * Perform pending wake ups in work loop context. */ static void deferredInterruptHandler(OSObject *pOwner, IOInterruptEventSource *pSrc, int cInts) { NOREF(pOwner); NOREF(pSrc); NOREF(cInts); VBoxGuestWaitDoWakeUps(&g_DevExt); }
/** * DPC handler. * * @param pDPC DPC descriptor. * @param pDevObj Device object. * @param pIrp Interrupt request packet. * @param pContext Context specific pointer. */ void vboxguestwinDpcHandler(PKDPC pDPC, PDEVICE_OBJECT pDevObj, PIRP pIrp, PVOID pContext) { PVBOXGUESTDEVEXT pDevExt = (PVBOXGUESTDEVEXT)pDevObj->DeviceExtension; Log(("VBoxGuest::vboxguestwinGuestDpcHandler: pDevExt=0x%p\n", pDevExt)); /* test & reset the counter */ if (ASMAtomicXchgU32(&pDevExt->u32MousePosChangedSeq, 0)) { Assert(KeGetCurrentIrql() == DISPATCH_LEVEL); /* we need a lock here to avoid concurrency with the set event ioctl handler thread, * i.e. to prevent the event from destroyed while we're using it */ KeAcquireSpinLockAtDpcLevel(&pDevExt->win.s.MouseEventAccessLock); if (pDevExt->win.s.pfnMouseNotify) { pDevExt->win.s.pfnMouseNotify(pDevExt->win.s.pvMouseNotify); } KeReleaseSpinLockFromDpcLevel(&pDevExt->win.s.MouseEventAccessLock); } /* Process the wake-up list we were asked by the scheduling a DPC * in vboxguestwinIsrHandler(). */ VBoxGuestWaitDoWakeUps(pDevExt); }