2012-06-29 8 views
2

나는 WDK에서 제공하는 2012 년NDIS와 미니 포트 드라이버

샘플은 '미니 포트 어댑터'와 다른 사람의 사이에서 'NDIS 경량 필터'입니다 비주얼 스튜디오에서 제공하는 WDK 도구를 사용하여 이더넷 드라이버를 수정하려합니다. 나는 아직 운전 기사 작성의 시작 단계에 있으므로 코드를 탐색하기가 어렵다.

Visual Studio 2012에서 빌드 한 후 미니 포트 어댑터를 설치할 수있었습니다. [내 네트워크 어댑터 목록에 'Microsoft 가상 미니 포트 어댑터'로 표시됩니다.] 또한 IP 주소와 서브넷 마스크를 지정할 수 있습니다. [이 사실이 내 PC의 물리적 장치에 연결되지 않는다는 것을 알게되었습니다.]

또한 'Debug View'소프트웨어를 설치하여 어댑터에서 드라이버 메시지를 확인합니다. [코드에서 'DbgPrint'문을 사용한 다음 빌드했습니다.]하지만 디버그 메시지는 반복적으로 인쇄됩니다.

1- 왜 메시지가 계속해서 다시 인쇄됩니까? 메시지는 프로그램의 'datapath.c'파일에 있으며 'MPSendNetBufferLists'함수의 메시지입니다. [ '순 버퍼'지정 데이터를 전송하거나 네트워크에서 수신.]

2 I 설치 Wireshark를 어댑터에 데이터를 캡처하고이 나오는 등 ARP, HTTP, SSDP, MDNS의 요청이 있다는 것을 보여줍니다 그것. 어댑터에 실제로 무엇이 이야기되고 있는지 이해할 수 없습니까? 어떻게 말을 멈추게 할 수 있습니까?

'ping'을 사용하여 어댑터에 할당 한 IP 주소에 연결이 있는지 확인할 수 있으며 모든 패킷을 보내고 패킷 손실이 없음을 알리는 성공으로 응답합니다.

나의 목표는이 이더넷 어댑터에 IP 주소를 통해 '데이터'패킷을 보내고받는 것입니다. 즉, 응용 프로그램에서 어댑터에 할당 된 IP 주소에 연결하여 대화하고 싶습니다.

3 실제로 WDK에서 제공되는 샘플로 수행 할 수 있습니까?

기타 제안이나 조언을 환영합니다.

PS- 저는 Visual Studio 2012에 내장 된 Windows 디버거를 사용할 수 없었습니다. 2 대의 PC를 사용하여 '대상'PC에 드라이버를 연결하고 설치할 수 있었지만 중단 점 등으로는 아무 것도 할 수 없었습니다. 코드와 프로그램은 '대상'PC에 드라이버를 설치 한 후에 아무 것도하지 않았습니다. 이것에 대한 제안?. 나는 운전자의 단계별 디버깅도 할 수 있다고 생각했다. [나는 틀렸다는 것을 알고있다].

감사 아 디트

답변

5

NDIS 미니 포트 드라이버는 많은 낮은 수준의 드라이버와 같은 하드웨어로 이야기하기위한 것입니다. 미니 포트의 책임은 OS에서 패킷을 보내고, 하드웨어에서 요구하는 포맷으로 변환하고, 하드웨어로 하여금 패킷을 유선으로 전송하도록 지시하는 것입니다.

WDK는 실제 하드웨어에서 패킷을 보내는 실제 샘플 드라이버를 포함 할 수 있습니다. 그러나 실제 드라이버는 샘플의 주요 지점에서 벗어나는 많은 하드웨어 관련 세부 사항을 다루어야하므로 약간의 혼란을 낳습니다. 실세계 드라이버에서 시작한다면 가장 먼저해야 할 일은 하드웨어 별 비트를 모두 식별하여 추출하는 것입니다. 따라서 하드웨어 별 비트로 대체 할 수 있습니다.

대신 WDK의 "netvmini"샘플은 가짜 드라이버입니다. 즉 실제 하드웨어를 가지고있는 것처럼 보이지만 은밀하게 거짓말입니다.OS가 netvmini에 패킷을 보내면 netvmini 드라이버는 해당 패킷을 해당 시스템에 설치된 다른 netvmini 미니 포트 어댑터로 브로드 캐스트합니다. 실제로 동일한 기계에 2 개의 netvmini 어댑터를 설치하면 동일한 이더넷 허브에 2 개의 실제 어댑터를 연결 한 경우의 상황을 시뮬레이션 할 수 있습니다. ASCII- 미술에서 이는 동일한 시스템에 두 개의 netvmini 어댑터를 설치하면 발생합니다 :

 TCPIP      TCPIP      TCPIP 
     |       |       | 
