From abe4dbbca0eaa7e74f79d565f910bf40995f74b4 Mon Sep 17 00:00:00 2001 From: Ged Murphy Date: Tue, 6 Sep 2016 16:59:11 +0000 Subject: [PATCH] [FLTMGR] - Add stubs for context registration - Add dispatch and device control handlers - Implement the load IOCTL. We can now load minifilters with 'fltmc load ' svn path=/trunk/; revision=72595 --- reactos/drivers/filters/fltmgr/Context.c | 79 +++++++++++++ reactos/drivers/filters/fltmgr/Dispatch.c | 129 ++++++++++++++++++++++ 2 files changed, 208 insertions(+) create mode 100644 reactos/drivers/filters/fltmgr/Context.c create mode 100644 reactos/drivers/filters/fltmgr/Dispatch.c diff --git a/reactos/drivers/filters/fltmgr/Context.c b/reactos/drivers/filters/fltmgr/Context.c new file mode 100644 index 00000000000..ead64cda270 --- /dev/null +++ b/reactos/drivers/filters/fltmgr/Context.c @@ -0,0 +1,79 @@ +/* +* PROJECT: Filesystem Filter Manager +* LICENSE: GPL - See COPYING in the top level directory +* FILE: drivers/filters/fltmgr/Context.c +* PURPOSE: Contains context routines +* PROGRAMMERS: Ged Murphy (gedmurphy@reactos.org) +*/ + +/* INCLUDES ******************************************************************/ + +#include "fltmgr.h" +#include "fltmgrint.h" + +#define NDEBUG +#include + + +/* DATA *********************************************************************/ + +static +BOOLEAN +IsContextTypeValid( + _In_ FLT_CONTEXT_TYPE ContextType +); + +static +NTSTATUS +SetupContextHeader( + _In_ PFLT_FILTER Filter, + _In_ PFLT_CONTEXT_REGISTRATION ContextPtr, + _Out_ PALLOCATE_CONTEXT_HEADER ContextHeader +); + +/* EXPORTED FUNCTIONS ******************************************************/ + + + + +/* INTERNAL FUNCTIONS ******************************************************/ + + +NTSTATUS +FltpRegisterContexts(_In_ PFLT_FILTER Filter, + _In_ const FLT_CONTEXT_REGISTRATION *Context) +{ + UNREFERENCED_PARAMETER(Filter); + UNREFERENCED_PARAMETER(Context); + return STATUS_NOT_IMPLEMENTED; +} + + +/* PRIVATE FUNCTIONS ******************************************************/ + +static +BOOLEAN +IsContextTypeValid(_In_ FLT_CONTEXT_TYPE ContextType) +{ + switch (ContextType) + { + case FLT_VOLUME_CONTEXT: + case FLT_INSTANCE_CONTEXT: + case FLT_FILE_CONTEXT: + case FLT_STREAM_CONTEXT: + case FLT_STREAMHANDLE_CONTEXT: + case FLT_TRANSACTION_CONTEXT: + return TRUE; + } + + return FALSE; +} + +static +NTSTATUS +SetupContextHeader(_In_ PFLT_FILTER Filter, + _In_ PFLT_CONTEXT_REGISTRATION ContextPtr, + _Out_ PALLOCATE_CONTEXT_HEADER ContextHeader) +{ + return 0; +} diff --git a/reactos/drivers/filters/fltmgr/Dispatch.c b/reactos/drivers/filters/fltmgr/Dispatch.c new file mode 100644 index 00000000000..47c4eb527ff --- /dev/null +++ b/reactos/drivers/filters/fltmgr/Dispatch.c @@ -0,0 +1,129 @@ +/* +* PROJECT: Filesystem Filter Manager +* LICENSE: GPL - See COPYING in the top level directory +* FILE: drivers/filters/fltmgr/Dispatch.c +* PURPOSE: Contains dispatch handler routines +* PROGRAMMERS: Ged Murphy (gedmurphy@reactos.org) +*/ + +/* INCLUDES ******************************************************************/ + +#include "fltmgr.h" +#include "fltmgrint.h" +#include "fltmgr_shared.h" + +#define NDEBUG +#include + + +/* DATA *********************************************************************/ + +NTSTATUS +HandleLoadUnloadIoctl( + _In_ PDEVICE_OBJECT DeviceObject, + _Inout_ PIRP Irp +); + +NTSTATUS +HandleFindFirstIoctl( + _In_ PDEVICE_OBJECT DeviceObject, + _Inout_ PIRP Irp +); + + +/* sdsfds *******************************************************************/ + +NTSTATUS +FltpDeviceControlHandler(_In_ PDEVICE_OBJECT DeviceObject, + _Inout_ PIRP Irp) +{ + PIO_STACK_LOCATION StackPtr; + ULONG ControlCode; + NTSTATUS Status; + + StackPtr = IoGetCurrentIrpStackLocation(Irp); + FLT_ASSERT(StackPtr->MajorFunction == IRP_MJ_DEVICE_CONTROL); + + ControlCode = StackPtr->Parameters.DeviceIoControl.IoControlCode; + switch (ControlCode) + { + case IOCTL_LOAD_FILTER: + Status = HandleLoadUnloadIoctl(DeviceObject, Irp); + break; + + case IOCTL_UNLOAD_FILTER: + Status = HandleLoadUnloadIoctl(DeviceObject, Irp); + break; + + case IOCTL_FIND_FIRST_FILTER: + Status = HandleFindFirstIoctl(DeviceObject, Irp); + break; + + default: + Status = STATUS_INVALID_PARAMETER; + break; + } + + return Status; +} + +NTSTATUS +FltpDispatchHandler(_In_ PDEVICE_OBJECT DeviceObject, + _Inout_ PIRP Irp) +{ + PIO_STACK_LOCATION StackPtr; + StackPtr = IoGetCurrentIrpStackLocation(Irp); + UNREFERENCED_PARAMETER(StackPtr); + + // implement me + + return STATUS_SUCCESS; +} + + +/* INTERNAL FUNCTIONS ******************************************************/ + +NTSTATUS +HandleLoadUnloadIoctl(_In_ PDEVICE_OBJECT DeviceObject, + _Inout_ PIRP Irp) +{ + PIO_STACK_LOCATION StackPtr; + UNICODE_STRING Name; + PFILTER_NAME FilterName; + ULONG BufferLength; + ULONG ControlCode; + + /* Get the IOCTL data from the stack pointer */ + StackPtr = IoGetCurrentIrpStackLocation(Irp); + BufferLength = StackPtr->Parameters.DeviceIoControl.InputBufferLength; + ControlCode = StackPtr->Parameters.DeviceIoControl.IoControlCode; + + FLT_ASSERT(ControlCode == IOCTL_LOAD_FILTER || ControlCode == IOCTL_UNLOAD_FILTER); + + /* Make sure the buffer is valid */ + if (BufferLength < sizeof(FILTER_NAME)) + return STATUS_INVALID_PARAMETER; + + /* Convert the file name buffer into a string */ + FilterName = (PFILTER_NAME)Irp->AssociatedIrp.SystemBuffer; + Name.Length = FilterName->Length; + Name.MaximumLength = FilterName->Length; + Name.Buffer = (PWCH)((PCHAR)FilterName + FIELD_OFFSET(FILTER_NAME, FilterName[0])); + + /* Forward the request to our Flt routines */ + if (ControlCode == IOCTL_LOAD_FILTER) + { + return FltLoadFilter(&Name); + } + else + { + return FltUnloadFilter(&Name); + } +} + +NTSTATUS +HandleFindFirstIoctl(_In_ PDEVICE_OBJECT DeviceObject, + _Inout_ PIRP Irp) +{ + return STATUS_NOT_SUPPORTED; +} \ No newline at end of file