FwpsPendOperation函数解析

最近在项目中需要使用FwpsPendOperation0这个函数,仔仔细细的把msdn上关于这个函数的英文都看了,受益匪浅,这个函数还是挺有意思的.

NTSTATUS NTAPI FwpsPendOperation0(
  _In_   HANDLE completionHandle,
  _Out_  HANDLE *completionContext
);
completionHandle [in]

A completion handle that is required to pend the current filtering operation. This parameter is obtained from the
completionHandle member of the FWPS_INCOMING_METADATA_VALUES0 structure passed into the callout driver‘s
classifyFn function.

completionContext [out]

The handle to the completion context of this pend operation. When the callout is ready to resume packet processing, it calls the
FwpsCompleteOperation0 function with the value of this parameter as the input
completionContext parameter.

To complete a connection that was previously pended at the FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_
Xxx layer, the callout driver must reinject the packet that was cloned at that layer as well as call the
FwpsCompleteOperation0 function.

//一个在FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_ Xxx层之前挂起的连接,如果想完成它,Callout比如reinject在那一层克隆的包,同时还要调用FwpsCompleteOperation0函数

To be able to pend packet processing, the callout driver‘s classifyFn function should set the actionType member of the
FWPS_CLASSIFY_OUT0 structure to FWP_ACTION_BLOCK and the
Flags
member to FWPS_CLASSIFY_OUT_FLAG_ABSORB.

//想挂起一个包处理,在Callout的classifyFn函数中必须设置actionType成员为FWP_ACTION_BLOCK,设置Flags成员为FWPS_CLASSIFY_OUT_FLAG_ABSORB.

Pended connections are reauthenticated after the FwpsCompleteOperation0 function executes. TCP connections, if allowed, are created by completing the handshake operation, but non-TCP connections only create state entries. Any pended packet
data is flushed from memory when the FwpsPendOperation0 function completes, so applications must retransmit those packets after
FwpsCompleteOperation0 runs. Callouts could buffer such data and reinject the data on their behalf.

//已被挂起的连接在FwpsCompleteOperation0函数执行后,就被重新识别了.

tcp连接,在三次握手完成以后就被创建了,但是非tcp连接仅仅创建了状态信息.当FwpsPendOperation0函数完成时,所有pended包数据都将从内存中清除.所以,应用程序在FwpsCompleteOperation0函数运行以后,必须重传这些数据,Callout函数可以缓冲一些数据,然后reinject这些数据on their behalf.(*^__^*) 嘻嘻……

Only an initial Application Layer Enforcement (ALE) flow authorization can be postponed by calling
FwpsPendOperation0 and FwpsCompleteOperation0.

If an ALE flow is reauthorized, the FWP_CONDITION_FLAG_IS_REAUTHORIZE flag is set. A call to
FwpsPendOperation0 from the FWPM_LAYER_ALE_AUTH_CONNECT_ Xxx or FWPM_LAYER_ALE_AUTH_RECV_ACCEPT_
Xxx filtering layers will fail if the FWP_CONDITION_FLAG_IS_REAUTHORIZE flag is set, and the STATUS_FWP_CANNOT_PEND status code will be
returned. For more information, see ALE Reauthorization in the Windows SDK.

如果一个ALE流是reauthorized的,FWP_CONDITION_FLAG_IS_REAUTHORIZE这个标志被设置.

在FWPM_LAYER_ALE_AUTH_CONNECT_ Xxx层和FWPM_LAYER_ALE_AUTH_RECV_ACCEPT_
Xxx
层调用FwpsPendOperation0函数,如果设置了FWP_CONDITION_FLAG_IS_REAUTHORIZE标志.那么函数调用将会失败.

状态码返回STATUS_FWP_CANNOT_PEND

所以在处理的时候必须要对FWP_CONDITION_FLAG_IS_REAUTHORIZE这个标志进行判断,否则

时间: 2024-11-06 04:03:43

FwpsPendOperation函数解析的相关文章

AngularJS指令中的compile与link函数解析

