windows-nt/Source/XPSP1/NT/base/fs/dfs/driver/close.c
2020-09-26 16:20:57 +08:00

166 lines
4.4 KiB
C

//+----------------------------------------------------------------------------
//
// Copyright (C) 1992, Microsoft Corporation.
//
// File: close.c
//
// Contents: This module implements the File Close and Cleanup routines for
// the Dfs server.
//
// Functions: DfsFsdClose - FSD entry point for Close IRP
// DfsFsdCleanup - FSD entry point for Cleanup IRP
//
//-----------------------------------------------------------------------------
#include "dfsprocs.h"
#include "attach.h"
#include "dfswml.h"
//
// The local debug trace level
//
#define Dbg (DEBUG_TRACE_CLOSE)
#ifdef ALLOC_PRAGMA
#pragma alloc_text( PAGE, DfsFsdClose )
#pragma alloc_text( PAGE, DfsFsdCleanup )
#endif // ALLOC_PRAGMA
//+-------------------------------------------------------------------
//
// Function: DfsFsdClose, public
//
// Synopsis: This routine implements the FSD part of closing down the
// last reference to a file object.
//
// Arguments: [DeviceObject] -- Supplies the device object where the
// file being closed exists
// [Irp] - Supplies the Irp being processed
//
// Returns: NTSTATUS - The FSD status for the IRP
//
//--------------------------------------------------------------------
NTSTATUS
DfsFsdClose (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
) {
PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation( Irp );
PFILE_OBJECT FileObject = IrpSp->FileObject;
NTSTATUS Status;
DebugTrace(+1, Dbg, "DfsFsdClose: Entered\n", 0);
DFS_TRACE_HIGH(TRACE_IRP, DfsFsdClose_Entry,
LOGPTR(FileObject)
LOGPTR(Irp));
if (DeviceObject->DeviceType == FILE_DEVICE_DFS_VOLUME) {
PDFS_FCB fcb;
fcb = DfsLookupFcb( IrpSp->FileObject );
if (fcb != NULL) {
DfsDetachFcb( IrpSp->FileObject, fcb );
DfsDestroyFcb( fcb );
}
}
if (DeviceObject->DeviceType == FILE_DEVICE_DFS_VOLUME ||
DeviceObject->DeviceType == FILE_DEVICE_DISK_FILE_SYSTEM) {
Status = DfsVolumePassThrough(DeviceObject, Irp);
DebugTrace(-1, Dbg, "DfsFsdClose: Pass Through Exit %08lx\n", ULongToPtr( Status ));
return Status;
}
ASSERT(DeviceObject->DeviceType == FILE_DEVICE_DFS_FILE_SYSTEM);
ASSERT(IrpSp->FileObject->FsContext == UIntToPtr( DFS_OPEN_CONTEXT ));
Status = STATUS_SUCCESS;
DebugTrace(-1, Dbg, "DfsFsdClose: Exit -> %08lx\n", ULongToPtr( Status ));
DfsCompleteRequest( Irp, Status );
DFS_TRACE_HIGH(TRACE_IRP, DfsFsdClose_Exit,
LOGSTATUS(Status)
LOGPTR(FileObject)
LOGPTR(Irp));
return Status;
}
//+-------------------------------------------------------------------
//
// Function: DfsFsdCleanup, public
//
// Synopsis: This routine implements the FSD part of closing down the
// last user handle to a file object.
//
// Arguments: [DeviceObject] -- Supplies the device object where the
// file being closed exists
// [Irp] - Supplies the Irp being processed
//
// Returns: NTSTATUS - The FSD status for the IRP
//
//--------------------------------------------------------------------
NTSTATUS
DfsFsdCleanup (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
) {
PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation( Irp );
PFILE_OBJECT FileObject = IrpSp->FileObject;
NTSTATUS Status;
DebugTrace(+1, Dbg, "DfsFsdCleanup: Entered\n", 0);
DFS_TRACE_HIGH(TRACE_IRP, DfsFsdCleanup_Entry,
LOGPTR(FileObject)
LOGPTR(Irp));
if (DeviceObject->DeviceType == FILE_DEVICE_DFS_VOLUME ||
DeviceObject->DeviceType == FILE_DEVICE_DISK_FILE_SYSTEM) {
Status = DfsVolumePassThrough(DeviceObject, Irp);
DebugTrace(-1, Dbg, "DfsFsdCleanup: Pass Through Exit %08lx\n", ULongToPtr( Status ));
return Status;
}
ASSERT(DeviceObject->DeviceType == FILE_DEVICE_DFS_FILE_SYSTEM);
ASSERT(IrpSp->FileObject->FsContext == UIntToPtr( DFS_OPEN_CONTEXT ));
Status = STATUS_SUCCESS;
DebugTrace(-1, Dbg, "DfsFsdCleanup: Exit -> %08lx\n", ULongToPtr( Status ));
DfsCompleteRequest( Irp, Status );
DFS_TRACE_HIGH(TRACE_IRP, DfsFsdCleanup_Exit,
LOGSTATUS(Status)
LOGPTR(FileObject)
LOGPTR(Irp));
return Status;
}