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