전원 요청 설정 처리
중간 드라이버는 전원을 작업 상태(D0의 네트워크 디바이스 전원 상태) 및 절전 상태(D1, D2 또는 D3의 네트워크 디바이스 전원 상태)로 설정하는 요청을 처리해야 합니다. 또한 중간 드라이버는 전원 상태 변수와 대기 플래그를 기본 합니다. 이러한 문제는 이 항목에서 자세히 설명합니다.
중간 드라이버 전원 관리의 예제는 GitHub의 Windows 드라이버 샘플 리포지토리에서 NDIS MUX 중간 드라이버 및 알림 개체 드라이버 샘플을 참조하세요.
절전 모드 상태로 전원 요청 설정 처리
중간 드라이버가 절전 상태로 설정된 전원 요청을 처리해야 하는 두 가지 경우가 있습니다.
NDIS는 중간 드라이버의 가상 미니포트 위쪽 가장자리를 절전 모드 상태로 이동하도록 요청합니다.
중간 드라이버 프로토콜 아래쪽 가장자리는 PnP(플러그 앤 플레이) 이벤트 알림을 받을 때 기본 미니포트 드라이버 전환을 절전 상태로 처리합니다.
이러한 이벤트는 순서에 따라 발생할 수 있으며 한 이벤트가 반드시 다른 이벤트와 함께 제공되는 것은 아닙니다.
중간 드라이버의 가상 미니포트 위쪽 가장자리가 절전 모드 상태로 전원을 설정하라는 요청을 받으면 요청을 처리하기 위한 이벤트 시퀀스는 다음과 같습니다.
NDIS는 가상 미니포트에 바인딩된 각 프로토콜 드라이버의 ProtocolNetPnPEvent 함수를 호출합니다. ProtocolNetPnPEvent에 대한 호출은 절전 상태에 대한 NetEventSetPower 이벤트를 지정합니다. 중간 드라이버에 바인딩된 프로토콜 드라이버는 네트워크 데이터를 보내고 중간 드라이버 가상 미니포트에 OID 요청을 만드는 것을 중지합니다. 중간 드라이버의 프로토콜 아래쪽 가장자리는 NDIS가 기본 미니포트 드라이버가 절전 모드로 전환 중임을 표시할 때까지 네트워크 데이터 및 요청을 계속 보낼 수 있습니다.
NDIS는 NetEventSetPower 이벤트를 실행한 후 오버리싱된 드라이버와 가상 미니포트를 일시 중지합니다. 일시 중지의 지정된 이유는 저전력 상태로 전환하기 때문입니다. 가상 미니포트 일시 중지에 대한 자세한 내용은 어댑터 일시 중지를 참조 하세요.
참고: OID_PNP_SET_POWER 제외하고 저전력 상태인 동안에는 가상 미니포트로 OID 요청을 보낼 수 없습니다.
NDIS는 중간 드라이버의 가상 미니포트에 OID_PNP_SET_POWER 요청을 실행합니다. 중간 드라이버는 NDIS_STATUS_SUCCESS 반환하여 요청을 수락합니다. 중간 드라이버는 기본 미니포트 드라이버에 OID_PNP_SET_POWER 요청을 전파하지 않아야 합니다. 중간 드라이버가 이 요청을 완료한 후에는 기본 미니포트 드라이버에서 네트워크 데이터 및 상태 표시를 계속 수신하더라도 수신된 네트워크 데이터를 더 이상 나타내거나 상태 나타내서는 안 됩니다.
중간 드라이버의 프로토콜 아래쪽 가장자리가 기본 미니포트 드라이버를 절전 상태로 전환하면 전환을 처리하기 위한 이벤트 시퀀스는 다음과 같습니다.
NDIS는 중간 드라이버 프로토콜 하위 에지의 ProtocolNetPnPEvent 함수를 호출합니다. ProtocolNetPnPEvent에 대한 호출은 절전 상태에 대한 NetEventSetPower 이벤트를 지정합니다. 중간 드라이버는 네트워크 데이터 전송을 중지하고 기본 미니포트 드라이버에 OID 요청을 해야 합니다. 미해결 요청 또는 송신이 있는 경우 중간 드라이버는 ProtocolNetPnPEvent 호출에서 NDIS_STATUS_PENDING 반환해야 합니다. 중간 드라이버는 NdisCompleteNetPnPEvent를 호출하여 ProtocolNetPnPEvent에 대한 호출을 완료합니다. 중간 드라이버의 프로토콜 에지는 기본 미니포트 드라이버에서 수신된 패킷 및 상태 표시를 계속 받을 수 있습니다. 수신된 네트워크 데이터는 무시할 수 있습니다. 중간 드라이버의 구현이 기본 미니포트 드라이버의 상태 모니터링에 따라 달라지는 경우 상태 표시를 계속 모니터링해야 합니다.
NDIS는 중간 드라이버의 프로토콜 가장자리를 일시 중지한 다음 NetEventSetPower 이벤트를 실행한 후 기본 미니포트 어댑터를 일시 중지합니다. 일시 중지의 지정된 이유는 저전력 상태로 전환하기 때문입니다. 프로토콜 바인딩 일시 중지에 대한 자세한 내용은 바인딩 일시 중지를 참조 하세요.
참고 OID 요청은 OID_PNP_SET_POWER 제외하고 저전력 상태인 동안 기본 미니포트 어댑터로 보낼 수 없습니다.
NDIS는 기본 미니포트 드라이버에 OID_PNP_SET_POWER 요청을 실행합니다. 그러나 기본 미니포트 드라이버가 전원 관리를 지원하지 않으면 중단됩니다. 이 경우 NDIS는 기본 미니포트 드라이버를 중지하더라도 기본 미니포트 드라이버 및 NIC에서 바인딩을 해제하도록 중간 드라이버 프로토콜을 요청하지 않습니다. 기본 미니포트 드라이버가 OID 처리를 성공적으로 완료했거나 미니포트 드라이버가 중지된 후에는 더 이상 네트워크 데이터 또는 상태 나타내지 않습니다.
작업 상태로 전원 요청 설정 처리
중간 드라이버가 작업 상태로 설정된 전원 요청을 처리하는 두 가지 경우가 있습니다.
NDIS는 중간 드라이버의 가상 미니포트 위쪽 가장자리를 작업 상태로 이동하도록 요청합니다.
중간 드라이버 프로토콜 하위 에지는 PnP(플러그 앤 플레이) 이벤트 알림을 받으면 기본 미니포트 드라이버 전환을 작업 상태로 처리합니다.
이러한 이벤트는 순서에 따라 발생할 수 있으며 한 이벤트가 반드시 다른 이벤트와 함께 제공되는 것은 아닙니다.
중간 드라이버의 가상 미니포트 위쪽 가장자리가 전원을 작업 상태로 설정하라는 요청을 받으면 요청을 처리하기 위한 이벤트 시퀀스는 다음과 같습니다.
NDIS는 중간 드라이버의 가상 미니포트에 OID_PNP_SET_POWER 발급합니다. 중간 드라이버는 설정된 전원 요청에 NDIS_STATUS_SUCCESS 반환합니다. 중간 드라이버는 기본 미니포트 드라이버에 OID_PNP_SET_POWER 요청을 전파하지 않아야 합니다.
NDIS는 가상 미니포트를 다시 시작한 다음, 설정된 전원 OID를 실행한 후 오버리싱 드라이버를 다시 시작합니다. 가상 미니포트를 다시 시작하는 방법에 대한 자세한 내용은 어댑터 시작을 참조 하세요.
NDIS는 지나치게 많은 프로토콜 드라이버의 ProtocolNetPnPEvent 함수를 호출합니다. ProtocolNetPnPEvent에 대한 호출은 작업 상태(D0)를 설정하는 NetEventSetPower 이벤트를 지정 합니다. 바인딩된 프로토콜 드라이버는 중간 드라이버의 가상 미니포트로 네트워크 데이터 전송을 시작할 수 있습니다.
중간 드라이버의 프로토콜 아래쪽 가장자리가 기본 미니포트 드라이버를 작업 상태로 전환하는 경우 전환을 처리하기 위한 이벤트 시퀀스는 다음과 같습니다.
기본 미니포트 드라이버가 중지된 경우 NDIS는 기본 미니포트 드라이버에 OID_PNP_SET_POWER 발급하거나 MiniportInitializeEx 처리기를 호출합니다.
NDIS는 OID를 실행한 후 기본 미니포트 드라이버와 중간 NDIS의 프로토콜 가장자리 및 기본 미니포트 어댑터를 다시 시작합니다. 프로토콜 바인딩을 일시 중지하는 방법에 대한 자세한 내용은 바인딩 다시 시작을 참조하세요.
NDIS는 중간 드라이버의 ProtocolNetPnPEvent 함수를 호출합니다. ProtocolNetPnPEvent에 대한 호출은 작업 상태(D0)를 설정하는 NetEventSetPower 이벤트를 지정 합니다. 중간 드라이버는 기본 미니포트 드라이버로 네트워크 데이터 전송을 시작할 수 있습니다.
전원 상태 및 대기 플래그
중간 드라이버는 각 가상 미니포트 인스턴스 및 드라이버가 바인딩된 각 기본 미니포트 드라이버에 대해 별도의 전원 상태 변수를 기본 합니다. 또한 중간 드라이버는 다음과 같은 각 가상 미니포트에 대한 StandingBy 플래그를 기본 합니다.
가상 미니포트 또는 기본 미니포트 드라이버의 전원 상태가 D0을 벗어나면 TRUE로 설정합니다.
가상 미니포트 또는 기본 미니포트 드라이버의 전원 상태가 D0으로 반환되면 FALSE로 설정합니다.
참고 MUX 중간 드라이버의 경우 기본 미니포트 드라이버와 연결된 여러 가상 미니포트 또는 각 가상 미니포트와 연결된 여러 기본 미니포트가 있을 수 있습니다. 미니포트 어댑터의 전원 상태가 변경되면 연결된 모든 미니포트의 동작도 영향을 받습니다. 동작이 영향을 받는 방식은 구현에 따라 다릅니다. 예를 들어 LBFO(부하 분산 장애 조치(Failover) 솔루션을 구현하는 드라이버는 기본 미니포트 드라이버가 하나만 비활성화될 때 가상 미니포트를 비활성화하지 않을 수 있습니다. 그러나 모든 기본 미니포트 드라이버에 의존하는 드라이버 구현에서는 기본 미니포트 드라이버가 비활성화될 때 가상 미니포트를 비활성화해야 합니다.
중간 드라이버는 다음과 같이 요청을 처리할 때 StandingBy 플래그 및 전원 상태 변수를 사용해야 합니다.
가상 미니포트와 기본 미니포트 어댑터가 모두 D0에 있지 않으면 드라이버의 MiniportSendNetBufferLists 함수가 실패해야 합니다.
드라이버의 MiniportOidRequest 함수는 항상 OID_PNP_QUERY_POWER 성공하여 드라이버가 후속 OID_PNP_SET_POWER 요청을 받도록 해야 합니다.
가상 미니포트가 D0에 없거나 StandingBy가 TRUE이면 드라이버의 MiniportOidRequest 함수가 실패해야 합니다. 그렇지 않으면 기본 미니포트 드라이버가 D0에 없는 경우 단일 요청을 큐에 대기해야 합니다. 대기 중인 요청은 기본 미니포트 드라이버 상태가 D0이 될 때 처리되어야 합니다.
중간 드라이버 가상 미니포트는 기본 미니포트 드라이버와 가상 미니포트가 모두 D0에 있는 경우에만 상태 보고해야 합니다.