首页
社区
课程
招聘
[求助]关于minifilter的一个问题
发表于: 2018-6-23 23:54 3677

[求助]关于minifilter的一个问题

2018-6-23 23:54
3677
/*++

Module Name:

    FsFilter1.c

Abstract:

    This is the main module of the FsFilter1 miniFilter driver.

Environment:

    Kernel mode

--*/

#include <fltKernel.h>
#include <dontuse.h>
#include <suppress.h>

PFLT_FILTER FilterHandle = NULL;
NTSTATUS MiniUnload(FLT_FILTER_UNLOAD_FLAGS flags);
FLT_POSTOP_CALLBACK_STATUS MiniPostCreate(PFLT_CALLBACK_DATA Data, PFLT_RELATED_OBJECTS FltObjects, PVOID* CompletionContext, FLT_POST_OPERATION_FLAGS flags);
FLT_PREOP_CALLBACK_STATUS MiniPreCreate(PFLT_CALLBACK_DATA Data, PFLT_RELATED_OBJECTS FltObjects, PVOID* CompletionContext);
FLT_PREOP_CALLBACK_STATUS MiniPreWrite(PFLT_CALLBACK_DATA Data, PFLT_RELATED_OBJECTS FltObjects, PVOID* CompletionContext);

CONST FLT_OPERATION_REGISTRATION Callbacks[] = {
	{IRP_MJ_CREATE,0,MiniPreCreate,MiniPostCreate},
	{IRP_MJ_WRITE,0,MiniPreWrite,NULL},
	{IRP_MJ_OPERATION_END}
};

const FLT_REGISTRATION FilterRegistration = {
	sizeof(FLT_REGISTRATION),
	FLT_REGISTRATION_VERSION,
	0,
	NULL,
	Callbacks,
	MiniUnload,
	NULL,
	NULL,
	NULL,
	NULL,
	NULL,
	NULL,
	NULL,
	NULL
};

NTSTATUS MiniUnload(FLT_FILTER_UNLOAD_FLAGS flags) {
	KdPrint(("driver unload \r\n"));
	FltUnregisterFilter(FilterHandle);

	return STATUS_SUCCESS;
}

FLT_POSTOP_CALLBACK_STATUS MiniPostCreate(PFLT_CALLBACK_DATA Data, PFLT_RELATED_OBJECTS FltObjects, PVOID* CompletionContext, FLT_POST_OPERATION_FLAGS flags) {
	KdPrint(("post create is running \r\n"));
	return FLT_POSTOP_FINISHED_PROCESSING;
}

FLT_PREOP_CALLBACK_STATUS MiniPreCreate(PFLT_CALLBACK_DATA Data, PFLT_RELATED_OBJECTS FltObjects, PVOID* CompletionContext) {
	PFLT_FILE_NAME_INFORMATION FileNameInfo;
	NTSTATUS status;
	WCHAR Name[200] = { 0 };

	status = FltGetFileNameInformation(Data, FLT_FILE_NAME_NORMALIZED | FLT_FILE_NAME_QUERY_DEFAULT, &FileNameInfo);
	
	if (NT_SUCCESS(status)) {

		status = FltParseFileNameInformation(FileNameInfo);

		if (NT_SUCCESS(status)) {

			if (FileNameInfo->Name.MaximumLength < 200) {

				RtlCopyMemory(Name, FileNameInfo->Name.Buffer, FileNameInfo->Name.MaximumLength);
				KdPrint(("Create file: &s \r\n", Name));
			}
		}

		FltReleaseFileNameInformation(FileNameInfo);
	}

	return FLT_PREOP_SUCCESS_WITH_CALLBACK;
}

FLT_PREOP_CALLBACK_STATUS MiniPreWrite(PFLT_CALLBACK_DATA Data, PFLT_RELATED_OBJECTS FltObjects, PVOID* CompletionContext) {
	PFLT_FILE_NAME_INFORMATION FileNameInfo;
	NTSTATUS status;
	WCHAR Name[200] = { 0 };

	status = FltGetFileNameInformation(Data, FLT_FILE_NAME_NORMALIZED | FLT_FILE_NAME_QUERY_DEFAULT, &FileNameInfo);

	if (NT_SUCCESS(status)) {

		status = FltParseFileNameInformation(FileNameInfo);

		if (NT_SUCCESS(status)) {

			if (FileNameInfo->Name.MaximumLength < 200) {

				RtlCopyMemory(Name, FileNameInfo->Name.Buffer, FileNameInfo->Name.MaximumLength);
				_wcsupr(Name);
				if (wcsstr(Name, L"OPENME>TXT") != NULL) {
					KdPrint(("write file: %ws blocked \r\n", Name));
					Data->IoStatus.Status = STATUS_INVALID_PARAMETER;
					Data->IoStatus.Information = 0;
					FltReleaseFileNameInformation(FileNameInfo);
					return FLT_PREOP_COMPLETE;
				}
				KdPrint(("Create file: &s \r\n", Name));
			}
		}

		FltReleaseFileNameInformation(FileNameInfo);
	}

	return FLT_PREOP_SUCCESS_NO_CALLBACK;
}

NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath) {
	NTSTATUS status;

	status = FltRegisterFilter(DriverObject, &FilterRegistration, &FilterHandle);

	if (NT_SUCCESS(status)) {

		status = FltStartFiltering(FilterHandle);

		if (!NT_SUCCESS(status)) {

			FltUnregisterFilter(FilterHandle);
		}
	}
}

VS2017编译报错:
1>------ 已启动生成: 项目: FsFilter1, 配置: Debug x64 ------
1>Building 'FsFilter1' with toolset 'WindowsKernelModeDriver10.0' and the 'Desktop' target platform.
1>Stamping x64\Debug\FsFilter1.inf
1>Stamping [Version] section with DriverVer=06/23/2018,23.52.8.978
1>D:\Project\C#WPF\FsFilter1\FsFilter1\FsFilter1.inf(73-73): warning 1205: Section [MiniFilter.DriverFiles] referenced from DelFiles and CopyFiles directive.
1>FsFilter1.c
1>d:\project\c#wpf\fsfilter1\fsfilter1\fsfilter1.c(28): warning C4090: “函数”: 不同的“const”限定符
1>d:\project\c#wpf\fsfilter1\fsfilter1\fsfilter1.c(28): error C4028: 形参 2 与声明不同
1>d:\project\c#wpf\fsfilter1\fsfilter1\fsfilter1.c(29): warning C4090: “函数”: 不同的“const”限定符
1>d:\project\c#wpf\fsfilter1\fsfilter1\fsfilter1.c(29): error C4028: 形参 2 与声明不同
1>已完成生成项目“FsFilter1.vcxproj”的操作 - 失败。
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========

其中第28行为
{IRP_MJ_CREATE,0,MiniPreCreate,MiniPostCreate},

对比了几个开源的mifilter的demo,这个地方应该是一样的,实在想不通原因,麻烦前辈有空能够指点一下,感激不尽。

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 174
活跃值: (62)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
你函数声明的是PFLT_RELATED_OBJECTS,改一下试试

2018-6-25 09:26
0
游客
登录 | 注册 方可回帖
返回
//