mirror of https://github.com/tongzx/nt5src
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
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
|
|
|