Beispiel #1
0
/* UserDetachMonitor
 *
 * Deletes a MONITOR and removes it from the list of monitors.
 *
 * Arguments
 *
 *   pGdiDevice  Pointer to the PDEVOBJ from which the monitor was detached
 *
 * Return value
 *   Returns a NTSTATUS
 */
NTSTATUS NTAPI
UserDetachMonitor(IN HDEV hDev)
{
    PMONITOR pMonitor = gMonitorList, *pLink = &gMonitorList;

    /* Find monitor attached to given device */
    while (pMonitor != NULL)
    {
        if (pMonitor->hDev == hDev)
            break;

        pLink = &pMonitor->pMonitorNext;
        pMonitor = pMonitor->pMonitorNext;
    }

    if (pMonitor == NULL)
    {
        /* No monitor has been found */
        return STATUS_INVALID_PARAMETER;
    }

    /* We destroy primary monitor - set next as primary */
    if (pMonitor->IsPrimary && pMonitor->pMonitorNext != NULL)
        pMonitor->pMonitorNext->IsPrimary = TRUE;

    /* Update Next ptr in previous monitor */
    *pLink = pMonitor->pMonitorNext;

    /* Finally destroy monitor */
    IntDestroyMonitorObject(pMonitor);

    return STATUS_SUCCESS;
}
Beispiel #2
0
/* IntDetachMonitor
 *
 * Deletes a MONITOR and removes it from the list of monitors.
 *
 * Arguments
 *
 *   pGdiDevice  Pointer to the PDEVOBJ from which the monitor was detached
 *
 * Return value
 *   Returns a NTSTATUS
 */
NTSTATUS
IntDetachMonitor(IN PDEVOBJ *pGdiDevice)
{
    PMONITOR Monitor;

    for (Monitor = gMonitorList; Monitor != NULL; Monitor = Monitor->Next)
    {
        if (Monitor->GdiDevice == pGdiDevice)
            break;
    }

    if (Monitor == NULL)
    {
        /* no monitor for given device found */
        return STATUS_INVALID_PARAMETER;
    }

    if (Monitor->IsPrimary && (Monitor->Next != NULL || Monitor->Prev != NULL))
    {
        PMONITOR NewPrimaryMonitor = (Monitor->Prev != NULL) ? (Monitor->Prev) : (Monitor->Next);

        ExEnterCriticalRegionAndAcquireFastMutexUnsafe(&NewPrimaryMonitor->Lock);
        NewPrimaryMonitor->IsPrimary = TRUE;
        ExReleaseFastMutexUnsafeAndLeaveCriticalRegion(&NewPrimaryMonitor->Lock);
    }

    if (gMonitorList == Monitor)
    {
        gMonitorList = Monitor->Next;
        if (Monitor->Next != NULL)
            Monitor->Next->Prev = NULL;
    }
    else
    {
        Monitor->Prev->Next = Monitor->Next;
        if (Monitor->Next != NULL)
            Monitor->Next->Prev = Monitor->Prev;
    }

    if (Monitor->hrgnMonitor)
        GreDeleteObject(Monitor->hrgnMonitor);

    IntDestroyMonitorObject(Monitor);

    return STATUS_SUCCESS;
}