Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

210 lines
5.7 KiB

/*++
Copyright (c) 1989 Microsoft Corporation
Module Name:
VolInfo.c
Abstract:
This module implements the volume information routines for Rx called by
the dispatch driver.
Author:
Joe Linn [JoeLinn] 5-oct-94
Revision History:
--*/
#include "precomp.h"
#pragma hdrstop
//
// The local debug trace level
//
#define Dbg (DEBUG_TRACE_VOLINFO)
#ifdef ALLOC_PRAGMA
#pragma alloc_text(PAGE, RxCommonQueryVolumeInformation)
#pragma alloc_text(PAGE, RxCommonSetVolumeInformation)
#endif
NTSTATUS
RxCommonQueryVolumeInformation (
IN PRX_CONTEXT RxContext,
IN PIRP Irp
)
/*++
Routine Description:
This is the common routine for querying volume information called by both
the fsd and fsp threads.
Arguments:
Irp - Supplies the Irp being processed
Return Value:
NTSTATUS - The return status for the operation
--*/
{
NTSTATUS Status;
PFCB Fcb;
PFOBX Fobx;
PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation( Irp );
ULONG OriginalLength = IrpSp->Parameters.QueryVolume.Length;
FS_INFORMATION_CLASS FsInformationClass = IrpSp->Parameters.QueryVolume.FsInformationClass;
PVOID OriginalBuffer = Irp->AssociatedIrp.SystemBuffer;
PAGED_CODE();
RxDecodeFileObject( IrpSp->FileObject, &Fcb, &Fobx );
RxDbgTrace( +1, Dbg, ("RxCommonQueryVolumeInformation...IrpC %08lx, Fobx %08lx, Fcb %08lx\n",
RxContext, Fobx, Fcb) );
RxDbgTrace( 0, Dbg, ("->Length = %08lx\n", OriginalLength) );
RxDbgTrace( 0, Dbg, ("->FsInformationClass = %08lx\n", FsInformationClass) );
RxDbgTrace( 0, Dbg, ("->Buffer = %08lx\n", OriginalBuffer) );
RxLog(( "QueryVolInfo %lx %lx %lx\n", RxContext, Fcb, Fobx ));
RxWmiLog( LOG,
RxCommonQueryVolumeInformation_1,
LOGPTR(RxContext )
LOGPTR(Fcb )
LOGPTR(Fobx ) );
RxLog(( " alsoqvi %lx %lx %lx\n", OriginalLength, FsInformationClass, OriginalBuffer ));
RxWmiLog( LOG,
RxCommonQueryVolumeInformation_2,
LOGULONG( OriginalLength )
LOGULONG( FsInformationClass )
LOGPTR( OriginalBuffer ) );
try {
RxContext->Info.FsInformationClass = FsInformationClass;
RxContext->Info.Buffer = OriginalBuffer;
RxContext->Info.LengthRemaining = OriginalLength;
MINIRDR_CALL( Status,
RxContext,
Fcb->MRxDispatch,
MRxQueryVolumeInfo,
(RxContext) );
if (RxContext->PostRequest) {
Status = RxFsdPostRequest( RxContext );
} else {
Irp->IoStatus.Information = OriginalLength - RxContext->Info.LengthRemaining;
}
} finally {
DebugUnwind( RxCommonQueryVolumeInformation );
}
RxDbgTrace( -1, Dbg, ("RxCommonQueryVolumeInformation -> %08lx,%08lx\n", Status, Irp->IoStatus.Information) );
return Status;
}
NTSTATUS
RxCommonSetVolumeInformation (
IN PRX_CONTEXT RxContext,
IN PIRP Irp
)
/*++
Routine Description:
This is the common routine for setting Volume Information called by both
the fsd and fsp threads.
Arguments:
Irp - Supplies the Irp being processed
Return Value:
RXSTATUS - The return status for the operation
--*/
{
NTSTATUS Status = STATUS_NOT_IMPLEMENTED;
PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation( Irp );
PFCB Fcb;
PFOBX Fobx;
TYPE_OF_OPEN TypeOfOpen;
ULONG Length;
FS_INFORMATION_CLASS FsInformationClass;
PVOID Buffer;
PAGED_CODE();
TypeOfOpen = RxDecodeFileObject( IrpSp->FileObject, &Fcb, &Fobx );
RxDbgTrace( +1, Dbg, ("RxCommonSetVolumeInformation...IrpC %08lx, Fobx %08lx, Fcb %08lx\n",
RxContext, Fobx, Fcb) );
Length = IrpSp->Parameters.SetVolume.Length;
FsInformationClass = IrpSp->Parameters.SetVolume.FsInformationClass;
Buffer = Irp->AssociatedIrp.SystemBuffer;
RxDbgTrace( 0, Dbg, ("->Length = %08lx\n", Length) );
RxDbgTrace( 0, Dbg, ("->FsInformationClass = %08lx\n", FsInformationClass) );
RxDbgTrace( 0, Dbg, ("->Buffer = %08lx\n", Buffer) );
RxLog(( "SetVolInfo %lx %lx %lx\n", RxContext, Fcb, Fobx ));
RxWmiLog( LOG,
RxCommonSetVolumeInformation_1,
LOGPTR( RxContext )
LOGPTR( Fcb )
LOGPTR( Fobx ) );
RxLog(( " alsosvi %lx %lx %lx\n", Length, FsInformationClass, Buffer ));
RxWmiLog( LOG,
RxCommonSetVolumeInformation_2,
LOGULONG( Length )
LOGULONG( FsInformationClass )
LOGPTR( Buffer ) );
try {
//
// Based on the information class we'll do different actions. Each
// of the procedures that we're calling performs the action if
// possible and returns true if it successful and false if it couldn't
// wait for any I/O to complete.
//
RxContext->Info.FsInformationClass = FsInformationClass;
RxContext->Info.Buffer = Buffer;
RxContext->Info.LengthRemaining = Length;
MINIRDR_CALL( Status,
RxContext,
Fcb->MRxDispatch,
MRxSetVolumeInfo,
(RxContext) );
} finally {
DebugUnwind( RxCommonSetVolumeInformation );
RxDbgTrace( -1, Dbg, ("RxCommonSetVolumeInformation -> %08lx\n", Status) );
}
return Status;
}