首页
社区
课程
招聘
[已解决]求教,关于minifilter,为什么FilterGetMessage函数会阻塞住不执行
2022-3-29 10:38 5656

[已解决]求教,关于minifilter,为什么FilterGetMessage函数会阻塞住不执行

2022-3-29 10:38
5656

驱动里这样发消息:

1
2
3
4
5
6
7
8
9
_Message MessageSend;
MessageSend.target = target;
MessageSend.policy = policy;
MessageSend.operation = operation;
memset(MessageSend.Buffer, 0, ComBufferLength);
memcpy(MessageSend.Buffer, usDosPath->Buffer, usDosPath->Length);
 
PLARGE_INTEGER timeout = -200000;
NTSTATUS status = FltSendMessage(gFilterHandle, &gClientPort, &MessageSend, sizeof(_Message), NULL, NULL, &timeout);

应用程序里这样收消息:

1
2
3
4
5
6
7
8
9
10
while (1)
{
    memset(dataGet.message.Buffer, 0, ComBufferLength);
    HRESULT hResult = FilterGetMessage(g_hPort, (PFILTER_MESSAGE_HEADER)&dataGet, sizeof(COM_MESSAGE), NULL);
if (hResult == S_OK)
 {
        string MBCS = UNICODE_To_MBCS(dataGet.message.Buffer);
        printf("data from driver :%s,operation:%s\n", MBCS.c_str(), ConvertEnumToString(dataGet.message.operation));
   }
}

这样过一阵子之后,线程状态变成“wait:Executive”了,FilterGetMessage函数也收不到消息了。问题出在哪里了,请高手说一下


[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

最后于 2023-2-28 16:15 被神经蛙555编辑 ,原因: 已解决
收藏
点赞0
打赏
分享
最新回复 (5)
雪    币: 12837
活跃值: (8998)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
hzqst 3 2022-3-29 11:58
2
0
[in, out] lpOverlapped

Pointer to an OVERLAPPED structure. This parameter is optional and can be NULL. If it is not NULL, the caller must initialize the hEvent member of the OVERLAPPED structure to a valid event handle or NULL.

有异步的iocp你不用然后怪api阻塞?
雪    币: 197
活跃值: (611)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
神经蛙555 2022-3-29 14:14
3
0
hzqst [in, out] lpOverlapped Pointer to an OVERLAPPED structure. This parameter is optional and can be ...
我的意思是驱动发了消息,api还是阻塞。现在经过我反复观察,发现似乎与另一个线程有关系。另一个线程是这样设计的,循环体中检查配置文件,如果配置文件被修改了,就把配置发送给驱动。可是又似乎不可能有影响,因为配置文件并没有变动啊,就算可能有什么竞争关系,也没法实际形成啊。
另一个线程的函数是这样的:

unsigned __stdcall ThreadFunc(void* pArguments)
{
    ULARGE_INTEGER modtime1;
    if (!GetPolicyModifyTime(modtime1))
        return 0;

    while (1)
    {
        Sleep(3000);//过一小时检查一下

        //重新获取策略文件的修改时间
        ULARGE_INTEGER modtime2;
        if (!GetPolicyModifyTime(modtime2))
            continue;

        //如果修改时间变新了吗就重新发送策略
        if (modtime2.QuadPart > modtime1.QuadPart)
        {
            SendPolicy();//这里边用到了FilterSendMessage函数
            modtime1 = modtime2;
        }   
    }

    return 0;
}


话说这个异步的怎么用
雪    币: 2415
活跃值: (9240)
能力值: ( LV13,RANK:385 )
在线值:
发帖
回帖
粉丝
TkBinary 5 2022-3-29 16:18
4
0
参考Minifilter下的例子 scanner。他就用了异步。 直接把user代码抄了用就行。 还有驱动发送数据给ring3其实会带有一个消息头(里面有ID) 然后 发送回复数据的时候要带着回复头。 直接抄 user代码就行。
雪    币: 197
活跃值: (611)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
神经蛙555 2022-3-29 17:15
5
0
TkBinary 参考Minifilter下的例子 scanner。他就用了异步。 直接把user代码抄了用就行。 还有驱动发送数据给ring3其实会带有一个消息头(里面有ID) 然后 发送回复数据的时候要带着回复头。 ...
好 谢谢您还有楼上的,我正在看那个例子。 不过我不想reply,似乎也可以吧。我看api说明里,FltSendMessage函数是可以不接收Reply的。不接收也就不需要Reply了吧
雪    币: 2415
活跃值: (9240)
能力值: ( LV13,RANK:385 )
在线值:
发帖
回帖
粉丝
TkBinary 5 2022-3-30 09:36
6
0
可以不要reply的。看你自己需求。 带着reply只是告诉内核。哪个fltsendmessage要响应了。它的完成端口可以抄。很好的例子。
游客
登录 | 注册 方可回帖
返回