Real physical miniport  Your netvmini #1   Your netvmini #2 
     |       \      /
    [The Internet]      [The netvmini virtual hub] 

ASCII- 아트가 잘하면, netvmini 어댑터에는 인터넷 경로가 없습니다. 따라서 드라이버가 하드웨어의 세부 사항을 추가 할 때까지 인터넷으로 라우팅 할 수있는 "실제"IP 주소를 얻지 못합니다. 그때까지 Windows는 계속 ARP와 HTTP 요청을 보내려고 노력할 것입니다.

는 특정 질문에 대답하려면 : MPSendNetBufferLists에서

  1. 메시지는 OS가 패킷을 보낼 때마다 인쇄됩니다. 운영 체제는 실제 네트워크 연결이 있다고 생각하기 때문에 운영 체제는이를 사용하려고하는 몇 가지 시도를합니다. 궁극적으로 이것은 조용한 상태 여야합니다. 모든 것이 결론에 이르면 유용한 링크가 아닙니다.

  2. 요청은 TCPIP에서옵니다. TCPIP가 데이터를 보내지 않게하려면 어댑터에서 바인드 해제하십시오.

  3. 확실히 데이터를 어댑터로 보낼 수 있습니다. 사실, 당신은 이미 임의의 HTTP 패킷 등을 보내고있는 것을 보았습니다.하지만 실제 하드웨어와 대화하는 방법을 가르쳐 줄 때까지 데이터는 실제로 인터넷에 도달하지 않습니다.

"하지만 하드웨어가 없습니다!"라고 생각하면 거기에 일종의 가상 미니 포트를 만들 수 있습니다. 가상 미니 포트는 실제 하드웨어가 없다는 점에서 netvmini와 유사하지만 여전히 패킷을 기계에서 가져올 수있는 방법이 있습니다. 예를 들어 L2TP와 같은 계층 2에서 작동하는 VPN 미니 포트는 일반적으로 두 번째 드라이버 인 —을 설치하고 "실제"실제 미니 포트에서 데이터를 보내고받는 NDIS 프로토콜 드라이버 —을 설치합니다. 그런 다음 패킷을 기계에서 가져와야 할 때마다 가상 미니 포트가 프로토콜과 통신합니다. 결과는 다음과 같습니다.

 TCPIP 
      | 
    Your virtual miniport 
      | 
    Your NDIS protocol 
      | 
The real physical miniport 
      | 
    The Internet 

다른 아키텍처가 있습니다. 예를 들어, 레이어 4 (SSTP 등)에서 작동하는 VPN은 NDIS 프로토콜 드라이버를 구현하는 대신 WSK 소켓을 열 결정할 수 있습니다 : 내가 독서를 많이 가지고있는 것처럼

 TCPIP 
      | 
    Your virtual miniport 
      | 
     WSK socket 
      | 
     TCPIP 
      | 
The real physical miniport 
      | 
    The Internet 
+0

친애하는 제프리가 보이는! 물건을 정리해 주셔서 감사합니다. 이더넷 드라이버를 만들 때 참조 할 수있는 자습서가 있습니까? 현재 msdn docs 및 osronline docs를보고 있습니다. –

+0

나는 그것이 당신의 학습 스타일에 달려 있다고 생각합니다. 개인적으로, 나는 (보통 잘못 처음 몇 번은 ...)하는 것으로 배웁니다. Netvmini와 ndislwf 샘플은 땜질하기에 좋은 출발점입니다. 책을 선호한다면 거기에 몇 가지 좋은 WDF 서적이 있고 TCPIP에 관한 책은 결코 아프지 않을 것입니다. 마지막으로 MSDN에는 실제로 NDIS에 대한 정보가 * 톤 * 있습니다. 당신은 방금 그것을 충분히 발견 할 수 있도록 체계적이어야합니다. –

+0

안내에 다시 한 번 감사드립니다. 나는 거의 1 주일 이래로 그 2 명의 운전자에게 집중하고 있었다. 더 많은 것을 커버하고 곧 사용할 수 있기를 바랍니다. –