프로토콜 드라이버에서 PnP 이벤트 및 전원 관리 이벤트 처리

운영 체제에서 NIC(네트워크 인터페이스 카드)를 나타내는 대상 디바이스 개체에 PnP(플러그 앤 플레이) I/O 요청 패킷 또는 전원 관리 IRP를 발급하면 NDIS는 IRP를 가로채는 것입니다. NDIS는 드라이버의 ProtocolNetPnPEvent 함수를 호출하여 각 바인딩된 프로토콜 드라이버 및 각 바인딩된 중간 드라이버에 대한 이벤트를 나타냅니다. ProtocolNetPnPEvent 호출에서 NDIS는 NET_PNP_EVENT 구조를 포함하는 NET_PNP_EVENT_NOTIFICATION 대한 포인터를 전달합니다. NET_PNP_EVENT 구조는 표시되는 PnP 이벤트 또는 전원 관리 이벤트를 설명합니다. 프로토콜 드라이버 PnP 인터페이스에 대한 자세한 내용은 프로토콜 드라이버에서 PnP 이벤트 알림 처리를 참조하세요.

다음 목록에는 NET_PNP_EVENT 구조의 NetEvent 코드에 표시된 대로 PnP 및 전원 관리 이벤트가 포함되어 있습니다.

  • NetEventSetPower

    미니포트 어댑터가 특정 전원 상태로 전환되도록 지정하는 전원 설정 요청을 나타냅니다. 전원 관리 인식 프로토콜 드라이버는 항상 NDIS_STATUS_SUCCESS 반환하여 이 이벤트를 성공시켜야 합니다. 이전 프로토콜 드라이버는 NDIS_STATUS_NOT_SUPPORTED 반환하여 NDIS가 미니포트 어댑터에서 바인딩을 해제해야 함을 나타낼 수 있습니다.

    전원 설정 요청을 실행한 후 미니포트 어댑터가 저전력 상태로 전환되는 경우 NDIS는 드라이버 스택을 일시 중지합니다. 미니포트 어댑터가 D0(작업 상태)로 전환되는 경우 NDIS는 전원 설정 요청 전에 드라이버 스택을 다시 시작합니다. 드라이버 스택 일시 중지 및 다시 시작에 대한 자세한 내용은 드라이버 스택 일시 중지를 참조하세요.

    미니포트 어댑터가 저전력 상태인 경우 프로토콜 드라이버는 OID 요청을 실행할 수 없습니다. 이 요구 사항은 드라이버 스택이 일시 중지됨 상태일 때 적용되는 다른 제한 사항에 추가되는 추가 전원 관리 제한 사항입니다.

    기본 미니포트 어댑터가 전원 관리를 인식하지 못하는 경우 미니포트 드라이버는 NDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTESPowerManagementCapabilities 멤버를 NULL로 설정하고 NDIS는 NDIS_BIND_PARAMETERSPowerManagementCapabilities 멤버를 NULL로 설정합니다.

    참고 NDIS 6.30부터 이 이벤트에 대한 알림을 받은 후 프로토콜 드라이버는 새 I/O 요청 생성을 중지해야 하며 ProtocolNetPnPEvent 호출 컨텍스트 내에서 보류 중인 I/O 요청이 완료될 때까지 기다리지 않아야 합니다.

    전원 설정 이벤트에 대한 자세한 내용은 중간 드라이버에서 PnP 이벤트 및 전원 관리 이벤트 처리를 참조하세요.

  • NetEventQueryPower

    기본 미니포트 어댑터가 특정 전원 상태로 전환할 수 있는지 여부를 쿼리하는 쿼리 전원 요청을 나타냅니다. 프로토콜 드라이버는 항상 NetEventQueryPower 에 성공해야 합니다. 활성 연결을 설정한 후 프로토콜 드라이버는 PoRegisterSystemState를 호출하여 연속 사용 중 상태를 등록할 수 있습니다. 상태 등록이 적용되는 한 전원 관리자는 시스템을 절전 모드로 설정하지 않습니다. 연결이 비활성 상태가 되면 프로토콜 드라이버는 PoUnregisterSystemState를 호출하여 상태 등록을 취소합니다. 프로토콜 드라이버는 NetEventQueryRemoveDevice에 실패하여 시스템이 절전 상태로 전환되는 것을 방지해서는 안 됩니다. NetEventQueryPower 뒤에는 항상 NetEventSetPower가 잇습니다. 디바이스의 현재 전원 상태를 실제로 설정하는 NetEventSetPowerNetEventQueryPower를 취소합니다.

    참고 NDIS 6.30부터 이 이벤트에 대한 알림을 받은 후 프로토콜 드라이버는 ProtocolNetPnPEvent 호출 컨텍스트 내에서 보류 중인 I/O 요청이 완료될 때까지 기다리지 않아야 합니다.

  • NetEventQueryRemoveDevice

    작업을 중단하지 않고 NIC를 제거할 수 있는지 여부를 쿼리하는 쿼리 디바이스 제거 요청을 나타냅니다. 프로토콜 드라이버가 디바이스를 해제할 수 없는 경우(예: 디바이스가 사용 중이기 때문에) NDIS_STATUS_FAILURE 반환하여 NetEventQueryRemoveDevice 에 실패해야 합니다.

  • NetEventCancelRemoveDevice

    기본 NIC의 제거를 취소하는 디바이스 제거 취소 요청을 나타냅니다. 프로토콜 드라이버는 항상 NDIS_STATUS_SUCCESS 반환하여 이 이벤트를 성공시켜야 합니다.

  • NetEventReconfigure

    네트워크 구성 요소에 대한 구성이 변경되었음을 나타냅니다. 예를 들어 사용자가 TCP/IP의 IP 주소를 변경하는 경우 NDIS는 NetEventReconfigure 코드를 사용하여 이 이벤트를 TCP/IP 프로토콜로 나타냅니다. 프로토콜 드라이버는 드물게 표시된 구성 변경 내용을 적용할 수 없고 사용 가능한 기본값이 없는 경우 오류 코드를 반환할 수 있습니다. 실패한 메모리 할당 시도는 프로토콜이 오류 코드를 반환하는 경우의 예입니다. 오류 코드를 반환하면 사용자에게 시스템을 다시 시작하라는 메시지가 표시 될 수 있습니다.

    프로토콜은 ProtocolNetPnPEvent 함수에 전달된 NetEventReconfigure 관련 데이터의 유효성을 검사해야 합니다. 이러한 데이터에 대한 자세한 내용은 프로토콜 드라이버에 대한 NET_PNP_EVENT 참조하세요.

  • NetEventBindList

    프로토콜 드라이버에 바인딩 목록 처리 순서가 다시 구성되었음을 나타냅니다. 이 목록은 처리할 때 프로토콜의 바인딩에 적용할 상대 순서(예: 여러 바인딩 중 하나로 라우팅될 수 있는 사용자 요청)를 나타냅니다. 이 이벤트와 함께 전달된 버퍼에는 NULL로 종료된 유니코드 문자열로 형식이 지정된 디바이스 이름 목록이 포함됩니다. 각 디바이스 이름의 형식은 ProtocolBindAdapterEx 호출에 전달되는 DeviceName 매개 변수와 동일합니다.

    프로토콜은 ProtocolNetPnPEvent 함수에 전달된 NetEventBindList 관련 데이터의 유효성을 검사해야 합니다. 이러한 데이터에 대한 자세한 내용은 프로토콜 드라이버에 대한 NET_PNP_EVENT 참조하세요.

    프로토콜은 ProtocolNetPnPEvent 함수에 전달된 NetEventBindList 관련 데이터의 유효성을 검사해야 합니다. 이러한 데이터에 대한 자세한 내용은 프로토콜 드라이버에 대한 NET_PNP_EVENT 참조하세요.

  • NetEventBindsComplete

    프로토콜 드라이버가 바인딩할 수 있는 모든 NIC에 바인딩되었음을 나타냅니다. 예를 들어 PnP NIC가 시스템에 연결되지 않는 한 NDIS는 프로토콜 드라이버에 대한 더 이상 바인딩을 나타내지 않습니다.

  • NetEventPnPCapabilities

    사용자가 기본 어댑터의 절전 모드 해제 기능을 사용하거나 사용하지 않도록 설정했음을 나타냅니다. (NDIS가 ProtocolNetPnPEvent에 전달하는 ProtocolBindingContext 매개 변수는 바인딩을 지정합니다.)

  • NetEventPause

    지정된 프로토콜 바인딩이 일시 중지 상태로 들어가야 했음을 나타냅니다. 바인딩은 NDIS가 바인딩에 대한 미해결 송신 요청을 모두 완료한 후 일시 중지됨 상태로 들어갑니다. 바인딩 일시 중지에 대한 자세한 내용은 바인딩 일시 중지를 참조하세요.

  • NetEventRestart

    지정된 프로토콜 바인딩이 다시 시작 상태로 들어갔다는 것을 나타냅니다. 프로토콜 드라이버가 바인딩에 대한 보내기 및 받기 작업을 다시 시작할 준비가 되면 바인딩이 실행 중 상태가 됩니다. 바인딩을 다시 시작하는 방법에 대한 자세한 내용은 바인딩 다시 시작을 참조하세요.

  • NetEventPortActivation

    지정된 바인딩과 연결된 포트 목록의 활성화를 나타냅니다. 바인딩 일시 중지에 대한 자세한 내용은 포트 활성화 PnP 이벤트 처리를 참조하세요.

  • NetEventPortDeactivation

    지정된 바인딩과 연결된 포트 목록의 비활성화를 나타냅니다. 바인딩 일시 중지에 대한 자세한 내용은 포트 비활성화 PnP 이벤트 처리를 참조하세요.

  • NetEventIMReEnableDevice

    NDIS 6.0 이상 중간 드라이버의 가상 미니포트에 대한 구성이 변경되었음을 나타냅니다. NetEventIMReEnableDevice 는 중간 드라이버가 단일 가상 미니포트에 대해 이 이벤트를 수신하고 NetEventReconfigure 이벤트가 모든 중간 드라이버의 가상 미니포트에 적용된다는 점을 제외하고 NetEventReconfigure 이벤트와 유사합니다. 예를 들어 중간 드라이버는 사용자가 사용하지 않도록 설정한 다음 장치 관리자 또는 다른 원본에서 단일 가상 미니포트를 사용하도록 설정할 때 NetEventIMReEnableDevice 이벤트를 받습니다. 중간 드라이버 전원 관리의 예는 GitHub의 Windows 드라이버 샘플 리포지토리에서 사용할 수 있는 NDIS MUX 중간 드라이버 및 알림 개체 드라이버 샘플을 참조하세요.

NET_PNP_EVENT 구조체의 Buffer 멤버는 표시되는 이벤트와 관련된 정보를 포함하는 버퍼를 가리킵니다.

프로토콜 드라이버는 NdisCompleteNetPnPEvent를 사용하여 ProtocolNetPnPEvent에 대한 호출을 비동기적으로 완료할 수 있습니다.