windows-nt/Source/XPSP1/NT/drivers/parallel/parport2/fdocleanup.c
2020-09-26 16:20:57 +08:00

89 lines
1.9 KiB
C

/*++
Copyright (C) Microsoft Corporation, 1998 - 1999
Module Name:
parport.sys
File Name:
cleanup.c
Abstract:
This file contains the dispatch routine for handling IRP_MJ_CLEANUP.
Exports:
- PptDispatchCleanup() - The dispatch routine for cleanup.
--*/
#include "pch.h"
NTSTATUS
PptFdoCleanup(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
)
/*++dvdf3
Routine Description:
This is the dispatch routine for handling IRP_MJ_CLEANUP IRPs.
This routine cancels all of the IRPs currently queued on
for the specified device.
Arguments:
DeviceObject - Supplies the device object.
Irp - Supplies the cleanup IRP.
Return Value:
STATUS_SUCCESS - Success.
--*/
{
PFDO_EXTENSION fdx = DeviceObject->DeviceExtension;
PIRP nextIrp;
KIRQL cancelIrql;
DD((PCE)fdx,DDT,"PptFdoCleanup\n");
//
// Verify that our device has not been SUPRISE_REMOVED. If we
// have been SUPRISE_REMOVED then we have already cleaned up
// as part of the handling of the surprise removal.
//
if( fdx->PnpState & PPT_DEVICE_SURPRISE_REMOVED ) {
goto targetExit;
}
IoAcquireCancelSpinLock( &cancelIrql );
while( !IsListEmpty( &fdx->WorkQueue ) ) {
nextIrp = CONTAINING_RECORD(fdx->WorkQueue.Blink, IRP, Tail.Overlay.ListEntry);
nextIrp->Cancel = TRUE;
nextIrp->CancelIrql = cancelIrql;
nextIrp->CancelRoutine = NULL;
PptCancelRoutine(DeviceObject, nextIrp);
// need to reacquire because PptCancelRoutine() releases the SpinLock
IoAcquireCancelSpinLock(&cancelIrql);
}
IoReleaseCancelSpinLock( cancelIrql );
targetExit:
return P4CompleteRequest( Irp, STATUS_SUCCESS, 0 );
}