NetAdapterCx에 NDIS 미니포트 드라이버 포팅

이 페이지에서는 NDIS 6.x 미니포트 드라이버를 NetAdapterCx 클라이언트 드라이버로 변환하는 방법을 설명합니다.

WDF에 대한 일반적인 내용은 WDF 드라이버 개발 가이드검토하세요.

컴파일 설정

Visual Studio에서 기존 NDIS 미니포트 드라이버 프로젝트를 열고 다음 단계를 사용하여 KMDF 프로젝트로 변환합니다.

  1. 먼저 Configuration Properties-Driver 설정->Driver 모델로 이동하여 드라이버 유형이 KMDF로 설정되어 있고 KMDF 버전 주 버전과 KMDF 버전 부 버전이 모두 비어 있는지 확인>합니다.

  2. 프로젝트 속성에서 드라이버 설정->네트워크 어댑터 드라이버를 열고 네트워크 어댑터 클래스 확장에 대한 링크를 Yes설정합니다.

    • 변환된 드라이버가 여전히 NDIS API를 호출하는 경우 계속 연결 ndis.lib합니다.
  3. 같은 NDIS 전처리기 매크로를 제거합니다 NDIS650_MINIPORT=1.

  4. 모든 원본 파일(또는 공통/미리 컴파일된 헤더)에 다음 헤더를 추가합니다.

    #include <ntddk.h>
    #include <wdf.h>
    #include <netadaptercx.h>
    
  5. INF에 표준 WDF 장식을 추가합니다.

    [Yourdriver.Wdf]
    KmdfService = Yourdriverservice, Yourdriver.wdfsect
    
    [Yourdriver.wdfsect]
    KmdfLibraryVersion = <insert here>
    
  6. INF의 NT 섹션에 새 필수 네트워킹 키워드(keyword) 추가합니다.

    • *If커넥트orPresent

    • *커넥트ionType

    • *DirectionType

    • *AccessType

    • *HardwareLoopback

      이러한 키워드(keyword) 및 예제에 대한 자세한 내용은 NetAdapterCx 클라이언트 드라이버에 대한 INF 파일을 참조하세요.

드라이버 초기화

DriverEntry에서 NdisMRegisterMiniportDriver 대한 호출을 제거하고 다음을 추가합니다.

WDF_DRIVER_CONFIG_INIT(&config, EvtDriverDeviceAdd);
status = WdfDriverCreate(. . . );
if (!NT_SUCCESS(status)) {
  return status;
}

설정된 경우 WdfDriverCreate 호출에서 WdfDriverInitNoDispatchOverride 플래그를 제거합니다.

DriverUnload 는 WDF 네트워킹 클라이언트 드라이버에 대한 선택적 루틴이므로 원하는 경우 제거할 수 있습니다. DriverUnload에서 NdisMDeregisterMiniportDriver를 호출하지 마세요.

디바이스 초기화

다음으로 MiniportInitializeEx코드를 적절한 WDF 이벤트 콜백 처리기로 배포합니다. 그 중 일부는 선택 사항입니다. 콜백 시퀀스에 대한 자세한 내용은 네트워크 어댑터 WDF 클라이언트 드라이버에 대한 Power-Up 시퀀스를 참조 하세요.

Net 어댑터를 시작할 때는 NetAdapterStart를 호출하기 전에 NdisMSetMiniportAttributes에 해당하는 메서드를 호출합니다. 그러나 클라이언트 드라이버는 제네릭 NDIS_MINIPORT_ADAPTER_ATTRIBUTES 구조로 하나의 루틴을 호출하는 대신 다른 함수를 호출하여 다양한 유형의 기능을 설정합니다.

제공해야 하는 콜백 및 Net 어댑터를 시작하는 시기에 대한 자세한 내용은 디바이스 및 어댑터 초기화를 참조하세요.

레지스트리에서 구성 읽기

