Author: gedmurphy
Date: Tue Sep 6 16:33:46 2016
New Revision: 72593
URL:
http://svn.reactos.org/svn/reactos?rev=72593&view=rev
Log:
[FLTMGR]
- Properly handle requests that were sent directly to the fltmgr instead of sending them
down the stack
- Add a separate callback for IRP_MJ_DEVICE_CONTROL and forward them on to an internal
handler
- We can now open a handle to the fltmgr and send IOCTLs down to it.
Modified:
trunk/reactos/drivers/filters/fltmgr/Interface.c
Modified: trunk/reactos/drivers/filters/fltmgr/Interface.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filters/fltmgr/Int…
==============================================================================
--- trunk/reactos/drivers/filters/fltmgr/Interface.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/filters/fltmgr/Interface.c [iso-8859-1] Tue Sep 6 16:33:46
2016
@@ -1,7 +1,7 @@
/*
* PROJECT: Filesystem Filter Manager
* LICENSE: GPL - See COPYING in the top level directory
-* FILE: drivers/fs_minifilter/fltmgr/interface.c
+* FILE: drivers/filters/fltmgr/interface.c
* PURPOSE: Implements the driver interface
* PROGRAMMERS: Ged Murphy (gedmurphy(a)reactos.org)
*/
@@ -9,6 +9,7 @@
/* INCLUDES ******************************************************************/
#include "fltmgr.h"
+#include "fltmgrint.h"
//#define NDEBUG
#include <debug.h>
@@ -95,6 +96,13 @@
NTSTATUS
NTAPI
FltpFsControl(
+ _In_ PDEVICE_OBJECT DeviceObject,
+ _Inout_ PIRP Irp
+);
+
+NTSTATUS
+NTAPI
+FltpDeviceControl(
_In_ PDEVICE_OBJECT DeviceObject,
_Inout_ PIRP Irp
);
@@ -344,6 +352,7 @@
#pragma alloc_text(PAGE, FltpFsNotification)
#pragma alloc_text(PAGE, FltpCreate)
#pragma alloc_text(PAGE, FltpFsControl)
+#pragma alloc_text(PAGE, FltpDeviceControl)
#pragma alloc_text(PAGE, FltpFastIoRead)
#pragma alloc_text(PAGE, FltpFastIoWrite)
#pragma alloc_text(PAGE, FltpFastIoQueryBasicInfo)
@@ -366,25 +375,10 @@
#pragma alloc_text(PAGE, FltpFastIoQueryOpen)
#endif
-#define MAX_DEVNAME_LENGTH 64
+
DRIVER_DATA DriverData;
-
-typedef struct _FLTMGR_DEVICE_EXTENSION
-{
- /* The file system we're attached to */
- PDEVICE_OBJECT AttachedToDeviceObject;
-
- /* The storage stack(disk) accociated with the file system device object we're
attached to */
- PDEVICE_OBJECT StorageStackDeviceObject;
-
- /* Either physical drive for volume device objects otherwise
- * it's the name of the control device we're attached to */
- UNICODE_STRING DeviceName;
- WCHAR DeviceNameBuffer[MAX_DEVNAME_LENGTH];
-
-} FLTMGR_DEVICE_EXTENSION, *PFLTMGR_DEVICE_EXTENSION;
typedef struct _DETACH_DEVICE_WORK_ITEM
{
@@ -427,17 +421,37 @@
{
PFLTMGR_DEVICE_EXTENSION DeviceExtension;
PIO_STACK_LOCATION StackPtr;
-
- DeviceExtension = DeviceObject->DeviceExtension;
- __debugbreak();
+ NTSTATUS Status;
+
+ DeviceExtension = DeviceObject->DeviceExtension;
+
+ /* Check if this is a request for us */
+ if (DeviceObject == DriverData.DeviceObject)
+ {
+ FLT_ASSERT(DeviceObject->DriverObject == DriverData.DriverObject);
+ FLT_ASSERT(DeviceExtension == NULL);
+
+ /* Hand it off to our internal handler */
+ Status = FltpDispatchHandler(DeviceObject, Irp);
+ if (Status != STATUS_REPARSE)
+ {
+ Irp->IoStatus.Status = Status;
+ Irp->IoStatus.Information = 0;
+ IoCompleteRequest(Irp, 0);
+ }
+ return Status;
+ }
+
FLT_ASSERT(DeviceExtension &&
DeviceExtension->AttachedToDeviceObject);
StackPtr = IoGetCurrentIrpStackLocation(Irp);
if (StackPtr->MajorFunction == IRP_MJ_SHUTDOWN)
{
- //FltpProcessShutdownRequest(DeviceObject);
- }
+ // handle shutdown request
+ }
+
+ DPRINT1("Received %X from %wZ\n", StackPtr->MajorFunction,
&DeviceExtension->DeviceName);
/* Just pass the IRP down the stack */
IoSkipCurrentIrpStackLocation(Irp);
@@ -454,9 +468,24 @@
PAGED_CODE();
DeviceExtension = DeviceObject->DeviceExtension;
- __debugbreak();
+
+ /* Check if this is a request for us */
+ if (DeviceObject == DriverData.DeviceObject)
+ {
+ FLT_ASSERT(DeviceObject->DriverObject == DriverData.DriverObject);
+ FLT_ASSERT(DeviceExtension == NULL);
+
+ /* Someone wants a handle to the fltmgr, allow it */
+ Irp->IoStatus.Status = STATUS_SUCCESS;
+ Irp->IoStatus.Information = 0;
+ IofCompleteRequest(Irp, 0);
+ return STATUS_SUCCESS;
+ }
+
FLT_ASSERT(DeviceExtension &&
DeviceExtension->AttachedToDeviceObject);
+
+ DPRINT1("Received create from %wZ (%lu)\n",
&DeviceExtension->DeviceName, PsGetCurrentProcessId());
/* Just pass the IRP down the stack */
IoSkipCurrentIrpStackLocation(Irp);
@@ -472,10 +501,53 @@
PAGED_CODE();
- DeviceExtension = DeviceObject->DeviceExtension;
- __debugbreak();
+ /* Check if this is a request for us */
+ if (DeviceObject == DriverData.DeviceObject)
+ {
+ /* We don't handle this request */
+ Irp->IoStatus.Information = 0;
+ Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST;
+ IofCompleteRequest(Irp, 0);
+ return STATUS_INVALID_DEVICE_REQUEST;
+ }
+
+ DeviceExtension = DeviceObject->DeviceExtension;
+
FLT_ASSERT(DeviceExtension &&
DeviceExtension->AttachedToDeviceObject);
+
+ /* Just pass the IRP down the stack */
+ IoSkipCurrentIrpStackLocation(Irp);
+ return IoCallDriver(DeviceExtension->AttachedToDeviceObject, Irp);
+}
+
+NTSTATUS
+NTAPI
+FltpDeviceControl(_In_ PDEVICE_OBJECT DeviceObject,
+ _Inout_ PIRP Irp)
+{
+ PFLTMGR_DEVICE_EXTENSION DeviceExtension;
+ NTSTATUS Status;
+
+ /* Check if the request was meant for us */
+ if (DeviceObject == DriverData.DeviceObject)
+ {
+ Status = FltpDeviceControlHandler(DeviceObject, Irp);
+ if (Status != STATUS_REPARSE)
+ {
+ Irp->IoStatus.Status = Status;
+ Irp->IoStatus.Information = 0;
+ IoCompleteRequest(Irp, 0);
+ }
+
+ return Status;
+ }
+
+ DeviceExtension = DeviceObject->DeviceExtension;
+
+ FLT_ASSERT(DeviceExtension &&
+ DeviceExtension->AttachedToDeviceObject);
+
/* Just pass the IRP down the stack */
IoSkipCurrentIrpStackLocation(Irp);
return IoCallDriver(DeviceExtension->AttachedToDeviceObject, Irp);
@@ -1890,7 +1962,6 @@
LONG_PTR Count;
PAGED_CODE();
- __debugbreak();
/* Get the top device in the chain and increment the ref count on it */
AttachedDevice = IoGetAttachedDeviceReference(DeviceObject);
@@ -2099,6 +2170,7 @@
DriverObject->MajorFunction[IRP_MJ_CREATE_NAMED_PIPE] = FltpCreate;
DriverObject->MajorFunction[IRP_MJ_CREATE_MAILSLOT] = FltpCreate;
DriverObject->MajorFunction[IRP_MJ_FILE_SYSTEM_CONTROL] = FltpFsControl;
+ DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = FltpDeviceControl;
/* The FastIo diapatch table is stored in the pool along with a tag */
FastIoDispatch = ExAllocatePoolWithTag(NonPagedPool, sizeof(FAST_IO_DISPATCH),
FM_TAG_DISPATCH_TABLE);