0

我有这个 NDIS 过滤器驱动程序。我尝试在我的驱动程序中启动一个线程,该线程将每 10 秒发送一次数据包。

为此,我使用以下代码:

LARGE_INTEGER TimePrev, TimeNow;
void ThreadedAction()
{
    while(1)
    {
        KeQuerySystemTime(&TimeNow);
        if(NBLtoSend && (TimeNow.QuadPart - TimePrev.QuadPart)>100000000)
        {
            NdisFSendNetBufferLists(NBLtoSend->SourceHandle, NBLtoSend, 0, 0);
            KeQuerySystemTime(&TimePrev);
        }
    }
}

该函数以PsCreateSystemThreadin开头DriverEntry
但这不是发送我的数据包。
我尝试使用这个:

void ThreadedAction()
{
    while(1)
    {
        if(NBLtoSend)
        {
            NdisFSendNetBufferLists(NBLtoSend->SourceHandle, NBLtoSend, 0, 0);
        }
    }
}

此代码不停地发送我的数据包。

以下代码每 10 秒用我的数据包创建一个新文件(CreateFileS 是我的函数),但不发送我的数据包

LARGE_INTEGER TimePrev, TimeNow;
void ThreadedAction()
{
    while(1)
    {
        KeQuerySystemTime(&TimeNow);
        if(NBLtoSend && (TimeNow.QuadPart - TimePrev.QuadPart)>100000000)
        {
            PMDL pmdl = NET_BUFFER_CURRENT_MDL(NET_BUFFER_LIST_FIRST_NB(NBLtoSend));
            CreateFileS(NULL,(char*)MmGetMdlVirtualAddress(pmdl),MmGetMdlByteCount(pmdl));
            NdisFSendNetBufferLists(NBLtoSend->SourceHandle, NBLtoSend, 0, 0);
            KeQuerySystemTime(&TimePrev);
        }
    }
}

为什么会发生这种情况,我该怎么做才能每 10 秒发送一次数据包?

4

1 回答 1

0

NDIS6 编程模型是异步的。这意味着当你打电话时NdisFSendNetBufferLists,你实际上放弃了 NBL 的所有权。在通过FilterReturnNetBufferLists回调将 NBL 返回到您的过滤器之前,您不能重复使用它。

所以首先,你需要改变代码看起来更像这样:

PNET_BUFFER_LIST NblToSend;

void FilterReturnNetBufferLists(PNET_BUFFER_LIST NblChain)
{
    for each Nbl in NblChain
    {
        if(Nbl->SourceHandle == MyFilterHandle)
            NblToSend = Nbl;
        else
            NdisFReturnNetBufferLists(Nbl);
    }
}

void ThreadedAction()
{
    while(1)
    {
        if(NBLtoSend)
        {
            PNET_BUFFER_LIST TempNbl = NblToSend;
            NblToSend = NULL;
            NdisFSendNetBufferLists(TempNbl);
        }
    }
}

这样,您就遵守了 NDIS 规则:在将 NBL 退还给您之前,请勿再次发送。

接下来,循环非常低效。在实现时,循环将消耗 100% 的 CPU,忙着倒计时纳秒,直到发送另一个数据包的时间。相反,请使用计时器。系统将在 10 秒后调用您的线程。

于 2013-05-23T07:32:18.607 回答