AngularJS指令中的compile与link函数解析 通常大家在使用ng中的指令的时候,用的链接函数最多的是link属性,下面这篇文章将告诉大家complie,pre-link,post-link的用法与区别. 原文地址 angularjs里的指令非常神奇,允许你创建非常语义化以及高度重用的组件,可以理解为web components的先驱者. 网上已经有很多介绍怎么使用指令的文章以及相关书籍,相互比较的话,很少有介绍compile与link的区别,更别说pre-link与post-lin

ngx_http_process_request_headers函数解析

ngx_http_process_request_headers函数被ngx_http_process_request_line函数调用,将请求头逐个放到r->headers_in.headers结构体中.由于不确定请求中一共有多少个header,所以这个函数主要功能也是在for(;;){}循环中完成,一下所有的代码都是在上述循环内部的.主要代码和解析如下: 判断是否超时,如果超时,报错并结束请求.    if (rev->timedout) {        ngx_log_error(NG

iOS 基础函数解析 - Foundation Functions Reference

Foundation Functions Reference Framework Foundation/Foundation.h Declared in NSBundle.h NSByteOrder.h NSDecimal.h NSException.h NSObjCRuntime.h NSObject.h NSPathUtilities.h NSRange.h NSZone.h Overview This chapter describes the functions and function

thread.join函数,java多线程中的join函数解析

join函数的作用,是让当前线程等待,直到调用join()的 线程结束或者等到一段时间,我们来看以下代码 1 package mian; 2 3 4 public class simpleplela { 5 static void threadMessage(String message) { 6 String threadName = 7 Thread.currentThread().getName(); 8 9 System.out.println(threadName+" "+m

socket使用TCP协议时,send、recv函数解析以及TCP连接关闭的问题

Tcp协议本身是可靠的,并不等于应用程序用tcp发送数据就一定是可靠的.不管是否阻塞,send发送的大小,并不代表对端recv到多少的数据. 在阻塞模式下, send函数的过程是将应用程序请求发送的数据拷贝到发送缓存中发送并得到确认后再返回.但由于发送缓存的存在,表现为:如果发送缓存大小比请求发送的大小要大,那么send函数立即返回,同时向网络中发送数据;否则,send向网络发送缓存中不能容纳的那部分数据,并等待对端确认后再返回(接收端只要将数据收到接收缓存中,就会确认,并不一定要等待应用程序调

BulkLoop例程の初始化函数and重复调度函数の解析

//----------------------------------------------------------------------------- // File: bulkloop.c // Contents: Hooks required to implement USB peripheral function. // // $Archive: /USB/Examples/FX2LP/bulkloop/bulkloop.c $ // $Date: 3/23/05 2:55p $

C++虚函数解析(转载)

虚函数详解第一篇:对象内存模型浅析 C++中的虚函数的内部实现机制到底是怎样的呢? 鉴于涉及到的内容有点多,我将分三篇文章来介绍. 第一篇:对象内存模型浅析,这里我将对对象的内存模型进行简单的实验和总结. 第二篇:继承对象的构造和析构浅析,这里我将对存在继承关系的对象的构造和析构进行简单的实验和总结. 第三篇:虚函数的内部机制浅析,这里我将对虚函数内部的实现机制进行实验总结. 我使用的编译器是VS2008,有不足或者不准确的地方,欢迎大家拍砖(我个人非常迫切的希望得到大家的指正),我会及时修正相

ngx_http_process_request_line函数解析

处理请求行,一般的http请求过程中,ngx_http_process_request_line函数被ngx_http_wait_request_handler调用,并且在ngx_http_wait_request_handler中被设置为读事件的回调函数.在连接被accept之后,有数据到达之后会执行ngx_http_create_request函数,之后再有读事件被触发时被调用的回调函数就是ngx_http_process_request_line.主要代码和解析如下. 判断是否超时,如果超

PHP json_decode 函数解析 json 结果为 NULL 的解决方法

在做网站 CMS 模块时,对于模块内容 content 字段,保存的是 json 格式的字符串,所以在后台进行模块内容的编辑操作 ( 取出保存的数据 ) 时,需要用到 json_decode() 函数. 但是在解析的时候,使用 json_decode() 函数解析的结果一直是 NULL,没有出现希望解析成的数组.下面是问题和分析: 1. 当输出 json 字符串时,代码和页面的显示内容分别是: echo $content = $res[0]['con']['content']; 只需要考虑 $c