Ctx Minifilter Sample 实例上下文例子
总体结构:
Pch.h 包含了所有用到的头文件 ,这也是写驱动的一个技巧 ,用一个头文件包含所有需要的头文件 ,以后的.c 文件只要引用这一个头文件即可 。
CtxStruct.h 头文件,定义了所有需要用到的结构体 ,这样如果不是系统自带的结构体 ,找不到的结构体一定在这里 。
CtxProc.h 头文件,定义了所有将要实习的方法,在msdn里找不到的方法,原型一定在这里 。
Context.c 所有自定义的对上下文操作的方法的实现在这个文件里 。
Operations.c 实现FLT_OPERATION_REGISTRATION中各种callback方法 ,主要的功能实现都在这里 。
Support.c 类似我们平时写的Utility ,一些自定义辅助方法放在这里 。
CtxInit.c 这是驱动的入口 ,FLT_OPERATION_REGISTRATION和FLT_CONTEXT_REGISTRATION都在这里定义 ,在这里就可以看出整个驱动的大体流程。
遇到的一些系统API:
1.ExAllocatePoolWithTag分配指定类型的内存,并返回指向这个分配了的内存块
它的原型是:
PVOID
ExAllocatePoolWithTag(
IN POOL_TYPE PoolType, //内存类型
IN SIZE_T NumberOfBytes, //分配内存大小
IN ULONG Tag //指定内存标签 ,释放时会用到
);
2.ExFreePoolWithTag取消标签指定的分配的内存资源
它的原型是:
NTKERNELAPI
VOID
ExFreePoolWithTag(
IN PVOID P, //分配内存的起始地址
IN ULONG Tag //内存标签
);
例如:
...
String->Buffer = ExAllocatePoolWithTag( PagedPool,
String->MaximumLength,
CTX_STRING_TAG ); //分配内存,返回内存起始地址
...
ExFreePoolWithTag( String->Buffer,
CTX_STRING_TAG ); //释放分配的内存
...
3.ExDeleteResourceLite删除给定的源,从系统的源列表中
它的原型是:
NTSTATUS
ExDeleteResourceLite(
IN PERESOURCE Resource //要删除的源
);
在StreamContent 和StreamHandleContent时用到,如:
streamContext = (PCTX_STREAM_CONTEXT) Context;
if (streamContext->Resource != NULL) {
ExDeleteResourceLite( streamContext->Resource );
CtxFreeResource( streamContext->Resource );
}
其他的就是系统处理上下文的一些方法了:
FltAllocateContext分配一个上下文结构体
它的原型是:
NTSTATUS
FltAllocateContext(
IN PFLT_FILTER Filter, //过滤器
IN FLT_CONTEXT_TYPE ContextType, //上下文类型
IN SIZE_T ContextSize, //上下文大小
IN POOL_TYPE PoolType, //池子类型
OUT PFLT_CONTEXT *ReturnedContext //返回的上下文
);
FltReleaseContext减少上下文的引用数量
它的原型是:
VOID
FltReleaseContext(
IN PFLT_CONTEXT Context //要释放的上下文
);
例如:
...
status = FltAllocateContext( Globals.Filter,
FLT_FILE_CONTEXT,
CTX_FILE_CONTEXT_SIZE,
PagedPool,
&fileContext );
...
FltReleaseContext(fileContext);
...
FltSetXxxContext 设置上下文
FltGetXxxContext 获得上下文
FltDeleteXxxContext删除上下文
他们对于不同的上下文原型大致相同,只知上下文对象不同,这里就不列出了。
例如,设置一个流句柄上下文:
status = FltSetStreamHandleContext( Cbd->Iopb->TargetInstance, //实例
Cbd->Iopb->TargetFileObject, //对象
ReplaceIfExists ? FLT_SET_CONTEXT_REPLACE_IF_EXISTS : FLT_SET_CONTEXT_KEEP_IF_EXISTS, //操作类型
streamHandleContext, //新的上下文
&oldStreamHandleContext ); //旧的上下文
获得一个卷上下文:
status = FltGetVolumeContext(
FltObjects->Filter, //驱动
FltObjects->Volume, //卷
&volCtx); //上下文
...
if (volCtx != NULL) {
FltReleaseContext(volCtx);
}
删除流上下文:
status = FltDeleteStreamContext(
FltObjects->Instance, //Instance
FltObjects->FileObject, //FileObject
&oldContext); //OldContext
...
if (oldContext != NULL) {
FltReleaseContext(oldContext);
}