Share via


NdisRegisterProtocol 함수(ndis.h)

참고 NDIS 5. x 는 더 이상 사용되지 않으며 NDIS 6으로 대체됩니다. x. 새로운 NDIS 드라이버 개발은 Windows Vista로 시작하는 네트워크 드라이버를 참조하세요. NDIS 5 포팅에 대한 자세한 내용입니다. x 드라이버를 NDIS 6으로. x, NDIS 5.x 드라이버를 NDIS 6.0으로 포팅을 참조하세요.

NdisRegisterProtocol 은 드라이버가 초기화되면 NDIS 드라이버의 ProtocolXxx 진입점 및 이름을 NDIS 라이브러리에 등록합니다.

구문

void NdisRegisterProtocol(
  [out] PNDIS_STATUS                   Status,
  [out] PNDIS_HANDLE                   NdisProtocolHandle,
  [in]  PNDIS_PROTOCOL_CHARACTERISTICS ProtocolCharacteristics,
  [in]  UINT                           CharacteristicsLength
);

매개 변수

[out] Status

이 함수의 반환 시 다음 값 중 하나일 수 있는 호출자 제공 변수에 대한 포인터입니다.

  • NDIS_STATUS_SUCCESS
    NDIS 라이브러리는 호출자를 프로토콜 드라이버로 등록했습니다.

  • NDIS_STATUS_BAD_CHARACTERISTICS
    CharacteristicsLengthProtocolCharacteristics의 버퍼에 지정된 MajorNdisVersion에 비해 너무 작습니다.

  • NDIS_STATUS_BAD_VERSION
    ProtocolCharacteristics의 버퍼에 지정된 MajorNdisVersion이 잘못되었습니다.

  • NDIS_STATUS_RESOURCES
    메모리가 부족하여 NDIS 라이브러리가 호출자를 등록하지 못했습니다.

[out] NdisProtocolHandle

이 함수가 등록된 드라이버를 나타내는 핸들을 반환하는 호출자 제공 변수에 대한 포인터입니다.

[in] ProtocolCharacteristics

호출자가 설정한 NDIS_PROTOCOL_CHARACTERISTICS 구조체에 대한 포인터입니다. ProtocolCharacteristics의 구조체는 다음과 같이 정의됩니다.

        typedef struct _NDIS_PROTOCOL_CHARACTERISTICS {
            UCHAR MajorNdisVersion;
            UCHAR MinorNdisVersion;
            UINT Reserved;
            OPEN_ADAPTER_COMPLETE_HANDLER OpenAdapterCompleteHandler;
            CLOSE_ADAPTER_COMPLETE_HANDLER CloseAdapterCompleteHandler;
            SEND_COMPLETE_HANDLER SendCompleteHandler;
            TRANSFER_DATA_COMPLETE_HANDLER TransferDataCompleteHandler;
            RESET_COMPLETE_HANDLER ResetCompleteHandler;
            REQUEST_COMPLETE_HANDLER RequestCompleteHandler;
            RECEIVE_HANDLER ReceiveHandler;
            RECEIVE_COMPLETE_HANDLER ReceiveCompleteHandler;
            STATUS_HANDLER StatusHandler;
            STATUS_COMPLETE_HANDLER StatusCompleteHandler;
            NDIS_STRING Name;
        //
        // MajorNdisVersion must be set to 0x04 or 0x05
        // with any of the following members.
        //
            RECEIVE_PACKET_HANDLER ReceivePacketHandler;
            BIND_HANDLER BindAdapterHandler;
            UNBIND_HANDLER UnbindAdapterHandler;
            PNP_EVENT_HANDLER PnPEventHandler;
            UNLOAD_PROTOCOL_HANDLER UnloadHandler;
        //
        // MajorNdisVersion must be set to 0x05 
        // with any of the following members.
        //
            CO_SEND_COMPLETE_HANDLER CoSendCompleteHandler;
            CO_STATUS_HANDLER CoStatusHandler;
            CO_RECEIVE_PACKET_HANDLER CoReceivePacketHandler;
            CO_AF_REGISTER_NOTIFY_HANDLER CoAfRegisterNotifyHandler;
        } NDIS_PROTOCOL_CHARACTERISTICS, *PNDIS_PROTOCOL_CHARACTERISTICS;

