TDI는 NDIS와 달리 제대로 돌아가는 샘플코드가 많지 않습니다. 그래서... 공부하기도 어렵죠.

그나마 제일 쓸만한 샘플코드 역할을 하는 것이 바로 오픈소스 방화벽인 TDIFW인데요... 이걸 Vista 이후에서 돌리면... 제대로 돌아가지 않습니다. 이 문제 관련해서 몇군데 수정을 해서 (일단은...) 제대로 동작하게 만들었는데요... 제가 찾아낸 문제있는 부분과 수정한 결과를 공유합니다. 

제가 테스트한 바로는 아래와 같이 두군데만 수정하면 잘 동작하는 것 같습니다. (상업적인 환경에서 돌려본 건 아닙니다. 물론 책임도 안지구요. ^^)

=================================================================================================================

문제 1 : Address Object를 쿼리하는 부분.

문제의 코드는 다음과 같습니다.

위의 코드 중 IoCallDriver 하는 부분을 보면 결과가 STATUS_PENDING인 경우에 대한 처리가 되어 있지 않음을 알 수 있습니다. XP에서는 이부분이 동기적으로 Return되었기 때문에 별 문제가 없었지만 Vista 이후에서는 비동기적으로 처리되기 때문에 IoCallDriver가 실패한 것으로 처리되어 done: 부분에서 Hash Table에 들어간 Address Object를 삭제시켜버리는 로직이 실행되어 버립니다.

보통 이럴 땐 완료루틴이 호출될 때까지 기다려주는 작업을 해 주죠. (IRQL 체크가 필요하겠지만... 테스트 결과로는 항상 PASSIVE로 들어오는 것 같습니다.)

제가 수정한 코드는 다음과 같습니다.


대충 보시면... 수정 내용은 다음과 같습니다.
1. Dispatch 루틴(tdi_create_addrobj_complete)에서 TDI_CREATE_ADDROBJ2_CTX 구조체에 pEvent 멤버를 추가하여 IoCallDriver 전에 이벤트를 초기화하고 구조체에 Setting해줍니다.
2. IoCallDriver가 STATUS_PENDING을 리턴한 경우 KeWaitForSingle... 로 대기 처리를 해줍니다.
3. Completion 루틴 (tdi_create_addrobj_complete2) 에서는 Pending Flag를 체크하여 SetEvent해준 후 STATUS_MORE_PROCESSING_REQUIRED 를 리턴해줍니다.
4. Dispatch 루틴에서는 대기 처리를 해 주었기 때문에 IoMarkPending을 Propargate할 필요가 없습니다. (없을 것... 같은데요?? ^^;;)


=================================================================================================================

문제 2 : Event Receive Routine

문제의 코드는 다음과 같습니다.

실제로 위의 코드를 실행해보면 두가지 문제가 있는데요...

1. Original Event Handler를 호출한 다음 결과 (status)값에 대한 검증이 없습니다. 이 결과가 SUCCESS가 아니라면 계속 진행하면 안되겠죠.

2. MSDN에 따르면 Original Event Handler의 마지막 OUT 인자인 *IoRequestPacket 에는 NULL 혹은 TDI Client에서 할당한 IRP 값이 들어있어야 하지만... Win7에서 돌려본 결과... '1'이라는 숫자값이나 '0xFFFFFFFF', 혹은... 아예 이상한 주소값이 들어있는 등... 문서대로 동작하지 않는 현상이 발견되었습니다. 그래서 결과는? 당근 BSOD가 뜹니다. ㅡ.ㅡ

이 부분은 어떻게 처리해야 할지 몰라서... 저는 일단 아래와 같이 주석처리를 했습니다. 단순한 방화벽 같은 프로그램이라면 이정도로도 충분하리라고 봅니다만... Incoming 패킷을 재조합해야 하거나 트래픽을 카운트해야 하는 프로그램이라면.. 이 문제를 어떻게든 처리해야 할 것으로 보여집니다. 

이 문제... 근본적으로 해결하신 분이 계시면... 공유 좀 부탁드려요~~ ^^;;;



'Kernel Inside > TDI' 카테고리의 다른 글

TDIFW를 Vista 이후에서 동작시키기  (0) 2012.04.23
Posted by kuaaan

댓글을 달아 주세요



사랑합니다. 편안히 잠드소서