- 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
This commit is contained in:
Pierre Schweitzer 2014-12-14 12:24:18 +00:00
parent 508364d0b2
commit c16d33beae
4 changed files with 68 additions and 0 deletions

View 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)

View 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;
}

View 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 */

View 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);