/* 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(
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);
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);