다음으로, NdisOpenConfigurationEx 및 관련 함수에 대한 호출을 메서드로 NetConfiguration* 바꿉니다. 메서드는 NetConfiguration* 함수와 유사 Ndis*Configuration* 하므로 코드를 재구성할 필요가 없습니다.

자세한 내용은 구성 정보 액세스를 참조 하세요.

사용자 모드에서 I/O 제어 코드(IOCTL) 수신

NDIS 드라이버가 CDO(컨트롤 디바이스 개체)를 만들어 사용자 모드에서 IOCTL을 수신하는 데 사용되는 루틴인 NdisRegisterDeviceEx를 호출하는 경우 이 섹션을 읽어 보세요.

WDF 네트워킹 클라이언트 드라이버에서 이 작업을 수행하는 두 가지 방법은 다음과 같습니다.

가장 간단한 포트는 클라이언트의 EVT_WDF_DRIVER_DEVICE_ADD 콜백에서 WdfControlDeviceInitAllocate를 호출하여 제어 디바이스 개체를 만드는 것입니다. 자세한 내용은 제어 디바이스 개체 사용을 참조 하세요.

그러나 권장되는 솔루션은 디바이스 인터페이스 사용에 설명된 대로 디바이스 인터페이스를 만드는 것입니다.

디바이스 초기화 완료

EVT_WDF_DRIVER_DEVICE_ADD 이 시점에서 인터럽트 할당과 같이 디바이스를 초기화하려는 다른 작업을 수행할 수 있습니다.

전원 상태 변경 알림 처리

WDF 클라이언트 드라이버는 전원 상태 변경에 대한 OID_PNP_SET_POWER 받지 않습니다.

대신 WDF 클라이언트는 선택적 콜백 함수를 등록하여 전원 상태 변경 알림을 받습니다. 개요는 함수 드라이버에서 PnP 및 전원 관리 지원을 참조 하세요.

일반적으로 OID_PNP_SET_POWER 처리기의 코드는 EVT_WDF_DEVICE_D0_EXIT EVT_WDF_DEVICE_D0_ENTRY 이동합니다.

WDF 전원 상태 컴퓨터는 약간 다르므로 코드를 약간 수정해야 할 수 있습니다.

특히 MiniportInitializeEx 콜백 함수에서 NDIS 미니포트 드라이버는 일회성 초기화 작업뿐만 아니라 디바이스를 D0 상태로 가져오는 작업을 수행합니다. 그런 다음 작업을 반복하여 OID_PNP_SET_POWER 처리기에서 D0으로 이동합니다.

반면, WDF 클라이언트는 디바이스가 저전력 상태인 EVT_WDF_DEVICE_D0_ENTRY 전에 이벤트 콜백에서 일회성 초기화 작업을 수행합니다. 그런 다음 EVT_WDF_DEVICE_D0_ENTRY D0으로 이동하는 작업을 수행합니다.

요약하자면, WDF에서는 "D0으로 이동" 코드를 두 개 대신 한 곳에 배치합니다.

콜백 시퀀스에 대한 자세한 내용은 NetAdapterCx 클라이언트 드라이버에 대한 Power-Up 시퀀스를 참조 하세요.

전원 관리 기능 쿼리 및 설정

마찬가지로 WDF 클라이언트 드라이버는 네트워크 어댑터의 전원 관리 하드웨어 기능을 쿼리하거나 설정하는 OID_PM_PARAMETERS 받지 않습니다.

대신 드라이버는 NETPOWERSETTINGS 개체에서 필요한 WoL(Wake-On-LAN) 구성을 쿼리합니다. 자세한 내용은 전원 관리 구성을 참조하세요.

다시 가져오는 실제 플래그는 NDIS 6 미니포트와 동일한 의미 체계를 가지므로 논리를 자세히 변경할 필요가 없습니다. 기본 차이점은 이제 전원 다운 시퀀스 중에 이러한 플래그를 쿼리할 수 있다는 것입니다. NetAdapterCx 클라이언트 드라이버에 대한 전원 다운 시퀀스를 참조하세요.

