原创内容,转载的兄弟请注明出处。
在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了。中间加锁,建记录什么的大家自己来完成代码吧,本文只讲思路。