2013-05-21 2 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); 
     } 
    } 
} 

이 기능은 DriverEntryPsCreateSystemThread 시작 :

은이 코드를 사용, 그렇게합니다.
하지만 내 패킷을 보내지 않습니다.
나는 이것을 사용하려고 :

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를 보내지 마십시오.

다음으로 루핑은 매우 비효율적입니다. 구현시, 루프는 CPU의 100 %를 소비하며, 다른 패킷을 전송할 때까지 부수적으로 나노초를 카운트 다운합니다. 대신 use a timer. 10 초가 경과하면 시스템에서 스레드를 호출합니다.

+0

** 1 ** 'FilterReturnNetBufferLists'이 아닌'FilterSendNetBufferListsComplete'입니까? ** 2. ** NBL의 소유권을 NDIS에 전달했기 때문에 문제가 발생하는 경우 첫 번째 호출에서 전송하지 않는 이유는 무엇이며 시간을 확인하지 않으면 패킷을 보내는 이유는 무엇입니까? ** 3. ** 타이머는 사용하지 않습니다. 왜냐하면이 스레드는 내가 항상 실행하고 싶은 다른 것도하기 때문입니다. – user2403272

+0

1. 예, 어리석은 나를. 나는'FilerSendNetBufferListsComplete'을 의미했습니다. –

+0

2.이 질문의 의미를 잘 모르겠습니다. 다시 말해 줄 수 있니? –

관련 문제