0

この NDIS Filter Driverがあります。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 が返されるまで、NBL を再度送信しないでください。

次に、ループは非常に非効率的です。実装されると、ループは CPU を 100% 消費し、別のパケットを送信する時間になるまでナノ秒を忙しくカウントダウンします。代わりに、タイマーを使用してください。10 秒が経過すると、システムはスレッドを呼び出します。

于 2013-05-23T07:32:18.607 に答える