windows-nt/Source/XPSP1/NT/base/fs/rdr2/rdbss/volinfo.c
2020-09-26 16:20:57 +08:00

210 lines
5.3 KiB
C
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*++
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 ( RXCOMMON_SIGNATURE )
/*++
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;
RxCaptureRequestPacket;
RxCaptureFcb;
RxCaptureFobx;
RxCaptureParamBlock;
ULONG OriginalLength = capPARAMS->Parameters.QueryVolume.Length;
FS_INFORMATION_CLASS FsInformationClass = capPARAMS->Parameters.QueryVolume.FsInformationClass;
PVOID OriginalBuffer = capReqPacket->AssociatedIrp.SystemBuffer;
PAGED_CODE();
RxDbgTrace(+1, Dbg, ("RxCommonQueryVolumeInformation...IrpC %08lx, Fobx %08lx, Fcb %08lx\n",
RxContext, capFobx, capFcb));
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,capFcb,capFobx));
RxWmiLog(LOG,
RxCommonQueryVolumeInformation_1,
LOGPTR(RxContext)
LOGPTR(capFcb)
LOGPTR(capFobx));
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,
capFcb->MRxDispatch,
MRxQueryVolumeInfo,
(RxContext));
if (RxContext->PostRequest) {
try_return(Status = RxFsdPostRequest(RxContext));
}
capReqPacket->IoStatus.Information = OriginalLength - RxContext->Info.LengthRemaining;
try_exit:
NOTHING;
} finally {
DebugUnwind( RxCommonQueryVolumeInformation );
}
RxDbgTrace(-1, Dbg, ("RxCommonQueryVolumeInformation -> %08lx,%08lx\n", Status, capReqPacket->IoStatus.Information));
return Status;
}
NTSTATUS
RxCommonSetVolumeInformation ( RXCOMMON_SIGNATURE )
/*++
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;
RxCaptureRequestPacket;
RxCaptureFcb;
RxCaptureFobx;
RxCaptureParamBlock;
TYPE_OF_OPEN TypeOfOpen = NodeType(capFcb);
ULONG Length;
FS_INFORMATION_CLASS FsInformationClass;
PVOID Buffer;
PAGED_CODE();
RxDbgTrace(+1, Dbg, ("RxCommonSetVolumeInformation...IrpC %08lx, Fobx %08lx, Fcb %08lx\n",
RxContext, capFobx, capFcb));
Length = capPARAMS->Parameters.SetVolume.Length;
FsInformationClass = capPARAMS->Parameters.SetVolume.FsInformationClass;
Buffer = capReqPacket->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,capFcb,capFobx));
RxWmiLog(LOG,
RxCommonSetVolumeInformation_1,
LOGPTR(RxContext)
LOGPTR(capFcb)
LOGPTR(capFobx));
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,
capFcb->MRxDispatch,
MRxSetVolumeInfo,
(RxContext));
} finally {
DebugUnwind( RxCommonSetVolumeInformation );
RxDbgTrace(-1, Dbg, ("RxCommonSetVolumeInformation -> %08lx\n", Status));
}
return Status;
}