mirror of
https://github.com/reactos/reactos.git
synced 2024-12-29 10:35:28 +00:00
166f815e7b
* FileFsVolumeInformation-memory-disclosure * remove unnecessary assignment to 0 * fix
206 lines
5 KiB
C
206 lines
5 KiB
C
/*
|
|
* PROJECT: ReactOS Named Pipe FileSystem
|
|
* LICENSE: BSD - See COPYING.ARM in the top level directory
|
|
* FILE: drivers/filesystems/npfs/volinfo.c
|
|
* PURPOSE: Named Pipe FileSystem Volume Information
|
|
* PROGRAMMERS: ReactOS Portable Systems Group
|
|
*/
|
|
|
|
/* INCLUDES *******************************************************************/
|
|
|
|
#include "npfs.h"
|
|
|
|
// File ID number for NPFS bugchecking support
|
|
#define NPFS_BUGCHECK_FILE_ID (NPFS_BUGCHECK_VOLINFO)
|
|
|
|
/* FUNCTIONS ******************************************************************/
|
|
|
|
NTSTATUS
|
|
NTAPI
|
|
NpQueryFsVolumeInfo(IN PVOID Buffer,
|
|
IN OUT PULONG Length)
|
|
{
|
|
PFILE_FS_VOLUME_INFORMATION InfoBuffer = Buffer;
|
|
NTSTATUS Status;
|
|
USHORT NameLength;
|
|
TRACE("Entered\n");
|
|
|
|
*Length -= FIELD_OFFSET(FILE_FS_VOLUME_INFORMATION, VolumeLabel);
|
|
|
|
InfoBuffer->SupportsObjects = 0;
|
|
|
|
NameLength = 18;
|
|
InfoBuffer->VolumeLabelLength = 18;
|
|
|
|
if (*Length < 18)
|
|
{
|
|
NameLength = (USHORT)*Length;
|
|
Status = STATUS_BUFFER_OVERFLOW;
|
|
}
|
|
else
|
|
{
|
|
Status = STATUS_SUCCESS;
|
|
}
|
|
|
|
RtlCopyMemory(InfoBuffer->VolumeLabel, L"NamedPipe", NameLength);
|
|
*Length -= NameLength;
|
|
|
|
TRACE("Leaving, Status = %lx\n", Status);
|
|
return Status;
|
|
}
|
|
|
|
NTSTATUS
|
|
NTAPI
|
|
NpQueryFsSizeInfo(IN PVOID Buffer,
|
|
IN OUT PULONG Length)
|
|
{
|
|
PFILE_FS_SIZE_INFORMATION InfoBuffer = Buffer;
|
|
TRACE("Entered\n");
|
|
|
|
*Length -= sizeof(*InfoBuffer);
|
|
|
|
InfoBuffer->SectorsPerAllocationUnit = 1;
|
|
InfoBuffer->BytesPerSector = 1;
|
|
|
|
TRACE("Leaving, Status = STATUS_SUCCESS\n");
|
|
return STATUS_SUCCESS;
|
|
}
|
|
|
|
NTSTATUS
|
|
NTAPI
|
|
NpQueryFsDeviceInfo(IN PVOID Buffer,
|
|
IN OUT PULONG Length)
|
|
{
|
|
PFILE_FS_DEVICE_INFORMATION InfoBuffer = Buffer;
|
|
TRACE("Entered\n");
|
|
|
|
InfoBuffer->DeviceType = FILE_DEVICE_NAMED_PIPE;
|
|
*Length -= sizeof(*InfoBuffer);
|
|
|
|
TRACE("Leaving, Status = STATUS_SUCCESS\n");
|
|
return STATUS_SUCCESS;
|
|
}
|
|
|
|
NTSTATUS
|
|
NTAPI
|
|
NpQueryFsAttributeInfo(IN PVOID Buffer,
|
|
IN OUT PULONG Length)
|
|
{
|
|
PFILE_FS_ATTRIBUTE_INFORMATION InfoBuffer = Buffer;
|
|
NTSTATUS Status;
|
|
USHORT NameLength;
|
|
TRACE("Entered\n");
|
|
|
|
NameLength = (USHORT)(*Length - 12);
|
|
if (NameLength < 8)
|
|
{
|
|
*Length = 0;
|
|
Status = STATUS_BUFFER_OVERFLOW;
|
|
}
|
|
else
|
|
{
|
|
*Length -= 20;
|
|
NameLength = 8;
|
|
Status = STATUS_SUCCESS;
|
|
}
|
|
|
|
InfoBuffer->MaximumComponentNameLength = 0xFFFFFFFF;
|
|
InfoBuffer->FileSystemNameLength = 8;
|
|
InfoBuffer->FileSystemAttributes = FILE_CASE_PRESERVED_NAMES;
|
|
RtlCopyMemory(InfoBuffer->FileSystemName, L"NPFS", NameLength);
|
|
|
|
TRACE("Leaving, Status = %lx\n", Status);
|
|
return Status;
|
|
}
|
|
|
|
NTSTATUS
|
|
NTAPI
|
|
NpQueryFsFullSizeInfo(IN PVOID Buffer,
|
|
IN OUT PULONG Length)
|
|
{
|
|
PFILE_FS_FULL_SIZE_INFORMATION InfoBuffer = Buffer;
|
|
TRACE("Entered\n");
|
|
|
|
*Length -= sizeof(*InfoBuffer);
|
|
|
|
RtlZeroMemory(InfoBuffer, sizeof(*InfoBuffer));
|
|
|
|
TRACE("Leaving, Status = STATUS_SUCCESS\n");
|
|
return STATUS_SUCCESS;
|
|
}
|
|
|
|
NTSTATUS
|
|
NTAPI
|
|
NpCommonQueryVolumeInformation(IN PDEVICE_OBJECT DeviceObject,
|
|
IN PIRP Irp)
|
|
{
|
|
PIO_STACK_LOCATION IoStack;
|
|
FS_INFORMATION_CLASS InfoClass;
|
|
ULONG Length;
|
|
PVOID Buffer;
|
|
NTSTATUS Status;
|
|
PAGED_CODE();
|
|
TRACE("Entered\n");
|
|
|
|
IoStack = IoGetCurrentIrpStackLocation(Irp);
|
|
Buffer = Irp->AssociatedIrp.SystemBuffer;
|
|
Length = IoStack->Parameters.QueryVolume.Length;
|
|
InfoClass = IoStack->Parameters.QueryVolume.FsInformationClass;
|
|
|
|
RtlZeroMemory(Buffer, Length);
|
|
|
|
switch (InfoClass)
|
|
{
|
|
case FileFsVolumeInformation:
|
|
Status = NpQueryFsVolumeInfo(Buffer, &Length);
|
|
break;
|
|
case FileFsSizeInformation:
|
|
Status = NpQueryFsSizeInfo(Buffer, &Length);
|
|
break;
|
|
case FileFsDeviceInformation:
|
|
Status = NpQueryFsDeviceInfo(Buffer, &Length);
|
|
break;
|
|
case FileFsAttributeInformation:
|
|
Status = NpQueryFsAttributeInfo(Buffer, &Length);
|
|
break;
|
|
case FileFsFullSizeInformation:
|
|
Status = NpQueryFsFullSizeInfo(Buffer, &Length);
|
|
break;
|
|
default:
|
|
Status = STATUS_NOT_SUPPORTED;
|
|
break;
|
|
}
|
|
|
|
Irp->IoStatus.Information = IoStack->Parameters.QueryVolume.Length - Length;
|
|
TRACE("Leaving, Status = %lx\n", Status);
|
|
return Status;
|
|
}
|
|
|
|
NTSTATUS
|
|
NTAPI
|
|
NpFsdQueryVolumeInformation(IN PDEVICE_OBJECT DeviceObject,
|
|
IN PIRP Irp)
|
|
{
|
|
NTSTATUS Status;
|
|
PAGED_CODE();
|
|
TRACE("Entered\n");
|
|
|
|
FsRtlEnterFileSystem();
|
|
NpAcquireSharedVcb();
|
|
|
|
Status = NpCommonQueryVolumeInformation(DeviceObject, Irp);
|
|
|
|
NpReleaseVcb();
|
|
FsRtlExitFileSystem();
|
|
|
|
if (Status != STATUS_PENDING)
|
|
{
|
|
Irp->IoStatus.Status = Status;
|
|
IoCompleteRequest(Irp, IO_NAMED_PIPE_INCREMENT);
|
|
}
|
|
|
|
TRACE("Leaving, Status = %lx\n", Status);
|
|
return Status;
|
|
}
|
|
|
|
/* EOF */
|