关于WFP CALLOUT中获取进程PID不正常的解决办法

原创内容,转载的兄弟请注明出处。
在WFP的CALLOUT中,我们获取进程PID通常是这样的
inMetaValues->processId

但是这样获取PID有可能获取到的是0,原因呢有两个
1.就是有时通讯被转到了SYSTEM或者WMIPRVSE.EXE中。
2.就是IRQ层级问题。

解决办法
1.PsGetCurrentProcessId 获取,connect时正常,但Send,Recv时仍然有时为0
2.PEPROCESS获取
Process = IoGetCurrentProcess();
sPID = PsGetProcessId(Process);
问题来了,这样获取有可能是SYSTEM或者WMIPRVSE.EXE的PID。

那么最终如何完美获取进程PID呢?
网上有种说法,通过进程回调,对比路径来确定PID.但是多核浏览器用这招就不行了。
不能正常获取PID看似小问题,但对进行过滤与拦截那影响可就大了。

经过摸索,笔者实际解决了此问题,现在说一下思路,代码就大家自己写就行了。
笔者的思路不一定是最优,但在不影响性能的前提下能实用。

1.首先要获取PID,用上面的解决办法,这样至少PID不为0了
2.在CONNECT时,自己写代码,(链表,数组什么的看自己喜好)记录通讯句柄与当前PID(inMetaValues->flowHandle)
3.FWPS_LAYER_ALE_ENDPOINT_CLOSURE时,根据inMetaValues->flowHandle删除记录
4.在SEND/RECV等操作时,获取PID不为0时,我们查表inMetaValues->flowHandle,如果查出来的PID与获取到的不同时,我们认为表里的PID才是正确的。

由此即可完美获取通讯的进程PID了。中间加锁,建记录什么的大家自己来完成代码吧,本文只讲思路。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值