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