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.
 
 
 
 
 
 

359 lines
7.3 KiB

/*++
Copyright (c) 1989 Microsoft Corporation
Module Name:
close.c
Abstract:
This module implements the file close routine for MUP.
Author:
Manny Weiser (mannyw) 28-Dec-1991
Revision History:
--*/
#include "mup.h"
//
// The debug trace level
//
#define Dbg (DEBUG_TRACE_CLOSE)
NTSTATUS
MupCloseVcb (
IN PMUP_DEVICE_OBJECT MupDeviceObject,
IN PIRP Irp,
IN PVCB Vcb,
IN PFILE_OBJECT FileObject
);
NTSTATUS
MupCloseFcb (
IN PMUP_DEVICE_OBJECT MupDeviceObject,
IN PIRP Irp,
IN PFCB Fcb,
IN PFILE_OBJECT FileObject
);
#ifdef ALLOC_PRAGMA
#pragma alloc_text( PAGE, MupClose )
#pragma alloc_text( PAGE, MupCloseFcb )
#pragma alloc_text( PAGE, MupCloseVcb )
#endif
NTSTATUS
MupClose (
IN PMUP_DEVICE_OBJECT MupDeviceObject,
IN PIRP Irp
)
/*++
Routine Description:
This routine implements the close IRP.
Arguments:
MupDeviceObject - Supplies the device object to use.
Irp - Supplies the Irp being processed
Return Value:
NTSTATUS - The status for the IRP.
--*/
{
NTSTATUS status;
PIO_STACK_LOCATION irpSp;
PVOID fsContext, fsContext2;
PFILE_OBJECT FileObject;
PAGED_CODE();
DebugTrace(+1, Dbg, "MupClose\n", 0);
if (MupEnableDfs) {
if ((MupDeviceObject->DeviceObject.DeviceType == FILE_DEVICE_DFS) ||
(MupDeviceObject->DeviceObject.DeviceType ==
FILE_DEVICE_DFS_FILE_SYSTEM)) {
status = DfsFsdClose((PDEVICE_OBJECT) MupDeviceObject, Irp);
return( status );
}
}
FsRtlEnterFileSystem();
try {
//
// Get the current stack location
//
irpSp = IoGetCurrentIrpStackLocation( Irp );
FileObject = irpSp->FileObject;
MUP_TRACE_HIGH(TRACE_IRP, MupClose_Entry,
LOGPTR(MupDeviceObject)
LOGPTR(Irp)
LOGPTR(FileObject));
DebugTrace(+1, Dbg, "MupClose...\n", 0);
DebugTrace( 0, Dbg, " Irp = %08lx\n", (ULONG)Irp);
//
// Decode the file object to figure out who we are.
//
(PVOID)MupDecodeFileObject( irpSp->FileObject,
&fsContext,
&fsContext2 );
if ( fsContext == NULL ) {
DebugTrace(0, Dbg, "The file is disconnected\n", 0);
MupCompleteRequest( Irp, STATUS_INVALID_HANDLE );
status = STATUS_INVALID_HANDLE;
MUP_TRACE_HIGH(ERROR, MupClose_Error1,
LOGSTATUS(status)
LOGPTR(MupDeviceObject)
LOGPTR(FileObject)
LOGPTR(Irp));
DebugTrace(-1, Dbg, "MupClose -> %08lx\n", status );
FsRtlExitFileSystem();
return status;
}
//
// Ignore the return code from MupDecode. Parse the fsContext
// to decide how to process the close IRP.
//
switch ( BlockType( fsContext ) ) {
case BlockTypeVcb:
status = MupCloseVcb( MupDeviceObject,
Irp,
(PVCB)fsContext,
irpSp->FileObject
);
//
// Complete the close IRP.
//
MupCompleteRequest( Irp, STATUS_SUCCESS );
break;
case BlockTypeFcb:
//
// MupDecodeFileObject bumped the refcount on the fcb,
// so we decrement that extra ref here.
//
MupDereferenceFcb((PFCB)fsContext);
status = MupCloseFcb( MupDeviceObject,
Irp,
(PFCB)fsContext,
irpSp->FileObject
);
//
// Complete the close IRP.
//
MupCompleteRequest( Irp, STATUS_SUCCESS );
break;
#ifdef MUPDBG
default:
//
// This is not one of ours.
//
KeBugCheckEx( FILE_SYSTEM, 1, 0, 0, 0 );
break;
#else
default:
//
// Complete the IRP with an error
//
MupCompleteRequest(Irp,STATUS_INVALID_HANDLE);
status = STATUS_INVALID_HANDLE;
MUP_TRACE_HIGH(ERROR, MupClose_Error2,
LOGSTATUS(status)
LOGPTR(MupDeviceObject)
LOGPTR(FileObject)
LOGPTR(Irp));
break;
#endif
}
} except ( EXCEPTION_EXECUTE_HANDLER ) {
status = GetExceptionCode();
}
FsRtlExitFileSystem();
MUP_TRACE_HIGH(TRACE_IRP, MupClose_Exit,
LOGSTATUS(status)
LOGPTR(MupDeviceObject)
LOGPTR(FileObject)
LOGPTR(Irp));
DebugTrace(-1, Dbg, "MupClose -> %08lx\n", status);
return status;
}
NTSTATUS
MupCloseVcb (
IN PMUP_DEVICE_OBJECT MupDeviceObject,
IN PIRP Irp,
IN PVCB Vcb,
IN PFILE_OBJECT FileObject
)
/*++
Routine Description:
This routine closes the a file object that had opened the file system.
Arguments:
MupDeviceObject - Supplies a pointer to our device object.
Irp - Supplies the IRP associate with the close.
Vcb - Supplies the VCB for the MUP.
FileObject - Supplies the file object being closed.
Return Value:
NTSTATUS - STATUS_SUCCESS
--*/
{
Irp;
PAGED_CODE();
DebugTrace(+1, Dbg, "MupCloseVcb, Vcb = %08lx\n", (ULONG)Vcb);
//
// Acquire exclusive access to the VCB.
//
MupAcquireGlobalLock();
try {
//
// Clear the referenced pointer to the VCB in the file object
// and derefence the VCB.
//
ASSERT ( FileObject->FsContext == Vcb );
MupSetFileObject( FileObject, NULL, NULL );
MupDereferenceVcb( Vcb );
} finally {
MupReleaseGlobalLock( );
DebugTrace(-1, Dbg, "MupCloseVcb -> STATUS_SUCCESS\n", 0);
}
//
// Return to the caller.
//
return STATUS_SUCCESS;
}
NTSTATUS
MupCloseFcb (
IN PMUP_DEVICE_OBJECT MupDeviceObject,
IN PIRP Irp,
IN PFCB Fcb,
IN PFILE_OBJECT FileObject
)
/*++
Routine Description:
This routine closes the a file control block.
Arguments:
MupDeviceObject - Supplies a pointer to our device object.
Irp - Supplies the IRP associate with the close.
Fcb - Supplies the FCB to close.
FileObject - Supplies the file object being closed.
Return Value:
NTSTATUS - STATUS_SUCCESS
--*/
{
MupDeviceObject; Irp;
PAGED_CODE();
DebugTrace(+1, Dbg, "MupCloseFcb, Fcb = %08lx\n", (ULONG)Fcb);
//
// Acquire exclusive access to the VCB.
//
MupAcquireGlobalLock();
try {
//
// Clear the referenced pointer to the VCB in the file object
// and derefence the VCB.
//
ASSERT ( FileObject->FsContext == Fcb );
MupSetFileObject( FileObject, NULL, NULL );
MupDereferenceFcb( Fcb );
} finally {
MupReleaseGlobalLock( );
DebugTrace(-1, Dbg, "MupCloseFcb -> STATUS_SUCCESS\n", 0);
}
//
// Return to the caller.
//
return STATUS_SUCCESS;
}