Author: tkreuzer Date: Wed Jan 22 20:52:01 2014 New Revision: 61755
URL: http://svn.reactos.org/svn/reactos?rev=61755&view=rev Log: [KSECDD] Implement IRP_MJ_QUERY_INFORMATION and IRP_MJ_QUERY_VOLUME_INFORMATION
Modified: trunk/reactos/drivers/crypto/ksecdd/dispatch.c trunk/reactos/drivers/crypto/ksecdd/ksecdd.c
Modified: trunk/reactos/drivers/crypto/ksecdd/dispatch.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/crypto/ksecdd/dispa... ============================================================================== --- trunk/reactos/drivers/crypto/ksecdd/dispatch.c [iso-8859-1] (original) +++ trunk/reactos/drivers/crypto/ksecdd/dispatch.c [iso-8859-1] Wed Jan 22 20:52:01 2014 @@ -16,6 +16,71 @@
/* FUNCTIONS ******************************************************************/
+static +NTSTATUS +KsecQueryFileInformation( + PVOID InfoBuffer, + FILE_INFORMATION_CLASS FileInformationClass, + PSIZE_T BufferLength) +{ + PFILE_STANDARD_INFORMATION StandardInformation; + + /* Only FileStandardInformation is supported */ + if (FileInformationClass != FileStandardInformation) + { + return STATUS_INVALID_INFO_CLASS; + } + + /* Validate buffer size */ + if (*BufferLength >= sizeof(FILE_STANDARD_INFORMATION)) + { + *BufferLength = sizeof(FILE_STANDARD_INFORMATION); + return STATUS_INFO_LENGTH_MISMATCH; + } + + /* Fill the structure */ + StandardInformation = (PFILE_STANDARD_INFORMATION)InfoBuffer; + StandardInformation->AllocationSize.QuadPart = 0; + StandardInformation->EndOfFile.QuadPart = 0; + StandardInformation->NumberOfLinks = 1; + StandardInformation->DeletePending = FALSE; + StandardInformation->Directory = FALSE; + *BufferLength = sizeof(FILE_STANDARD_INFORMATION); + + return STATUS_SUCCESS; +} + +static +NTSTATUS +KsecQueryVolumeInformation( + PVOID InfoBuffer, + FS_INFORMATION_CLASS FsInformationClass, + PSIZE_T BufferLength) +{ + PFILE_FS_DEVICE_INFORMATION DeviceInformation; + + /* Only FileFsDeviceInformation is supported */ + if (FsInformationClass == FileFsDeviceInformation) + { + return STATUS_INVALID_INFO_CLASS; + } + + /* Validate buffer size */ + if (*BufferLength < sizeof(FILE_FS_DEVICE_INFORMATION)) + { + *BufferLength = sizeof(FILE_FS_DEVICE_INFORMATION); + return STATUS_INFO_LENGTH_MISMATCH; + } + + /* Fill the structure */ + DeviceInformation = (PFILE_FS_DEVICE_INFORMATION)InfoBuffer; + DeviceInformation->DeviceType = FILE_DEVICE_NULL; + DeviceInformation->Characteristics = 0; + *BufferLength = sizeof(FILE_FS_DEVICE_INFORMATION); + + return STATUS_SUCCESS; +} + NTSTATUS NTAPI KsecDdDispatch( @@ -25,6 +90,10 @@ PIO_STACK_LOCATION IoStackLocation; ULONG_PTR Information; NTSTATUS Status; + PVOID Buffer; + SIZE_T OutputLength; + FILE_INFORMATION_CLASS FileInfoClass; + FS_INFORMATION_CLASS FsInfoClass;
IoStackLocation = IoGetCurrentIrpStackLocation(Irp);
@@ -52,6 +121,34 @@ Information = IoStackLocation->Parameters.Write.Length; break;
+ case IRP_MJ_QUERY_INFORMATION: + + /* Extract the parameters */ + Buffer = Irp->AssociatedIrp.SystemBuffer; + OutputLength = IoStackLocation->Parameters.QueryFile.Length; + FileInfoClass = IoStackLocation->Parameters.QueryFile.FileInformationClass; + + /* Call the internal function */ + Status = KsecQueryFileInformation(Buffer, + FileInfoClass, + &OutputLength); + Information = OutputLength; + break; + + case IRP_MJ_QUERY_VOLUME_INFORMATION: + + /* Extract the parameters */ + Buffer = Irp->AssociatedIrp.SystemBuffer; + OutputLength = IoStackLocation->Parameters.QueryVolume.Length; + FsInfoClass = IoStackLocation->Parameters.QueryVolume.FsInformationClass; + + /* Call the internal function */ + Status = KsecQueryVolumeInformation(Buffer, + FsInfoClass, + &OutputLength); + Information = OutputLength; + break; + default: DPRINT1("Unhandled major function %lu!\n", IoStackLocation->MajorFunction);
Modified: trunk/reactos/drivers/crypto/ksecdd/ksecdd.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/crypto/ksecdd/ksecd... ============================================================================== --- trunk/reactos/drivers/crypto/ksecdd/ksecdd.c [iso-8859-1] (original) +++ trunk/reactos/drivers/crypto/ksecdd/ksecdd.c [iso-8859-1] Wed Jan 22 20:52:01 2014 @@ -48,6 +48,8 @@ DriverObject->MajorFunction[IRP_MJ_CLOSE] = KsecDdDispatch; DriverObject->MajorFunction[IRP_MJ_READ] = KsecDdDispatch; DriverObject->MajorFunction[IRP_MJ_WRITE] = KsecDdDispatch; + DriverObject->MajorFunction[IRP_MJ_QUERY_INFORMATION] = KsecDdDispatch; + DriverObject->MajorFunction[IRP_MJ_QUERY_VOLUME_INFORMATION] = KsecDdDispatch;
return STATUS_SUCCESS; }