166 lines
4.4 KiB
C
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;
|
||
|
|
||
|
}
|
||
|
|
||
|
|