209 lines
4 KiB
C
209 lines
4 KiB
C
/*++
|
||
|
||
Copyright (c) 1989 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
FileInfo.c
|
||
|
||
Abstract:
|
||
|
||
This module implements the File Information routines for Raw called by
|
||
the dispatch driver.
|
||
|
||
Author:
|
||
|
||
David Goebel [DavidGoe] 13-May-1991
|
||
|
||
Revision History:
|
||
|
||
--*/
|
||
|
||
#include "RawProcs.h"
|
||
|
||
#ifdef ALLOC_PRAGMA
|
||
#pragma alloc_text(PAGE, RawQueryInformation)
|
||
#pragma alloc_text(PAGE, RawSetInformation)
|
||
#endif
|
||
|
||
NTSTATUS
|
||
RawQueryInformation (
|
||
IN PVCB Vcb,
|
||
IN PIRP Irp,
|
||
PIO_STACK_LOCATION IrpSp
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This is the routine for querying file information, though only
|
||
query current file position is supported.
|
||
|
||
Arguments:
|
||
|
||
Vcb - Supplies the volume being queried.
|
||
|
||
Irp - Supplies the Irp being processed.
|
||
|
||
IrpSp - Supplies parameters describing the query
|
||
|
||
|
||
Return Value:
|
||
|
||
NTSTATUS - The return status for the operation
|
||
|
||
--*/
|
||
|
||
{
|
||
NTSTATUS Status;
|
||
|
||
PULONG Length;
|
||
FILE_INFORMATION_CLASS FileInformationClass;
|
||
PFILE_POSITION_INFORMATION Buffer;
|
||
|
||
PAGED_CODE();
|
||
|
||
//
|
||
// Reference our input parameters to make things easier
|
||
//
|
||
|
||
Length = &IrpSp->Parameters.QueryFile.Length;
|
||
FileInformationClass = IrpSp->Parameters.QueryFile.FileInformationClass;
|
||
Buffer = Irp->AssociatedIrp.SystemBuffer;
|
||
|
||
//
|
||
// The only request that is valid for raw is to query file position.
|
||
//
|
||
|
||
if ( FileInformationClass == FilePositionInformation ) {
|
||
|
||
//
|
||
// Make sure the buffer is large enough
|
||
//
|
||
|
||
if (*Length < sizeof(FILE_POSITION_INFORMATION)) {
|
||
|
||
Irp->IoStatus.Information = 0;
|
||
|
||
Status = STATUS_BUFFER_OVERFLOW;
|
||
|
||
} else {
|
||
|
||
//
|
||
// Get the current position found in the file object.
|
||
//
|
||
|
||
Buffer->CurrentByteOffset = IrpSp->FileObject->CurrentByteOffset;
|
||
|
||
//
|
||
// Update the length, irp info, and status output variables
|
||
//
|
||
|
||
*Length -= sizeof( FILE_POSITION_INFORMATION );
|
||
|
||
Irp->IoStatus.Information = sizeof( FILE_POSITION_INFORMATION );
|
||
|
||
Status = STATUS_SUCCESS;
|
||
}
|
||
|
||
} else {
|
||
|
||
Status = STATUS_INVALID_DEVICE_REQUEST;
|
||
}
|
||
|
||
RawCompleteRequest( Irp, Status );
|
||
|
||
UNREFERENCED_PARAMETER( Vcb );
|
||
|
||
return Status;
|
||
}
|
||
|
||
NTSTATUS
|
||
RawSetInformation (
|
||
IN PVCB Vcb,
|
||
IN PIRP Irp,
|
||
PIO_STACK_LOCATION IrpSp
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This is the routine for setting file information, though only
|
||
setting current file position is supported.
|
||
|
||
Arguments:
|
||
|
||
Vcb - Supplies the volume being queried.
|
||
|
||
Irp - Supplies the Irp being processed.
|
||
|
||
IrpSp - Supplies parameters describing the set
|
||
|
||
|
||
Return Value:
|
||
|
||
NTSTATUS - The return status for the operation
|
||
|
||
--*/
|
||
|
||
{
|
||
NTSTATUS Status;
|
||
|
||
FILE_INFORMATION_CLASS FileInformationClass;
|
||
PFILE_POSITION_INFORMATION Buffer;
|
||
PFILE_OBJECT FileObject;
|
||
|
||
PAGED_CODE();
|
||
|
||
//
|
||
// Reference our input parameters to make things easier
|
||
//
|
||
|
||
FileInformationClass = IrpSp->Parameters.SetFile.FileInformationClass;
|
||
Buffer = (PFILE_POSITION_INFORMATION)Irp->AssociatedIrp.SystemBuffer;
|
||
FileObject= IrpSp->FileObject;
|
||
|
||
//
|
||
// The only request that is valid for raw is to set file position.
|
||
//
|
||
|
||
if ( FileInformationClass == FilePositionInformation ) {
|
||
|
||
//
|
||
// Check that the new position we're supplied is aligned properly
|
||
// for the device.
|
||
//
|
||
|
||
PDEVICE_OBJECT DeviceObject;
|
||
|
||
DeviceObject = IoGetRelatedDeviceObject( IrpSp->FileObject );
|
||
|
||
if ((Buffer->CurrentByteOffset.LowPart & DeviceObject->AlignmentRequirement) != 0) {
|
||
|
||
Status = STATUS_INVALID_PARAMETER;
|
||
|
||
} else {
|
||
|
||
//
|
||
// The input parameter is fine so set the current byte offset.
|
||
//
|
||
|
||
FileObject->CurrentByteOffset = Buffer->CurrentByteOffset;
|
||
|
||
Status = STATUS_SUCCESS;
|
||
}
|
||
|
||
} else {
|
||
|
||
Status = STATUS_INVALID_DEVICE_REQUEST;
|
||
}
|
||
|
||
RawCompleteRequest( Irp, Status );
|
||
|
||
UNREFERENCED_PARAMETER( Vcb );
|
||
|
||
return Status;
|
||
}
|