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);
}

 

posted @ 2010-12-29 16:52  UnhandleException  阅读(2373)  评论(0编辑  收藏  举报