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