89 lines
1.9 KiB
C
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 );
|
|
}
|