2013-05-21 30 views
0

我有this 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); 
     } 
    } 
} 

功能開始PsCreateSystemThreadDriverEntry
但這不是發送我的數據包。
我嘗試使用此:

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秒發送一次數據包?

回答

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,忙於對納秒進行倒計時,直到發送另一個數據包。相反,use a timer。系統將在10秒鐘後進入您的線程。

+0

** 1。**你確定它是FilterReturnNetBufferLists而不是FilterSendNetBufferListsComplete嗎? ** 2。如果問題是因爲我將NBL的所有權傳遞給NDIS,爲什麼它不在第一次調用中發送?以及爲什麼在我不檢查時間時發送數據包? ** 3。**我沒有使用定時器,因爲這個線程也做了其他的事情,我想一直執行。 – user2403272

+0

1.是的,我很傻。我的意思是'FilerSendNetBufferListsComplete' –

+0

2.我不確定這個問題的含義;你能改述一下嗎? –