Source code of Windows XP (NT5)
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
/*++
Copyright (c) 1998-2001 Microsoft Corporation
Module Name:
close.cxx
Abstract:
This module contains code for cleanup and close IRPs.
Author:
Keith Moore (keithmo) 10-Jun-1998
Revision History:
--*/
#include "precomp.h"
#ifdef ALLOC_PRAGMA
#pragma alloc_text( PAGE, UlClose )
#endif // ALLOC_PRAGMA
#if 0
NOT PAGEABLE -- UlCleanup #endif
//
// Public functions.
//
/***************************************************************************++
Routine Description:
This is the routine that handles Cleanup IRPs in UL. Cleanup IRPs are issued after the last handle to the file object is closed.
Arguments:
pDeviceObject - Supplies a pointer to the target device object.
pIrp - Supplies a pointer to IO request packet.
Return Value:
NTSTATUS - Completion status.
--***************************************************************************/ NTSTATUS UlCleanup( IN PDEVICE_OBJECT pDeviceObject, IN PIRP pIrp ) {
NTSTATUS status; PIO_STACK_LOCATION pIrpSp;
UL_ENTER_DRIVER( "UlCleanup", pIrp );
//
// Snag the current IRP stack pointer.
//
pIrpSp = IoGetCurrentIrpStackLocation( pIrp );
IF_DEBUG( OPEN_CLOSE ) { KdPrint(( "UlCleanup: cleanup on file object %lx\n", pIrpSp->FileObject )); }
//
// app pool or control channel?
//
if (pDeviceObject == g_pUlAppPoolDeviceObject && IS_APP_POOL( pIrpSp->FileObject )) { //
// app pool, let's detach this process from the app pool
//
status = UlDetachProcessFromAppPool( GET_APP_POOL_PROCESS(pIrpSp->FileObject) );
MARK_INVALID_APP_POOL( pIrpSp->FileObject ); } else if (pDeviceObject == g_pUlFilterDeviceObject && IS_FILTER_PROCESS( pIrpSp->FileObject )) { //
// filter channel
//
status = UlDetachFilterProcess( GET_FILTER_PROCESS(pIrpSp->FileObject) );
MARK_INVALID_FILTER_CHANNEL( pIrpSp->FileObject ); } else if (IS_CONTROL_CHANNEL( pIrpSp->FileObject )) { status = UlCloseControlChannel( GET_CONTROL_CHANNEL(pIrpSp->FileObject) );
MARK_INVALID_CONTROL_CHANNEL( pIrpSp->FileObject ); } else { status = STATUS_INVALID_DEVICE_REQUEST; }
pIrp->IoStatus.Status = status;
UlCompleteRequest( pIrp, g_UlPriorityBoost );
UL_LEAVE_DRIVER( "UlCleanup" ); RETURN(status);
} // UlCleanup
/***************************************************************************++
Routine Description:
This is the routine that handles Close IRPs in UL. Close IRPs are issued after the last reference to the file object is removed.
Arguments:
pDeviceObject - Supplies a pointer to the target device object.
pIrp - Supplies a pointer to IO request packet.
Return Value:
NTSTATUS - Completion status.
--***************************************************************************/ NTSTATUS UlClose( IN PDEVICE_OBJECT pDeviceObject, IN PIRP pIrp ) {
NTSTATUS status; PIO_STACK_LOCATION pIrpSp;
UNREFERENCED_PARAMETER( pDeviceObject );
//
// Sanity check.
//
PAGED_CODE(); UL_ENTER_DRIVER( "UlClose", pIrp );
status = STATUS_SUCCESS;
//
// Snag the current IRP stack pointer.
//
pIrpSp = IoGetCurrentIrpStackLocation( pIrp );
//
// If it's an App Pool or filter channel we have to delete
// the associated object.
//
if (pDeviceObject == g_pUlAppPoolDeviceObject && IS_EX_APP_POOL( pIrpSp->FileObject )) { UlFreeAppPoolProcess(GET_APP_POOL_PROCESS(pIrpSp->FileObject)); } else if (pDeviceObject == g_pUlFilterDeviceObject && IS_EX_FILTER_PROCESS( pIrpSp->FileObject )) { UlFreeFilterProcess(GET_FILTER_PROCESS(pIrpSp->FileObject)); }
IF_DEBUG( OPEN_CLOSE ) { KdPrint(( "UlClose: closing file object %lx\n", pIrpSp->FileObject )); }
pIrp->IoStatus.Status = status;
UlCompleteRequest( pIrp, g_UlPriorityBoost );
UL_LEAVE_DRIVER( "UlClose" ); RETURN(status);
} // UlClose
|