NDIS 드라이버 공부 내용 정리합니다.

http://www.htsns.com 를 참조해서 작성 되는 내용이므로 정확한 내용을 원하시는 분은 참고하시길 바랍니다.

 

드라이버를 공부하시려면 꼭 기억해야 될 내용이 있습니다. 일반적인 드라이버를 짤 때 우리는 아래 그림과 같은 문장을 사용합니다.

이 그림이 뭘 의미 하는 걸까요? 바로 콜백함수의 등록입니다. NDIS 드라이버도 마찬가지지만 콜백을 잘 끼워 맞추기만 하면 됩니다.

콜백의 기능, 전체적인 콜백 호출 흐름, 각 콜백 안에서 호출해야 할 API들을 파악했다면 NDIS의 절반 이상을 이해한 것이라고 합니다. (참조: http://xeraph.com/4787739)

 

 

IntermediateDriver의 초기화는 처음 공부하는 저에게는 상당히 어렵더군요. (사실 아직도 이해하는 중입니다.)

이 글에서는 일반적인 드라이버의 DriverEntry와 Intermediate 드라이버의 DriverEntry를 비교하겠습니다. 그래서 어떻게 다른지 개략적으로 설명하고 다음 글에서부터 본격적으로 분석을 해보도록 하겠습니다.

Intermediate 드라이버의 예제는 DDK 폴더 안의 passthru라는 예제가 있습니다. 그 예제를 기반으로 설명하겠습니다.

 

일반적인 드라이버의 경우 IoCreateDevice를 호출해서 드라이버를 생성하게 됩니다. 그 후 심볼릭(Symbolic) 링크를 만들고 MajorFunction(DDK WDM 문서 참조)의 콜백함수를 지정하는 것으로 넘어가게 됩니다.

 

 

하지만 NDIS 드라이버의 경우 많이 다릅니다. 우리가 작성하려고 하는 NDIS Intermediate Driver의 예를 들자면 여러 초기화 과정이 필요하게 됩니다.

passthru의 DriverEntry 함수를 보시면 크게 네 개의 초기화 단계(아래 그림 참조)로 나눌 수 있습니다.

또한, DDK 문서(참고: moltak.net: NDIS Driver 02) Intermediate Driver)에 MiniportXxx, ProtocolXxx함수를 노출시켜야 한다고 설명하고 있습니다.

그래서 NDIS의 초기화 단계는 Miniport, Protocol Driver의 콜백함수를 설정해야 합니다.

 

 

 

1. NdisMInitializeWrapper을 호출하고 NdisWapperHandle에서 리턴된 핸들을 지정한다.

2. 드라이버의 MiniportXxx 함수들을 등록하기 위해서 NdisIMRegisterLayeredMiniport를 호출하고 스텝 1에서 얻어진 핸들을 인자로 보낸다.

NdisMinitializeWrapper 함수를 호출해서 NDIS_HANDLE을 얻어 올 수 있습니다.(NdisWrapperHandle 변수)

그리고 이 변수를 이용해서 우리는 MiniportXxx와 ProtocolXxx를 노출 시켜줄 수 있습니다.

위 소스에서 MChars라는 변수에 여러 가지 콜백함수를 설정하고 있는 것을 볼 수 있습니다.

현재는 이것을 통해서 콜백을 등록하고 가장 아래 있는 NdisIMRegisterLayeredMiniport를 이용 MiniportXxx를 등록한다고만 아시면 됩니다. (자세한 설명은 다음 블로깅을 통해 하도록 하겠습니다.)

 

 

3. 만약 드라이버가 그 자신을 밑의 NDIS 드라이버에게 다음에 바인드 한다면 드라이버의 ProtocolXxx 함수들을 등록하기 위해서 NdisRegisterProtocol을 호출한다.

위 소스도 ProtocolXxx함수를 노출시키기 위해서 하는 것입니다. 각종 콜백함수를 등록하고 아래에 있는 NdisRegisterProtocol을 통해 인터미디엇 드라이버의 ProtocolXxx함수들을 노출시킵니다. 각 콜백함수의 내용은 복잡하고 역할은 아직 잘 모릅니다. (알아야 할게 너무 많네요ㅠㅠ)

 

 

4. 만약 드라이버가 MiniportXxx와 ProtocolXxx함수들 둘 다를 드러낸다면, 드라이버의 미니포트 하위경계와 프로토콜 상위경계에 대해서 NDIS 라이브러리를 형성하기 위해서 NdisIMAssociateMiniport를 호출한다.

우리는 MiniportXxx와 ProtocolXxx함수를 노출하길 원합니다. (노출하기 원하지 않다면 한 개의 핸들만 넣어도 되는 건지는 확실하지 않네요. ㅠㅠ)

NdisIMAssociateMiniport 함수는 NDIS에게 미니포트와 프로토콜을 위한 특정 lower와 upper 인터페이스들이 각각 같은 인터미디엇 드라이버에 속한다는 것을 알립니다.

 

 

여기까지 해서 DriverEntry에 대한 개략적인 설명이 끝났습니다. 원본 소스파일은 ddk\src\network\ndis\passthru\driver\passthru.c 파일을 참조하시기 바랍니다.

다음은 인터미디엇 드라이버의 DriverEntry에서 Miniport를 등록하는 부분을 더욱 세세하게 설명을 하도록 하겠습니다. 내용이 많아서 몇 챕터로 쪼개서 해야겠네요. 아무튼 모두들 즐공! 즐프! 하세요.

 

 

Bloger: moltak.net

'Programming > WinDriver' 카테고리의 다른 글

NDIS Driver 02) Intermediate Driver  (0) 2010.05.06
NDIS Extending The PassThru IM Driver  (0) 2010.05.06
NDIS Driver 01) 시작  (0) 2010.05.02
DDK 개발 환경 구축  (0) 2010.04.18
NDIS/TDI  (0) 2010.03.18
이 자료는 정말 마음에 드네요. (아직 다 보지는 못했지만)


Thomas F. Divine님과 James Antognini님이 작성한 문서입니다.
DDK를 깔면 예제로 깔리는 PassThru를 확장해서 설명해 놓으셨습니다.
처음 Intermediate(IM) Driver를 공부하려고 하면 정말... 어떻게 해야 할지 막막했습니다.
DDK 문서와 이 문서를 갖고 계속 공부를 해 나가야겠습니다.
그럼 모두 즐프하세요.


Bloger: moltak.net

'Programming > WinDriver' 카테고리의 다른 글

NDIS Driver 03) Intermediate Driver 초기화  (0) 2010.05.09
NDIS Driver 02) Intermediate Driver  (0) 2010.05.06
NDIS Driver 01) 시작  (0) 2010.05.02
DDK 개발 환경 구축  (0) 2010.04.18
NDIS/TDI  (0) 2010.03.18

+ Recent posts