|
|
//+----------------------------------------------------------------------------
//
// 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;
}
|