From c16d33beae2fcef99f931fd24835a23eef295436 Mon Sep 17 00:00:00 2001 From: Pierre Schweitzer Date: Sun, 14 Dec 2014 12:24:18 +0000 Subject: [PATCH] [NTFS] - 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 --- .../drivers/filesystems/ntfs/CMakeLists.txt | 1 + reactos/drivers/filesystems/ntfs/fsctl.c | 50 +++++++++++++++++++ reactos/drivers/filesystems/ntfs/misc.c | 13 +++++ reactos/drivers/filesystems/ntfs/ntfs.h | 4 ++ 4 files changed, 68 insertions(+) diff --git a/reactos/drivers/filesystems/ntfs/CMakeLists.txt b/reactos/drivers/filesystems/ntfs/CMakeLists.txt index cccce857eea..a5b247d48b9 100644 --- a/reactos/drivers/filesystems/ntfs/CMakeLists.txt +++ b/reactos/drivers/filesystems/ntfs/CMakeLists.txt @@ -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) diff --git a/reactos/drivers/filesystems/ntfs/fsctl.c b/reactos/drivers/filesystems/ntfs/fsctl.c index 904725a98dc..5467af12e6a 100644 --- a/reactos/drivers/filesystems/ntfs/fsctl.c +++ b/reactos/drivers/filesystems/ntfs/fsctl.c @@ -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; } diff --git a/reactos/drivers/filesystems/ntfs/misc.c b/reactos/drivers/filesystems/ntfs/misc.c index 27c38bb6d67..5d17e1a07a4 100644 --- a/reactos/drivers/filesystems/ntfs/misc.c +++ b/reactos/drivers/filesystems/ntfs/misc.c @@ -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 */ diff --git a/reactos/drivers/filesystems/ntfs/ntfs.h b/reactos/drivers/filesystems/ntfs/ntfs.h index 8af68849c84..2c812b086dc 100644 --- a/reactos/drivers/filesystems/ntfs/ntfs.h +++ b/reactos/drivers/filesystems/ntfs/ntfs.h @@ -2,6 +2,7 @@ #define NTFS_H #include +#include #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);