이 코드를 이동한 후에는 OID_PNP_SET_POWER 및 OID_PM_PARAMETERS 대한 OID 처리기를 삭제할 수 있습니다.

NetAdapter 프레임워크는 호스트가 네트워크 인터페이스를 사용하는 동안 디바이스를 D0에 유지하므로 클라이언트는 일반적으로 전원 논리를 구현하지 않습니다. 기본 NetAdapter 전원 동작으로 충분합니다.

데이터 경로

데이터 경로 프로그래밍 모델이 크게 변경되었습니다. 몇 가지 주요 차이점은 다음과 같습니다.

  • NetAdapter 모델에서 네트워크 트래픽은 더 이상 NDIS와 같이 어댑터당이 아니라 WDF 큐당입니다. I/O 큐 만들기를 참조 하세요.
  • NetAdapterCx는 NET_BUFFER_LIST 및 NET_BUFFER 풀 대신 다음과 같이 NDIS에 매핑되는 순 패킷으로 구성된 링 버퍼를 도입합니다.
    • NET_PACKET NET_BUFFER_LIST + NET_BUFFER 비슷합니다.
    • NET_PACKET_FRAGMENT MDL(메모리 설명자 목록)과 비슷합니다. 각 NET_PACKET 이 중 하나 이상이 있습니다.
    • 대체 구조체 및 사용 방법에 대한 자세한 내용은 패킷 설명자 및 확장을 참조 하세요.
  • NDIS 6.x에서 미니포트는 시작 및 일시 중지 의미 체계를 처리해야 합니다. NetAdapterCx 모델에서는 더 이상 그렇지 않습니다.
  • EVT_RXQUEUE_ADVANCE 콜백은 NDIS 6.x의 MINIPORT_RETURN_NET_BUFFER_LISTS 비슷합니다.
  • EVT_TXQUEUE_ADVANCE 콜백은 NDIS 6.x의 MINIPORT_SEND_NET_BUFFER_LISTS 비슷합니다.

디바이스 제거

WDF NIC 드라이버에 대한 디바이스 제거는 네트워킹 특정 처리가 필요하지 않은 다른 WDF 디바이스 드라이버와 동일합니다. 네트워크 데이터 경로가 먼저 종료된 후 WDF 디바이스가 종료됩니다. WDF 종료에 대한 자세한 내용은 사용자가 디바이스를 분리하는 것을 참조 하세요.

MiniportHaltEx 처리기는 EVT_WDF_DEVICE_D0_EXIT EVT_WDF_DEVICE_RELEASE_HARDWARE 간에 분산될 수 있습니다.

WDF 클라이언트는 NetAdapter 또는 만든 데이터 경로 큐를 삭제할 필요가 없습니다. WDF는 이러한 개체를 자동으로 삭제합니다.

MiniportShutdownEx, MiniportResetExMiniportCheckForHangEx를 삭제할 수 있습니다. 이러한 콜백은 더 이상 지원되지 않습니다.

NDIS-WDF 함수 등가

대부분의 NdisXxx 함수는 WDF와 동등한 함수로 바꿀 수 있습니다. 일반적으로 NDIS.SYS.

해당하는 함수 목록은 NDIS-WDF 함수를 참조하세요.

디버깅

NetAdapterCx 클라이언트 드라이버 디버깅을 참조 하세요.

!ndiskd.netadapter 디버거 확장은 NDIS 6 드라이버에 대해 !ndiskd.miniport가 표시하는 것과 유사한 결과를 보여 줍니다.

결론

이 항목의 단계를 사용하면 디바이스를 시작하고 중지하는 작업 드라이버가 있어야 합니다.

참고: NetAdapterCx는 현재 iSCSI 부팅을 지원하지 않습니다.