Author: ion Date: Sat Aug 31 07:07:43 2013 New Revision: 59914
URL: http://svn.reactos.org/svn/reactos?rev=59914&view=rev Log: [NPFS]: Add support for a few more volume information classes, and disable APCs like an FS should.
Modified: trunk/reactos/drivers/filesystems/npfs/volume.c
Modified: trunk/reactos/drivers/filesystems/npfs/volume.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filesystems/npfs/vo... ============================================================================== --- trunk/reactos/drivers/filesystems/npfs/volume.c [iso-8859-1] (original) +++ trunk/reactos/drivers/filesystems/npfs/volume.c [iso-8859-1] Sat Aug 31 07:07:43 2013 @@ -15,73 +15,91 @@
/* FUNCTIONS ****************************************************************/
-static NTSTATUS -NpfsQueryFsDeviceInformation(PFILE_FS_DEVICE_INFORMATION FsDeviceInfo, - PULONG BufferLength) +NTSTATUS +NTAPI +NpQueryFsDeviceInformation(IN PFILE_FS_DEVICE_INFORMATION FsDeviceInfo, + OUT PULONG BufferLength) { + PAGED_CODE(); DPRINT("NpfsQueryFsDeviceInformation()\n"); DPRINT("FsDeviceInfo = %p\n", FsDeviceInfo);
if (*BufferLength < sizeof(FILE_FS_DEVICE_INFORMATION)) { - *BufferLength = sizeof(FILE_FS_DEVICE_INFORMATION); return STATUS_BUFFER_OVERFLOW; }
FsDeviceInfo->DeviceType = FILE_DEVICE_NAMED_PIPE; FsDeviceInfo->Characteristics = 0;
- *BufferLength = sizeof(FILE_FS_DEVICE_INFORMATION); + *BufferLength -= sizeof(FILE_FS_DEVICE_INFORMATION);
DPRINT("NpfsQueryFsDeviceInformation() finished.\n");
return STATUS_SUCCESS; }
+NTSTATUS +NTAPI +NpQueryFsFullSizeInfo(IN PFILE_FS_FULL_SIZE_INFORMATION FsSizeInfo, + OUT PULONG BufferSize) +{ + RtlZeroMemory(FsSizeInfo, sizeof(FILE_FS_FULL_SIZE_INFORMATION)); + *BufferSize -= sizeof(FILE_FS_FULL_SIZE_INFORMATION); + return STATUS_SUCCESS; +}
-static NTSTATUS -NpfsQueryFsAttributeInformation(PFILE_FS_ATTRIBUTE_INFORMATION FsAttributeInfo, - PULONG BufferLength) +NTSTATUS +NTAPI +NpQueryFsSizeInfo(IN PFILE_FS_SIZE_INFORMATION FsSizeInfo, + OUT PULONG BufferSize) { + FsSizeInfo->TotalAllocationUnits.LowPart = 0; + FsSizeInfo->TotalAllocationUnits.HighPart = 0; + FsSizeInfo->AvailableAllocationUnits.LowPart = 0; + FsSizeInfo->AvailableAllocationUnits.HighPart = 0; + FsSizeInfo->SectorsPerAllocationUnit = 1; + FsSizeInfo->BytesPerSector = 1; + *BufferSize -= sizeof(FILE_FS_SIZE_INFORMATION); + return STATUS_SUCCESS; +} + +NTSTATUS +NTAPI +NpQueryFsAttributeInformation(IN PFILE_FS_ATTRIBUTE_INFORMATION FsAttributeInfo, + OUT PULONG BufferLength) +{ + PAGED_CODE(); DPRINT("NpfsQueryFsAttributeInformation() called.\n"); DPRINT("FsAttributeInfo = %p\n", FsAttributeInfo);
if (*BufferLength < sizeof(FILE_FS_ATTRIBUTE_INFORMATION) + 8) { - *BufferLength = (sizeof(FILE_FS_ATTRIBUTE_INFORMATION) + 8); + *BufferLength = 0; return STATUS_BUFFER_OVERFLOW; }
FsAttributeInfo->FileSystemAttributes = FILE_CASE_PRESERVED_NAMES; - FsAttributeInfo->MaximumComponentNameLength = 255; + FsAttributeInfo->MaximumComponentNameLength = -1; FsAttributeInfo->FileSystemNameLength = 8; - wcscpy(FsAttributeInfo->FileSystemName, - L"NPFS"); + wcscpy(FsAttributeInfo->FileSystemName, L"NPFS");
DPRINT("NpfsQueryFsAttributeInformation() finished.\n"); - *BufferLength = (sizeof(FILE_FS_ATTRIBUTE_INFORMATION) + 8); + *BufferLength -= (sizeof(FILE_FS_ATTRIBUTE_INFORMATION) + 8);
return STATUS_SUCCESS; }
- -NTSTATUS NTAPI -NpfsQueryVolumeInformation(PDEVICE_OBJECT DeviceObject, - PIRP Irp) +NTSTATUS +NTAPI +NpCommonQueryVolumeInformation(IN PIRP Irp) { PIO_STACK_LOCATION Stack; FS_INFORMATION_CLASS FsInformationClass; - NTSTATUS Status = STATUS_SUCCESS; PVOID SystemBuffer; ULONG BufferLength; - - /* PRECONDITION */ - ASSERT(DeviceObject != NULL); - ASSERT(Irp != NULL); - - DPRINT("NpfsQueryVolumeInformation(DeviceObject %p, Irp %p)\n", - DeviceObject, - Irp); + NTSTATUS Status; + PAGED_CODE();
Stack = IoGetCurrentIrpStackLocation(Irp); FsInformationClass = Stack->Parameters.QueryVolume.FsInformationClass; @@ -93,25 +111,49 @@
switch (FsInformationClass) { + case FileFsFullSizeInformation: + Status = NpQueryFsFullSizeInfo(SystemBuffer, &BufferLength); + break; + case FileFsSizeInformation: + Status = NpQueryFsSizeInfo(SystemBuffer, &BufferLength); + break; + case FileFsDeviceInformation: - Status = NpfsQueryFsDeviceInformation(SystemBuffer, - &BufferLength); + Status = NpQueryFsDeviceInformation(SystemBuffer, &BufferLength); break;
case FileFsAttributeInformation: - Status = NpfsQueryFsAttributeInformation(SystemBuffer, - &BufferLength); + Status = NpQueryFsAttributeInformation(SystemBuffer, &BufferLength); break;
default: + DPRINT1("Query not implemented: %d\n", FsInformationClass); Status = STATUS_NOT_SUPPORTED; }
- Irp->IoStatus.Status = Status; - Irp->IoStatus.Information = BufferLength; + Irp->IoStatus.Information = Stack->Parameters.QueryVolume.Length - BufferLength; + return Status; +}
- IoCompleteRequest(Irp, - IO_NO_INCREMENT); +NTSTATUS +NTAPI +NpfsQueryVolumeInformation(IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp) +{ + NTSTATUS Status; + PAGED_CODE(); + DPRINT("NpfsQueryVolumeInformation(DeviceObject %p, Irp %p)\n", DeviceObject, Irp); + + FsRtlEnterFileSystem(); + Status = NpCommonQueryVolumeInformation(Irp); + FsRtlExitFileSystem(); + + if (Status != STATUS_PENDING) + { + Irp->IoStatus.Status = Status; + + IoCompleteRequest(Irp, IO_DISK_INCREMENT); + }
return Status; }