|
|
//+----------------------------------------------------------------------------
//
// Copyright (C) 1992, Microsoft Corporation.
//
// File: ATTACH.C
//
// Contents: This module contains routines for managing attached file
// systems.
//
// Functions:
//
// History: 15 May 1992 PeterCo Created.
//
//-----------------------------------------------------------------------------
#include "dfsprocs.h"
#include "mupwml.h"
#define Dbg (DEBUG_TRACE_ATTACH)
#ifdef ALLOC_PRAGMA
//
// The following are not pageable since they can be called at DPC level
//
// DfsVolumePassThrough
// DfsFilePassThrough
//
#endif // ALLOC_PRAGMA
//+-------------------------------------------------------------------
//
// Function: DfsVolumePassThrough, public
//
// Synopsis: This is the main FSD routine that passes a request
// on to an attached-to device, or to a redirected
// file.
//
// Arguments: [DeviceObject] -- Supplies a pointer to the Dfs device
// object this request was aimed at.
// [Irp] -- Supplies a pointer to the I/O request packet.
//
// Returns: [STATUS_INVALID_DEVICE_REQUEST] -- If the DeviceObject
// argument is of unknown type, or the type of file
// is invalid for the request being performed.
//
// NT Status from calling the underlying file system that
// opened the file.
//
//--------------------------------------------------------------------
NTSTATUS DfsVolumePassThrough( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ) { NTSTATUS Status = STATUS_SUCCESS; PIO_STACK_LOCATION IrpSp; PIO_STACK_LOCATION NextIrpSp; PFILE_OBJECT FileObject;
DfsDbgTrace(+1, Dbg, "DfsVolumePassThrough: Entered\n", 0);
IrpSp = IoGetCurrentIrpStackLocation(Irp); FileObject = IrpSp->FileObject; MUP_TRACE_HIGH(TRACE_IRP, DfsVolumePassThrough_Entry, LOGPTR(DeviceObject) LOGPTR(Irp) LOGPTR(FileObject));
DfsDbgTrace(0, Dbg, "DeviceObject = %x\n", DeviceObject); DfsDbgTrace(0, Dbg, "Irp = %x\n", Irp ); DfsDbgTrace(0, Dbg, " MajorFunction = %x\n", IrpSp->MajorFunction ); DfsDbgTrace(0, Dbg, " MinorFunction = %x\n", IrpSp->MinorFunction );
if (DeviceObject->DeviceType == FILE_DEVICE_DFS && IrpSp->FileObject != NULL) {
TYPE_OF_OPEN TypeOfOpen; PDFS_VCB Vcb; PDFS_FCB Fcb;
TypeOfOpen = DfsDecodeFileObject( IrpSp->FileObject, &Vcb, &Fcb);
DfsDbgTrace(0, Dbg, "Fcb = %08lx\n", Fcb);
if (TypeOfOpen == RedirectedFileOpen) {
//
// Copy the stack from one to the next...
//
NextIrpSp = IoGetNextIrpStackLocation(Irp);
(*NextIrpSp) = (*IrpSp);
IoSetCompletionRoutine(Irp, NULL, NULL, FALSE, FALSE, FALSE);
//
// ...and call the next device
//
Status = IoCallDriver( Fcb->TargetDevice, Irp ); MUP_TRACE_ERROR_HIGH(Status, ALL_ERROR, DfsVolumePassThrough_Error_IoCallDriver, LOGSTATUS(Status) LOGPTR(Irp) LOGPTR(FileObject) LOGPTR(DeviceObject));
} else {
DfsDbgTrace(0, Dbg, "DfsVolumePassThrough: TypeOfOpen = %s\n", ((TypeOfOpen == UnopenedFileObject) ? "UnopenedFileObject": (TypeOfOpen == LogicalRootDeviceOpen) ? "LogicalRootDeviceOpen" : "???"));
DfsDbgTrace(0, Dbg, "Irp = %x\n", Irp);
DfsDbgTrace(0, Dbg, " MajorFunction = %x\n", IrpSp->MajorFunction);
DfsDbgTrace(0, Dbg, " MinorFunction = %x\n", IrpSp->MinorFunction);
Status = STATUS_INVALID_DEVICE_REQUEST; MUP_TRACE_HIGH(ERROR, DfsVolumePassThrough_Error1, LOGSTATUS(Status) LOGPTR(Irp) LOGPTR(FileObject) LOGPTR(DeviceObject));
Irp->IoStatus.Status = Status;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
}
} else {
DfsDbgTrace(0, Dbg, "DfsVolumePassThrough: Unexpected Dev = %x\n", DeviceObject);
Status = STATUS_INVALID_DEVICE_REQUEST;
MUP_TRACE_HIGH(ERROR, DfsVolumePassThrough_Error2, LOGSTATUS(Status) LOGPTR(Irp) LOGPTR(FileObject) LOGPTR(DeviceObject)); Irp->IoStatus.Status = Status;
IoCompleteRequest(Irp, IO_NO_INCREMENT); }
DfsDbgTrace(-1, Dbg, "DfsVolumePassThrough: Exit -> %08lx\n", ULongToPtr(Status));
MUP_TRACE_HIGH(TRACE_IRP, DfsVolumePassThrough_Exit, LOGSTATUS(Status) LOGPTR(Irp) LOGPTR(FileObject) LOGPTR(DeviceObject)); return Status; }
//+-------------------------------------------------------------------
//
// Function: DfsFilePassThrough, public
//
// Synopsis: Like DfsVolumePassThrough, but used when the file object
// has already been looked up, and the FCB for the file is
// already known. This is needed especially in close processing
// to avoid a race between DfsLookupFcb (for a reused file object)
// and DfsDetachFcb.
//
// Arguments: [pFcb] -- A pointer to an FCB for the file.
// [Irp] -- A pointer to the I/O request packet.
//
// Returns: NTSTATUS - the return value from IoCallDriver.
//
//--------------------------------------------------------------------
NTSTATUS DfsFilePassThrough( IN PDFS_FCB pFcb, IN PIRP Irp ) { NTSTATUS Status = STATUS_SUCCESS; PIO_STACK_LOCATION IrpSp; PIO_STACK_LOCATION NextIrpSp;
DfsDbgTrace(+1, Dbg, "DfsFilePassThrough: Entered\n", 0);
IrpSp = IoGetCurrentIrpStackLocation(Irp);
//
// Copy the stack from one to the next...
//
NextIrpSp = IoGetNextIrpStackLocation(Irp);
(*NextIrpSp) = (*IrpSp);
IoSetCompletionRoutine(Irp, NULL, NULL, FALSE, FALSE, FALSE);
//
// ...and call the next device
//
Status = IoCallDriver( pFcb->TargetDevice, Irp );
MUP_TRACE_ERROR_HIGH(Status, ALL_ERROR, DfsFilePassThrough_Error_IoCallDriver, LOGSTATUS(Status) LOGPTR(Irp)); DfsDbgTrace(-1, Dbg, "DfsFilePassThrough: Exit -> %08lx\n", ULongToPtr(Status));
return Status; }
|