다음을 통해 공유


프로토콜 드라이버 초기화

시스템은 드라이버를 로드한 후 프로토콜 드라이버의 DriverEntry 루틴을 호출합니다. 프로토콜 드라이버는 시스템 서비스로 로드됩니다. 미니포트 드라이버가 로드되기 전, 도중 또는 후에 언제든지 로드할 수 있습니다.

프로토콜 드라이버는 드라이버 리소스를 할당하고 DriverEntry에서 ProtocolXxx 함수를 등록합니다. 여기에는 CoNDIS 클라이언트 및 독립 실행형 통화 관리자가 포함됩니다. ProtocolXxx 함수를 NDIS에 등록하기 위해 프로토콜 드라이버는 NdisRegisterProtocolDriver 함수를 호출합니다.

드라이버가 NDIS 프로토콜 드라이버로 성공적으로 등록된 경우 DriverEntry는 STATUS_SUCCESS 또는 해당 NDIS_STATUS_SUCCESS 반환합니다. NdisXxx 함수 또는 커널 모드 지원 루틴에서 반환된 오류 상태 전파하여 DriverEntry가 초기화에 실패하면 드라이버가 로드되지 않습니다. DriverEntry 는 동기적으로 실행되어야 합니다. 즉, STATUS_PENDING 또는 해당 NDIS_STATUS_PENDING 반환할 수 없습니다.

NDIS 프로토콜 드라이버의 DriverEntry 함수는 NdisRegisterProtocolDriver 함수를 호출해야 합니다. 드라이버의 ProtocolXxx 진입점을 NDIS 라이브러리에 등록하기 위해 프로토콜 드라이버는 NDIS_PROTOCOL_DRIVER_CHARACTERISTICS 구조를 초기화하고 NdisRegisterProtocolDriver에 전달합니다.

NdisRegisterProtocolDriver를 호출하는 드라이버는 ProtocolXxx 함수에 대한 즉각적인 호출을 준비해야 합니다.

NDIS 프로토콜 드라이버는 레거시 드라이버가 제공하는 함수의 업데이트된 버전인 다음 ProtocolXxx 함수를 제공합니다.

ProtocolSetOptions

ProtocolBindAdapterEx

ProtocolUnbindAdapterEx

ProtocolOpenAdapterCompleteEx

ProtocolCloseAdapterCompleteEx

ProtocolNetPnPEvent

ProtocolUninstall

NDIS 프로토콜 드라이버는 송신 및 수신 작업을 위해 다음 ProtocolXxx 함수를 제공합니다.

ProtocolReceiveNetBufferLists

ProtocolSendNetBufferListsComplete

모든 유형의 NDIS 프로토콜 드라이버는 완전한 기능의 ProtocolBindAdapterExProtocolUnbindAdapterEx 함수를 등록하여 플러그 앤 플레이(PnP)를 지원해야 합니다. 일반적으로 DriverEntry 함수는 상태 값이 STATUS_SUCCESS 또는 NDIS_STATUS_SUCCESS 있는 컨트롤을 반환하기 직전에 NdisRegisterProtocolDriver를 호출해야 합니다.

NDIS 정의 ProtocolXxx 함수 외에도 표준 커널 모드 드라이버 루틴 집합을 내보내는 모든 프로토콜 드라이버는 DriverEntry 함수에 전달되는 지정된 드라이버 개체에서 해당 드라이버 루틴에 대한 진입점을 설정해야 합니다. 이러한 프로토콜 드라이버의 DriverEntry 함수 기능에 대한 자세한 내용은 DriverEntry 루틴 작성을 참조하세요.

드라이버가 네트워크 I/O 작업을 수행해야 하는 리소스를 할당하려는 시도가 실패하면 DriverEntry는 STATUS_SUCCESS 또는 NDIS_STATUS_SUCCESS 이외의 상태 컨트롤을 반환하기 전에 이미 할당한 모든 리소스를 해제해야 합니다.

NdisRegisterProtocolDriver를 성공적으로 호출한 후 오류가 발생하면 드라이버가 DriverEntry가 반환되기 전에 NdisDeregisterProtocolDriver 함수를 호출해야 합니다.

프로토콜 드라이버가 선택적 서비스를 구성할 수 있도록 NDIS는 프로토콜 드라이버가 NdisRegisterProtocolDriver를 호출한 컨텍스트 내에서 ProtocolSetOptions 함수를 호출합니다. 선택적 서비스에 대한 자세한 내용은 선택적 프로토콜 드라이버 서비스 구성을 참조하세요.

CoNDIS 클라이언트 드라이버는 ProtocolSetOptions 함수에서 NdisSetOptionalHandlers 함수를 호출해야 합니다. 드라이버는 NDIS_CO_CLIENT_OPTIONAL_HANDLERS 구조를 초기화하고 NdisSetOptionalHandlersOptionalHandlers 매개 변수에 전달합니다.

또한 CoNDIS 독립 실행형 호출 관리자는 ProtocolSetOptions 함수에서 NdisSetOptionalHandlers 함수를 호출해야 합니다. 드라이버는 NDIS_CO_CALL_MANAGER_OPTIONAL_HANDLERS 구조를 초기화하고 NdisSetOptionalHandlersOptionalHandlers 매개 변수에 전달합니다.

MCM은 프로토콜 드라이버가 아닙니다. 따라서 MiniportSetOptions 함수에서 NdisSetOptionalHandlers 함수를 호출해야 합니다. MCM은 NDIS_CO_CALL_MANAGER_OPTIONAL_HANDLERS 구조를 초기화하고 NdisSetOptionalHandlersOptionalHandlers 매개 변수에 전달합니다.

NDIS를 사용하여 등록을 취소하기 위해 프로토콜 드라이버는 언로드 루틴에서 NdisDeregisterProtocolDriver를 호출합니다.

프로토콜 드라이버를 제거하기 전에 정리 작업을 수행하기 위해 프로토콜 드라이버는 ProtocolUninstall 함수를 등록할 수 있습니다. ProtocolUninstall 함수는 선택 사항입니다. 예를 들어 중간 드라이버의 프로토콜 아래쪽 가장자리에는 ProtocolUninstall 함수가 필요할 수 있습니다. 중간 드라이버는 NDIS가 MiniportDriverUnload 함수를 호출하기 전에 ProtocolUninstall에서 프로토콜 에지 리소스를 해제할 수 있습니다.