NDIS 중간 드라이버는 DriverEntry 루틴의 컨텍스트에서 MiniportXxx 함수 및 ProtocolXxx 함수를 등록합니다. MiniportXxx 함수를 등록하려면 중간 드라이버가 NDIS_INTERMEDIATE_DRIVER 플래그 집합을 사용하여 NdisMRegisterMiniportDriver 함수를 호출해야 합니다. 드라이버가 MiniportDriverCharacteristics에 전달하는 NDIS_MINIPORT_DRIVER_CHARACTERISTICS 구조 내에 이 플래그가 있습니다. ProtocolXxx 함수를 등록하려면 중간 드라이버가 NdisRegisterProtocolDriver 함수를 호출해야 합니다.
DriverEntry 드라이버가 NDIS 중간 드라이버로 성공적으로 등록된 경우 STATUS_SUCCESS 또는 해당 NDIS_STATUS_SUCCESS 반환합니다. driverEntry가 NdisXxx 함수 또는 커널 모드 지원 루틴에 의해 반환된 오류 상태를 전파하여 초기화에 실패하는 경우 드라이버는 로드된 상태로 유지되지 않습니다. DriverEntry 동기적으로 실행해야 합니다. 즉, STATUS_PENDING 또는 해당 NDIS_STATUS_PENDING 반환할 수 없습니다.
중간 드라이버를 NDIS에 등록하려면 DriverEntry 루틴은 최소한 다음을 수행해야 합니다.
- NDIS_INTERMEDIATE_DRIVER 플래그가 설정된 NdisMRegisterMiniportDriver 함수를 호출하여 드라이버의 MiniportXxx 함수를 등록합니다.
- 드라이버가 이후에 기본 NDIS 드라이버에 자신을 바인딩하는 경우 NdisRegisterProtocolDriver 함수를 호출하여 드라이버의 ProtocolXxx 함수를 등록합니다.
- NdisIMAssociateMiniport 함수를 호출하여 드라이버의 미니포트 위쪽 가장자리와 프로토콜 아래쪽 가장자리 간의 연결에 대해 NDIS에 알릴 수 있습니다.
DriverEntry가 성공적으로 NdisMRegisterMiniportDriver를 반환한 후 오류가 발생하는 경우, 드라이버는 DriverEntry가 반환되기 전에 NdisMDeregisterMiniportDriver 함수를 호출해야 합니다. DriverEntry 성공하면 드라이버는 MiniportDriverUnload 함수에서 NdisMDeregisterMiniportDriver 호출해야 합니다.
중간 드라이버는 프로토콜 드라이버 및 미니포트 드라이버의 DriverEntry 요구 사항의 대부분을 공유합니다.
중간 드라이버의 가상 미니포트 초기화는 드라이버가 ProtocolBindAdapterEx 함수에서 NdisIMInitializeDeviceInstanceEx 함수를 호출할 때 발생합니다.
NDIS는 모든 기본 미니포트 드라이버가 초기화된 후 ProtocolBindAdapterEx 함수를 호출합니다.
실제로 NDIS 중간 드라이버의 DriverEntry 함수는 NdisMRegisterMiniportDriver전달한 후 RegistryPath 포인터를 무시할 수 있습니다. 이러한 드라이버는 DriverObject 포인터를 NdisMRegisterMiniportDriver에 전달한 후 무시할 수도 있습니다. 그러나 드라이버는 NdisMRegisterMiniportDriver에서 반환되는 미니포트 드라이버 핸들 값과 NdisRegisterProtocolDriver에서 반환되는 프로토콜 핸들 값을 NdisMiniportDriverHandle 및 NdisProtocolHandle에 저장해야 하며, 이는 후속 NdisXxx 함수 호출에 사용됩니다. 중간 드라이버의 ProtocolBindAdapterEx 함수는 중간 드라이버의 가상 미니포트를 초기화하기 위해 MiniportInitializeEx 함수를 호출하기 전에 드라이버를 각 기본 미니포트 드라이버에 바인딩합니다. 더 높은 수준의 프로토콜 드라이버는 이후에 만든 가상 미니포트에 자신을 바인딩합니다. 이 전략을 사용하면 NDIS 중간 드라이버가 바인딩된 기본 미니포트 드라이버의 기능에 따라 가상 미니포트를 만들 때 리소스를 할당할 수 있습니다.