2016-09-06 16:59:11 +00:00
|
|
|
/*
|
|
|
|
* 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 <debug.h>
|
|
|
|
|
|
|
|
|
|
|
|
/* 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)
|
|
|
|
{
|
2017-05-19 08:21:41 +00:00
|
|
|
case IOCTL_FILTER_LOAD:
|
2016-09-06 16:59:11 +00:00
|
|
|
Status = HandleLoadUnloadIoctl(DeviceObject, Irp);
|
|
|
|
break;
|
|
|
|
|
2017-05-19 08:21:41 +00:00
|
|
|
case IOCTL_FILTER_UNLOAD:
|
2016-09-06 16:59:11 +00:00
|
|
|
Status = HandleLoadUnloadIoctl(DeviceObject, Irp);
|
|
|
|
break;
|
|
|
|
|
2017-05-19 08:21:41 +00:00
|
|
|
case IOCTL_FILTER_CREATE:
|
|
|
|
Status = STATUS_NOT_SUPPORTED;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case IOCTL_FILTER_ATTATCH:
|
|
|
|
Status = STATUS_NOT_SUPPORTED;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case IOCTL_FILTER_DETATCH:
|
|
|
|
Status = STATUS_NOT_SUPPORTED;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case IOCTL_FILTER_SEND_MESSAGE:
|
|
|
|
Status = STATUS_NOT_SUPPORTED;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case IOCTL_FILTER_GET_MESSAGE:
|
|
|
|
Status = STATUS_NOT_SUPPORTED;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case IOCTL_FILTER_REPLY_MESSAGE:
|
|
|
|
Status = STATUS_NOT_SUPPORTED;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case IOCTL_FILTER_FIND_FIRST:
|
|
|
|
Status = STATUS_NOT_SUPPORTED;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case IOCTL_FILTER_FIND_NEXT:
|
|
|
|
Status = STATUS_NOT_SUPPORTED;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case IOCTL_FILTER_GET_INFO:
|
|
|
|
Status = STATUS_NOT_SUPPORTED;
|
2016-09-06 16:59:11 +00:00
|
|
|
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;
|
2017-05-19 08:21:41 +00:00
|
|
|
NTSTATUS Status;
|
2016-09-06 16:59:11 +00:00
|
|
|
|
|
|
|
/* Get the IOCTL data from the stack pointer */
|
|
|
|
StackPtr = IoGetCurrentIrpStackLocation(Irp);
|
|
|
|
BufferLength = StackPtr->Parameters.DeviceIoControl.InputBufferLength;
|
|
|
|
ControlCode = StackPtr->Parameters.DeviceIoControl.IoControlCode;
|
|
|
|
|
2017-05-19 08:21:41 +00:00
|
|
|
FLT_ASSERT(ControlCode == IOCTL_FILTER_LOAD || ControlCode == IOCTL_FILTER_UNLOAD);
|
2016-09-06 16:59:11 +00:00
|
|
|
|
|
|
|
/* 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 */
|
2017-05-19 08:21:41 +00:00
|
|
|
if (ControlCode == IOCTL_FILTER_LOAD)
|
2016-09-06 16:59:11 +00:00
|
|
|
{
|
2017-05-19 08:21:41 +00:00
|
|
|
Status = FltLoadFilter(&Name);
|
2016-09-06 16:59:11 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2017-05-19 08:21:41 +00:00
|
|
|
Status = FltUnloadFilter(&Name);
|
2016-09-06 16:59:11 +00:00
|
|
|
}
|
|
|
|
|
2017-05-19 08:21:41 +00:00
|
|
|
return Status;
|
|
|
|
}
|