wfp框架解析

我一直对wfp框架含混不清,搞驱动开发有一段时间了,拿着老板的钱,到对自己手头工作的一些基础概念都弄不明白,实在是说不过去,寝食难安,特此加深一下记忆和理解。

通过仔细分析开发过的wfp项目代码,发现WFP项目框架都有如下特征。
wfp框架有如下6个步骤,分别调用如下6个函数完成设置:

  1. FwpmEngineOpen0
  2. FwpmTransactionBegin0
  3. FwpsCalloutRegister0
  4. FwpmCalloutAdd0
  5. FwpmFilterAdd0
  6. FwpmTransactionCommit0

这6个API参数比较复杂,详细的参数可自行MSDN。下面稍微展开说一下这6个API的作用。

FwpmEngineOpen0:This function opens a session to the Windows Filtering Platform (WFP) filter engine.这个HANDLE是接下来其他函数必要的输入参数。与此函数相对的是FwpmEngineClose,关闭引擎。

FwpmTransactionBegin0:在当前会话中开始显式事务。

FwpsCalloutRegister0:注册回调函数。此函数参数比较复杂,主要是用来注册实现网络过滤功能操作的回调函数。

FwpmCalloutAdd0:增加回调函数。此函数参数为FWPM_CALLOUT0,而FwpsCalloutRegister0的参数为FWPS_CALLOUT0。

FwpmFilterAdd0: adds a new filter object to the system.

FwpmTransactionCommit0:commits the current transaction within the current session。

需要注意的几点:

  1. 除去初始化函数,一个完整的过滤规则要有以下3个函数的调用步骤才能完成注册:FwpsCalloutRegister0,FwpmCalloutAdd0,FwpmFilterAdd0。
  2. F w p s C a l l o u t R e g i s t e r 0 和 F w p m C a l l o u t A d d 0 中的 c a l l o u t K e y 要相同。 此值是一个自定义的 G U I D ,假设其为 A 。 \color{red}FwpsCalloutRegister0和FwpmCalloutAdd0中的calloutKey要相同。\\此值是一个自定义的GUID,假设其为A。 FwpsCalloutRegister0FwpmCalloutAdd0中的calloutKey要相同。此值是一个自定义的GUID,假设其为A
  3. F W P M F I L T E R 0 里面的 a c t i o n . c a l l o u t K e y 要和 F w p s C a l l o u t R e g i s t e r 0 以及 F w p m C a l l o u t A d d 0 中的 c a l l o u t K e y 相同,即必须都是上一条中的 A 。 \color{red}FWPM_FILTER0里面的action.calloutKey 要和\\FwpsCalloutRegister0以及FwpmCalloutAdd0中的calloutKey相同,即必须都是上一条中的A。 FWPMFILTER0里面的action.calloutKey要和FwpsCalloutRegister0以及FwpmCalloutAdd0中的calloutKey相同,即必须都是上一条中的A
  4. F W P M _ C A L L O U T 0 中的 a p p l i c a b l e L a y e r 和 F W P M F I L T E R 0 中的 l a y e r K e y 要相同。 此值是一个 w i n d o w s 定义的过滤类型,定义在系统头文件 f w p m k . h 中, 必须是一个合法的注册类型,而不能是任意值。 \color{red}FWPM\_CALLOUT0 中的 applicableLayer和FWPM_FILTER0中的layerKey要相同。\\此值是一个windows定义的过滤类型,定义在系统头文件fwpmk.h中,\\必须是一个合法的注册类型,而不能是任意值。 FWPM_CALLOUT0中的applicableLayerFWPMFILTER0中的layerKey要相同。此值是一个windows定义的过滤类型,定义在系统头文件fwpmk.h中,必须是一个合法的注册类型,而不能是任意值。
  5. F W P M _ F I L T E R 0 中的 s u b L a y e r K e y 字段有两点要注意。 当此值是 w i n d o w s 自定义类型是可以直接使用,比如 F W P M _ S U B L A Y E R _ U N I V E R S A L 。 若此值是自定义的,那就不能直接使用,必须使用 F w p m S u b L a y e r A d d 函数先创建一个子层, 然后在才能在 F W P M _ F I L T E R 0 的 s u b L a y e r K e y 字段中使用。 \color{red}FWPM\_FILTER0中的subLayerKey字段有两点要注意。\\当此值是windows自定义类型是可以直接使用,比如FWPM\_SUBLAYER\_UNIVERSAL。\\若此值是自定义的,那就不能直接使用,必须使用FwpmSubLayerAdd函数先创建一个子层,\\然后在才能在FWPM\_FILTER0的subLayerKey字段中使用。 FWPM_FILTER0中的subLayerKey字段有两点要注意。当此值是windows自定义类型是可以直接使用,比如FWPM_SUBLAYER_UNIVERSAL若此值是自定义的,那就不能直接使用,必须使用FwpmSubLayerAdd函数先创建一个子层,然后在才能在FWPM_FILTER0subLayerKey字段中使用。
  6. 上述过程的目的是,一个子层可以包含多个功能层,框架具有更好的扩展性。
  7. FWPM_FILTER中的numFilterConditions参数,一般设置为0。If you specify 0, this filter invokes its callout for all traffic in its layer。
  8. 除此之外,注册过程中还需要写入其他大量参数,但是这些参数MSDN上有明确的解释,在此不再赘述。

另外,当wfp关闭时,需要做的动作有如下几个:

  1. FwpmCalloutDeleteById
  2. FwpsCalloutUnregisterById
  3. FwpmEngineClose

你可能感兴趣的:(驱动,驱动开发,windows)