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/v…
==============================================================================
--- 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;
}