드라이버는 다음 멤버를 설정하기 전에 이 구조를 0으로 초기화해야 합니다.

  • MajorNdisVersion
    드라이버에서 사용 중인 NDIS 라이브러리의 주 버전을 지정합니다. NDIS 라이브러리는 NDIS V4.0용으로 개발된 기존 드라이버를 계속 지원하지만 현재 값은 0x05. NDIS는 더 이상 V3.0 프로토콜을 지원하지 않습니다.

  • MinorNdisVersion
    부 NDIS 버전을 지정합니다. 현재 값이 0x00.

  • Reserved
    이 멤버는 시스템 사용을 위해 예약되어 있습니다.

  • OpenAdapterCompleteHandler
    호출자의 ProtocolOpenAdapterComplete 함수의 진입점을 지정합니다.

  • CloseAdapterCompleteHandler
    호출자의 ProtocolCloseAdapterComplete 함수의 진입점을 지정합니다.

  • SendCompleteHandler
    호출자의 ProtocolSendComplete 함수(있는 경우)의 진입점을 지정합니다.

  • TransferDataCompleteHandler
    호출자의 ProtocolTransferDataComplete 함수(있는 경우)의 진입점을 지정합니다.

  • ResetCompleteHandler
    호출자의 ProtocolResetComplete 함수의 진입점을 지정합니다.

  • RequestCompleteHandler
    호출자의 ProtocolRequestComplete 함수의 진입점을 지정합니다.

  • ReceiveHandler
    호출자의 ProtocolReceive 함수(있는 경우)의 진입점을 지정합니다.

  • ReceiveCompleteHandler
    호출자 ProtocolReceiveComplete 함수의 진입점을 지정합니다.

  • StatusHandler
    호출자의 ProtocolStatus 함수(있는 경우)의 진입점을 지정합니다.

  • StatusCompleteHandler
    호출자의 ProtocolStatusComplete 함수의 진입점을 지정합니다.

  • 이름
    호출자가 초기화한 계산 문자열을 포함하는 NDIS_STRING 형식으로, 시스템 기본 문자 집합에서 드라이버의 이름을 지정합니다. Windows 2000 이상 드라이버의 경우 이 문자열에는 유니코드 문자가 포함됩니다. 즉, Windows 2000 이상에서 NDIS는 NDIS_STRING 형식을 UNICODE_STRING 형식으로 정의합니다. 이 문자열은 프로토콜이 설치되었을 때 레지스트리( 서비스 아래)에 지정된 문자열과 일치해야 합니다.

    NdisRegisterProtocol 은 제공된 문자열을 대문자로 변환하므로 프로토콜 드라이버 작성기는 이미 등록된 프로토콜 이름의 대/소문자를 변경하면 드라이버의 고유한 이름이 생성된다고 가정할 수 없습니다.

  • ReceivePacketHandler
    호출자의 ProtocolReceivePacket 함수(있는 경우) 또는 NULL의 진입점을 지정합니다. 멀티패켓 수신 표시를 지원하는 NIC 드라이버에 바인딩하는 프로토콜은 성능을 향상시키기 위해 ProtocolReceivePacket 함수를 제공해야 합니다. 그러나 연결 지향 미니포트에 단독으로 바인딩하는 프로토콜은 이 멤버를 NULL로 설정할 수도 있습니다.

  • BindAdapterHandler
    호출자의 ProtocolBindAdapter 함수의 진입점을 지정합니다. MajorNdisVersion 멤버의 값을 0x05 또는 0x04 설정하는 호출자는 ProtocolBindAdapter 함수 및 지원 플러그 앤 플레이 제공해야 합니다. 또한 NDIS 중간 드라이버는 ProtocolBindAdapter 함수를 제공해야 합니다. 이를 통해 중간 드라이버는 NdisIMRegisterLayeredMiniport 를 호출하고 기본 NIC 드라이버가 초기화될 때까지 전체 드라이버 초기화를 연기할 수 있습니다.

  • UnbindAdapterHandler
    호출자의 ProtocolUnbindAdapter 함수의 진입점을 지정합니다. ProtocolBindAdapter 함수를 제공하는 NDIS 드라이버도 ProtocolUnbindAdapter 함수를 제공해야 합니다.

  • PnPEventHandler
    호출자의 ProtocolPnPEvent 함수(있는 경우)의 진입점을 지정합니다.

  • UnloadHandler
    호출자의 ProtocolUnbind 함수(있는 경우) 또는 NULL의 진입점을 지정합니다.

  • CoSendCompleteHandler
    연결 지향 클라이언트 또는 호출 관리자가 제공해야 하는 호출자 ProtocolCoSendComplete 함수의 진입점을 지정합니다. 연결 지향 클라이언트는 연결 없는 미니포트에도 자신을 바인딩하는 경우 ProtocolSendComplete 함수를 제공합니다.

  • CoStatusHandlerCoStatusHandler
    연결 지향 클라이언트 또는 호출 관리자가 제공해야 하는 호출자 ProtocolCoStatus 함수의 진입점을 지정합니다. 연결 지향 클라이언트는 연결 없는 미니포트에도 자신을 바인딩하는 경우 ProtocolStatus 함수를 제공합니다.

  • CoReceivePacketHandler
    연결 지향 클라이언트 또는 호출 관리자가 제공해야 하는 호출자 ProtocolCoReceivePacket 함수의 진입점을 지정합니다. 연결 지향 클라이언트는 연결 없는 미니포트에도 자신을 바인딩하는 경우 ProtocolReceivePacket 함수 및/또는 ProtocolReceiveProtocolTransferDataComplete 함수를 제공합니다.

  • CoAfRegisterNotifyHandler
    연결 지향 클라이언트가 제공해야 하는 호출자 ProtocolAfRegisterNotify 함수의 진입점을 지정합니다.

