Ndis 6.0 lwf驱动,卸载时执行FilterPause,函数返回后系统没有响应。

mdcire 2016-08-17 11:22:02
我在使用Ndis 6.0 lwf开发过滤驱动。会发送和接收一些自定义的NBL数据。在发送和接收完成后再销毁自定义的数据。发送和接收的过程应该没有什么问题。现在主要问题是驱动运行一段时间后,在卸载的时候系统会变成没有响应的状态。Debug查看是在FilterPause返回后就出现这种状况。我猜应该是数据包没有发送接收完成导致系统一直在等待。所以在发送和接收数据时先添加了驱动状态的判断,如果Filter没有运行就停止再接收和发送数据,代码大致如下:

FILTER_ACQUIRE_LOCK(&pFilter->Lock, DispatchLevel);
if (pFilter->State != FilterRunning)
{
FILTER_RELEASE_LOCK(&pFilter->Lock, DispatchLevel);
if (NDIS_TEST_RECEIVE_CAN_PEND(ReceiveFlags))
{
ReturnFlags = 0;
if (NDIS_TEST_RECEIVE_AT_DISPATCH_LEVEL(ReceiveFlags))
{
NDIS_SET_RETURN_FLAG(ReturnFlags, NDIS_RETURN_FLAGS_DISPATCH_LEVEL);
}
NdisFReturnNetBufferLists(pFilter->FilterHandle, NetBufferLists, ReturnFlags); } break;
}
FILTER_RELEASE_LOCK(&pFilter->Lock, DispatchLevel);

这样应该在驱动暂停时停止了接收和发送新的数据。但是如何等待正在发送和接收的数据完成呢?我在FilterPause添加了:
if (pFilter->OutstandingRcvs > 0 || pFilter->OutstandingSends > 0)
{
NdisMSleep(5000000);
}
但是不起作用,没有延迟等待,NdisMSleep一下就过去了,KeWaitForSingleObject 也是一样的状况,这是为什么呢?是因为IRQL>=DISPATCH_LEVEL吗?那我该如何在FilterPause等待已发送和接收的数据完成呢?如何设定延迟呢?

...全文
701 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

21,616

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