При запуске минифильтра вылетает перезагружается комп в чем проблема так и не понял.
Если же убрать из структуры FLT_OPERATION_REGISTRATION имя процедуры фильтрации MyFiltr и поставить NULL, то все нормально, драйвер нормально загружается и выгружается, есть связь с с ним из win app программ, но естественно нет фильтрации, пожалуйста помогите новичку.
//=============================================================================
// укороченная версия
//=============================================================================
#include <fltKernel.h>
#include <dontuse.h>
#include <suppress.h>
//#include "VERSION.h"
#pragma prefast(disable:__WARNING_ENCODE_MEMBER_FUNCTION_POINTER,"Not valid for kernel mode drivers")
//-----------------------------------------------------------------------------
#define NT_FILTER_NAME L"\\Device\\NTName"
#define WIN32_FILTER_NAME L"\\DosDevices\\MYDRIVER"
#define VERSION "1.0001"
//-----------------------------------------------------------------------------
DRIVER_UNLOAD UnloadDriver; // п/п выгрузки драйвера
DRIVER_INITIALIZE DriverEntry;// главная
//-----------------------------------------------------------------------------
VOID UnloadDriver(IN PDRIVER_OBJECT pDriverObject);// п/п выгрузки драйвера
//-----------------------------------------------------------------------------
typedef struct _DEVICE_EXTENSION { // структура расширения драйвера
PDEVICE_OBJECT fdo;
UNICODE_STRING Win32_Filter_Name;
} DEVICE_EXTENSION, *PDEVICE_EXTENSION;
//---------------------------
typedef struct _NULL_FILTER_DATA{ // структура фильтра
PDRIVER_OBJECT DriverObject;
PFLT_FILTER FilterHandle;
} NULL_FILTER_DATA, *PNULL_FILTER_DATA;
//*************************************************************************
NTSTATUS DriverEntry ( // главная
__in PDRIVER_OBJECT DriverObject,
__in PUNICODE_STRING RegistryPath
);
NTSTATUS FilterUnload (// функция выгрузки фильтра
__in FLT_FILTER_UNLOAD_FLAGS Flags
) ;
NTSTATUS QueryTeardown( // функция отсоединения фильтра
__in PCFLT_RELATED_OBJECTS FltObjects,
__in FLT_INSTANCE_QUERY_TEARDOWN_FLAGS Flags
);
NTSTATUS InstanceSetup ( // функция подключения локальных томов
__in PCFLT_RELATED_OBJECTS FltObjects,
__in FLT_INSTANCE_SETUP_FLAGS Flags,
__in DEVICE_TYPE VolumeDeviceType,
__in FLT_FILESYSTEM_TYPE VolumeFilesystemType
);
FLT_PREOP_CALLBACK_STATUS MyFiltr (// функция фильтрации
__inout PFLT_CALLBACK_DATA Data,
__in PCFLT_RELATED_OBJECTS FltObjects,
__deref_out_opt PVOID *CompletionContext
);
//-----------------------------------------------------------------------------
NULL_FILTER_DATA NullFilterData;
//-----------------------------------------------------------------------------
#ifdef ALLOC_PRAGMA
#pragma alloc_text(INIT, DriverEntry)
#pragma alloc_text(PAGE, FilterUnload)
#pragma alloc_text(PAGE, QueryTeardown)
#pragma alloc_text(PAGE, InstanceSetup)
#pragma alloc_text(PAGE, MyFiltr)
#endif
//-----------------------------------------------------------------------------
const FLT_OPERATION_REGISTRATION FilterOperations[] =
{
{IRP_MJ_CREATE,
0,
MyFiltr,// функция фильтрации
NULL,
NULL
},
{ IRP_MJ_OPERATION_END}
};
typedef struct _SCANNER_STREAM_HANDLE_CONTEXT
{ BOOLEAN RescanRequired;
} SCANNER_STREAM_HANDLE_CONTEXT, *PSCANNER_STREAM_HANDLE_CONTEXT;
const FLT_CONTEXT_REGISTRATION ContextRegistration[] =
{
{ FLT_STREAMHANDLE_CONTEXT, // 1 ContextType
0, // 2 Flags
NULL, // 3 ContextCleanupCallback;
sizeof(SCANNER_STREAM_HANDLE_CONTEXT),// 4 Size
'chBS', // 5 PoolTag
NULL, // 6 ContextAllocateCallback
NULL, // 7 ContextFreeCallback
NULL // 8 Reserved1
},
{ FLT_CONTEXT_END }
};
CONST FLT_REGISTRATION FilterRegistration =
{
sizeof( FLT_REGISTRATION ), // 1 Size
FLT_REGISTRATION_VERSION, // 2 Version
0, // 3 Flags
ContextRegistration, // 4 ContextRegistration
FilterOperations, // 5 OperationRegistration
FilterUnload, // 6 FilterUnloadCallback
InstanceSetup, // 7 InstanceSetupCallback
QueryTeardown, // 8 InstanceQueryTeardownCallback
NULL, // 9 InstanceTeardownStartCallback
NULL, // 10 InstanceTeardownCompleteCallback
NULL, // 11 GenerateFileNameCallback
NULL, // 12 NormalizeNameComponentCallback
NULL // 13 NormalizeContextCleanupCallback
};
//=============================================================================
NTSTATUS DriverEntry (__in PDRIVER_OBJECT DriverObject, // объект драйвера
__in PUNICODE_STRING RegistryPath // раздел реестра
)
{
PDEVICE_OBJECT pDeviceObject; // указатель на Functional Device Object (FDO)
PDEVICE_EXTENSION dx; // указатель на структуру расширения устройства
NTSTATUS status; // текущий статус выполненной операции
UNICODE_STRING uniNtName;
UNICODE_STRING uniWin32Name;
UNREFERENCED_PARAMETER( RegistryPath );
UNREFERENCED_PARAMETER( DriverObject );
//-------------------------------
RtlInitUnicodeString(&uniNtName, NT_FILTER_NAME);
RtlInitUnicodeString(&uniWin32Name, WIN32_FILTER_NAME);
//---------------------
DriverObject->DriverUnload = UnloadDriver;//п/п выгрузки драйвера
//---------------------
#if DBG
DbgPrint("=FltF= ver. %s",VERSION );
#endif
//----------------------
status=IoCreateDevice(DriverObject,
sizeof(DEVICE_EXTENSION),// size структуры расширения
&uniNtName, // NT_FILTER_NAME
FILE_DEVICE_UNKNOWN,
0,
FALSE, // без эксклюзивного доступа
&pDeviceObject // cоздаем Functional Device Object (FDO)
);
if(!NT_SUCCESS( status ))
{
#if DBG
DbgPrint("=FltF= Error IoCreateDevice - DriverEntry");
#endif
return(status);
}
dx=(PDEVICE_EXTENSION)pDeviceObject->DeviceExtension;//структура расширения
dx->fdo = pDeviceObject; // обратный указатель
RtlInitUnicodeString(&dx->Win32_Filter_Name, WIN32_FILTER_NAME);
#if DBG
DbgPrint("=FltF= DriverEntry - FDO %X, DevExt=%X.",pDeviceObject,dx);
#endif
//-----------------------------------------------------------------------------
status=IoCreateSymbolicLink(&uniWin32Name,// видимое пользователю название
&uniNtName);// имя драйвера, созданный объект устройства
if(!NT_SUCCESS( status ))
{IoDeleteDevice(pDeviceObject);//удаляем Device Object и возвращаем управление
#if DBG
DbgPrint("=FltF= DriverEntry - Error IoCreateSymbolicLink");
#endif
return(status);
}
//-------------------------- регистрация фильтра ------------------------------
status = FltRegisterFilter( DriverObject,
&FilterRegistration,
&NullFilterData.FilterHandle
);
if(!NT_SUCCESS( status ))
{IoDeleteDevice(pDeviceObject);//удаляем Device Object и возвращаем управление
#if DBG
DbgPrint("=FltF= DriverEntry - Error FltRegisterFilter");
#endif
return(status);
}
#if DBG
DbgPrint("=FltF= DriverEntry - OK FltRegisterFilter");
#endif
status = FltStartFiltering( NullFilterData.FilterHandle );// запуск фильтра
if(!NT_SUCCESS( status ))
{FltUnregisterFilter( NullFilterData.FilterHandle ); // разрегистрируем фильтр
IoDeleteDevice(pDeviceObject);//удаляем Device Object и возвращаем управление
#if DBG
DbgPrint("=FltF= DriverEntry - Error FltStartFiltering");
#endif
return(status);
}
#if DBG
DbgPrint("=FltF= DriverEntry - Driver is successfully");
#endif
return(status);
}// END DriverEntry(...)
//-----------------------------------------------------------------------------
NTSTATUS FilterUnload ( __in FLT_FILTER_UNLOAD_FLAGS Flags )
{
UNREFERENCED_PARAMETER( Flags );
PAGED_CODE();
FltUnregisterFilter( NullFilterData.FilterHandle );
#if DBG
DbgPrint("=FltF= FilterUnload");
#endif
return(STATUS_SUCCESS);
}// END FilterUnload(...)
//-----------------------------------------------------------------------------
NTSTATUS QueryTeardown ( __in PCFLT_RELATED_OBJECTS FltObjects,
__in FLT_INSTANCE_QUERY_TEARDOWN_FLAGS Flags
)
{
UNREFERENCED_PARAMETER( FltObjects );
UNREFERENCED_PARAMETER( Flags );
PAGED_CODE();
#if DBG
DbgPrint("=FltF= QueryTeardown");
#endif
return(STATUS_SUCCESS);
}// END QueryTeardown(...)
//-----------------------------------------------------------------------------
VOID UnloadDriver(IN PDRIVER_OBJECT pDriverObject)
{
PDEVICE_OBJECT pdeviceObject = pDriverObject->DeviceObject;
PDEVICE_EXTENSION dx;
UNREFERENCED_PARAMETER(pDriverObject);
dx = (PDEVICE_EXTENSION)pdeviceObject->DeviceExtension;
IoDeleteSymbolicLink(&dx->Win32_Filter_Name);
IoDeleteDevice( pdeviceObject );
#if DBG
DbgPrint("=FltF= UnloadDriver ver. %s",VERSION );
#endif
return;
}// END UnloadDriver(...)
//-----------------------------------------------------------------------------
FLT_PREOP_CALLBACK_STATUS MyFiltr (
__inout PFLT_CALLBACK_DATA Data, // данные о файловой операции
__in PCFLT_RELATED_OBJECTS FltObjects, // не используется
__deref_out_opt PVOID *CompletionContext//
)
{
UNREFERENCED_PARAMETER( Data );
UNREFERENCED_PARAMETER( FltObjects );
UNREFERENCED_PARAMETER( CompletionContext );
PAGED_CODE();
#if DBG
DbgPrint("=FltF= <<заглушка фильтрации>>");
#endif
return FLT_PREOP_SUCCESS_WITH_CALLBACK; // файл не блокируется
}// END NullPreCreate(...)
//-----------------------------------------------------------------------------
NTSTATUS InstanceSetup ( __in PCFLT_RELATED_OBJECTS FltObjects,
__in FLT_INSTANCE_SETUP_FLAGS Flags,
__in DEVICE_TYPE VolumeDeviceType,
__in FLT_FILESYSTEM_TYPE VolumeFilesystemType
)
{
UNREFERENCED_PARAMETER( FltObjects );
UNREFERENCED_PARAMETER( Flags );
UNREFERENCED_PARAMETER( VolumeDeviceType );
UNREFERENCED_PARAMETER( VolumeFilesystemType );
PAGED_CODE();
ASSERT( FltObjects->Filter == NullFilterData.FilterHandle );
if (VolumeDeviceType == FILE_DEVICE_NETWORK_FILE_SYSTEM)
{// не присоединять к сетевым томам
DbgPrint("=FltF= == NullInstanceSetup ERR == 0x%08X",VolumeDeviceType);
return(STATUS_FLT_DO_NOT_ATTACH);
}
DbgPrint("=FltF= == InstanceSetup OK == 0x%08X",VolumeDeviceType);
return(STATUS_SUCCESS);
}// END InstanceSetup(...)
//-----------------------------------------------------------------------------