[in] CharacteristicsLength

ProtocolCharacteristics에서 구조체의 크기(바이트)를 지정합니다. 빌드 지시문 -DNDIS50=1 또는 -DNDIS40=1이 #includeNdis.h보다 먼저 원본 파일에 지정되면 sizeof(NDIS_PROTOCOL_CHARACTERISTICS)가 자동으로 적절한 값으로 설정됩니다. 두 지시문을 지정하지 않으면 NDIS는 V3.0 특성 구조가 사용되고 있다고 가정합니다.

특성 구조의 MajorNdisVersionMinorNdisVersion 멤버에 설정된 값은 빌드 지시문과 일치해야 합니다. 그렇지 않으면 각각 0x03 및 0x00 합니다.

반환 값

없음

설명

프로토콜 드라이버는 0x05(현재 버전) 또는 0x04 MajorNdisVersion 을 지정해야 합니다. NDIS는 더 이상 V.30 프로토콜을 지원하지 않으므로 0x03 MajorNdisVersion 을 지정하는 프로토콜을 로드하지 않습니다.

모든 프로토콜은 플러그 앤 플레이(PnP)를 사용할 수 있어야 합니다. 따라서 프로토콜은 BindAdapterHandlerUnbindAdapterHandler에 대한 진입점을 지정해야 합니다. NDIS는 이러한 처리기에 대해 NULL 을 지정하는 프로토콜을 로드하지 않습니다.

최상의 성능을 위해 멀티패켓 수신을 지원하는 연결 없는 NIC 드라이버 위에 계층화되는 모든 프로토콜은 ProtocolReceivePacket 함수를 제공해야 합니다. 이러한 프로토콜 드라이버도 ProtocolReceive 함수를 제공해야 합니다. 멀티패켓 보내기를 지원하는 연결 없는 NIC 드라이버도 멀티패켓 수신을 나타낼 수 있습니다.

클라이언트 또는 호출 관리자에 관계없이 모든 연결 지향 프로토콜은 ProtocolCoReceivePacket 함수를 등록해야 합니다. 또한 연결 없는 NIC 드라이버에 자신을 바인딩하는 클라이언트 프로토콜 은 ProtocolReceivePacketProtocolReceive 함수도 제공합니다. 연결 지향 프로토콜은 클라이언트에 대해 NdisClOpenAddressFamily를 호출하거나 ProtocolBindAdapter 함수의 호출 관리자에 대해 NdisCmRegisterAddressFamily를 호출하여 NDIS에 추가 연결 지향 진입점을 등록해야 합니다.

NdisRegisterProtocol을 성공적으로 호출한 후에는 드라이버가 제공한 ProtocolXxx 함수 집합을 변경할 수 없습니다.

성공적으로 등록된 드라이버는 NdisProtocolHandle에 반환된 핸들을 저장해야 합니다. 드라이버가 이후에 호출하는 다른 NdisXxx 함수에 대한 필수 매개 변수입니다.

NdisRegisterProtocol을 성공적으로 호출한 후 PnP 인식 또는 연결 지향 프로토콜의 DriverEntry 함수는 제어를 반환합니다. 이러한 드라이버의 ProtocolBindAdapter 함수는 이후에 기본 NIC에 대한 바인딩을 설정하기 위해 한 번 이상 호출되기 때문입니다. 그렇지 않으면 프로토콜 드라이버가 NdisOpenAdapter 를 호출하여 기본 NIC 드라이버에 대한 바인딩을 설정하거나 NDIS MiniportXxx 함수 집합을 등록한 NDIS 드라이버 위에 자신을 계층화할 수 있습니다.

  • 대상 플랫폼: 유니버설
  • 버전: Windows Vista의 NDIS 6.0 드라이버에는 지원되지 않습니다. 대신 NdisRegisterProtocolDriver를 사용합니다. Windows Vista 및 Windows XP에서 NDIS 5.1 드라이버에 대해 지원됩니다.

요구 사항

요구 사항
헤더 ndis.h(Ndis.h 포함)
라이브러리 Ndis.lib
IRQL PASSIVE_LEVEL

추가 정보