Ejemplo n.º 1
0
/**
 * 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);
}