[NTFS]
authorPierre Schweitzer <pierre@reactos.org>
Sun, 14 Dec 2014 12:24:18 +0000 (12:24 +0000)
committerPierre Schweitzer <pierre@reactos.org>
Sun, 14 Dec 2014 12:24:18 +0000 (12:24 +0000)
- Implement NtfsGetUserBuffer() that will (attempt to) return the user output buffer for METHOD_NEITHER IOCTL.
- Implement parameters checking GetVolumeBitmap()

CORE-8725

svn path=/trunk/; revision=65638

reactos/drivers/filesystems/ntfs/CMakeLists.txt
reactos/drivers/filesystems/ntfs/fsctl.c
reactos/drivers/filesystems/ntfs/misc.c
reactos/drivers/filesystems/ntfs/ntfs.h

index cccce85..a5b247d 100644 (file)
@@ -20,6 +20,7 @@ list(APPEND SOURCE
 
 add_library(ntfs SHARED ${SOURCE} ntfs.rc)
 set_module_type(ntfs kernelmodedriver)
+target_link_libraries(ntfs ${PSEH_LIB})
 add_importlibs(ntfs ntoskrnl hal)
 add_pch(ntfs ntfs.h SOURCE)
 add_cd_file(TARGET ntfs DESTINATION reactos/system32/drivers NO_CAB FOR all)
index 904725a..5467af1 100644 (file)
@@ -661,8 +661,58 @@ NTSTATUS
 GetVolumeBitmap(PDEVICE_EXTENSION DeviceExt,
                 PIRP Irp)
 {
+    NTSTATUS Status = STATUS_SUCCESS;
+    PIO_STACK_LOCATION Stack;
+    PVOLUME_BITMAP_BUFFER BitmapBuffer;
+
     DPRINT1("GetVolumeBitmap(%p, %p)\n", DeviceExt, Irp);
 
+    Stack = IoGetCurrentIrpStackLocation(Irp);
+
+    if (Stack->Parameters.FileSystemControl.InputBufferLength < sizeof(STARTING_LCN_INPUT_BUFFER))
+    {
+        DPRINT1("Invalid input! %d\n", Stack->Parameters.FileSystemControl.InputBufferLength);
+        return STATUS_INVALID_PARAMETER;
+    }
+
+    if (Stack->Parameters.FileSystemControl.OutputBufferLength < sizeof(VOLUME_BITMAP_BUFFER))
+    {
+        DPRINT1("Invalid output! %d\n", Stack->Parameters.FileSystemControl.OutputBufferLength);
+        return STATUS_BUFFER_TOO_SMALL;
+    }
+
+    BitmapBuffer = NtfsGetUserBuffer(Irp);
+    if (Irp->RequestorMode == UserMode)
+    {
+        _SEH2_TRY
+        {
+            ProbeForRead(Stack->Parameters.FileSystemControl.Type3InputBuffer,
+                         Stack->Parameters.FileSystemControl.InputBufferLength,
+                         sizeof(CHAR));
+            ProbeForWrite(BitmapBuffer, Stack->Parameters.FileSystemControl.OutputBufferLength,
+                          sizeof(CHAR));
+        }
+        _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+        {
+            Status = _SEH2_GetExceptionCode();
+        }
+        _SEH2_END;
+    }
+    else
+    {
+        if (Stack->Parameters.FileSystemControl.Type3InputBuffer == NULL ||
+            BitmapBuffer == NULL)
+        {
+            Status = STATUS_INVALID_PARAMETER;
+        }
+    }
+
+    if (!NT_SUCCESS(Status))
+    {
+        DPRINT1("Invalid buffer! %p %p\n", Stack->Parameters.FileSystemControl.Type3InputBuffer, BitmapBuffer);
+        return Status;
+    }
+
     UNIMPLEMENTED;
     return STATUS_NOT_IMPLEMENTED;
 }
index 27c38bb..5d17e1a 100644 (file)
@@ -112,4 +112,17 @@ NtfsFileFlagsToAttributes(ULONG NtfsAttributes,
         *FileAttributes = FILE_ATTRIBUTE_NORMAL;
 }
 
+PVOID
+NtfsGetUserBuffer(PIRP Irp)
+{
+    if (Irp->MdlAddress != NULL)
+    {
+        return MmGetSystemAddressForMdlSafe(Irp->MdlAddress, HighPagePriority);
+    }
+    else
+    {
+        return Irp->UserBuffer;
+    }
+}
+
 /* EOF */
index 8af6884..2c812b0 100644 (file)
@@ -2,6 +2,7 @@
 #define NTFS_H
 
 #include <ntifs.h>
+#include <pseh/pseh2.h>
 
 #define CACHEPAGESIZE(pDeviceExt) \
        ((pDeviceExt)->NtfsInfo.UCHARsPerCluster > PAGE_SIZE ? \
@@ -729,6 +730,9 @@ PNTFS_IRP_CONTEXT
 NtfsAllocateIrpContext(PDEVICE_OBJECT DeviceObject,
                        PIRP Irp);
 
+PVOID
+NtfsGetUserBuffer(PIRP Irp);
+
 #if 0
 BOOLEAN
 wstrcmpjoki(PWSTR s1, PWSTR s2);