360 lines
7.3 KiB
C
360 lines
7.3 KiB
C
|
/*++
|
|||
|
|
|||
|
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;
|
|||
|
}
|