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.
 
 
 
 
 
 

210 lines
4.3 KiB

/*++
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