NetAdapterCx는 플랫폼 수준 디바이스 재설정(PLDR)을 통해 오작동하는 네트워크 디바이스를 재설정하고 복구하는 효과적인 방법을 제공합니다. 전체 Windows 시스템을 다시 부팅하지 않고 PLDR 작업은 영향을 받는 네트워크 디바이스 스택을 중단하여 하드웨어 및 드라이버가 빈 상태에서 다시 시작되도록 합니다. 또한 NetAdapterCx를 사용하면 클라이언트 드라이버가 플랫폼 수준 재설정 전에 실패한 디바이스에서 진단을 수집할 수 있습니다.
비정상적인 디바이스 동작이 감지되면 PLDR이 트리거됩니다. 다음 중 하나를 통해 트리거할 수 있습니다.
운영 체제(OS)입니다. 예를 들어 전송 중인 패킷이 드라이버에 너무 오래 고정된 경우 OS 쪽에서 PLDR을 트리거할 수 있습니다.
IHV(독립 하드웨어 공급업체) 클라이언트 드라이버. 예를 들어 클라이언트 드라이버는 드라이버가 해당 디바이스가 제어 명령에 응답하지 않는 것을 감지할 때 NETAdapterCx에 PLDR을 트리거하도록 요청할 수 있습니다.
사용자에게 친숙한 디바이스 오류 및 복구를 제공하려면 IHV 및 OEM(원래 장비 제조업체)이 네트워크 디바이스에 대해 PLDR을 지원하는 것이 좋습니다. PLDR에 대한 자세한 내용은 디바이스 다시 설정 및 복구하는참조하세요. NetAdapterCx는 함수 수준 디바이스 재설정을 통해 네트워크 디바이스를 복구하지 않습니다.
선택적 진단 수집 콜백 등록
NetAdapterCx 재설정 및 복구 프로세스의 일부로 클라이언트 드라이버는 디바이스가 플랫폼 수준 재설정되기 전에 실패한 디바이스에서 디바이스별 진단을 수집할 수 있습니다. IHV와 Microsoft는 오류 후 분석에서 이 데이터를 사용하여 제품의 품질을 향상시킬 수 있습니다.
NET_DEVICE_RESET_CAPABILITIES 등록하다
클라이언트 드라이버는 디바이스별 진단을 수집하기 위해 EVT_WDF_DRIVER_DEVICE_ADD 콜백 함수에서 NET_DEVICE_RESET_CAPABILITIES 구조를 초기화하고 등록해야 합니다.
NET_DEVICE_RESET_CAPABILITIES는 다음 내용을 포함합니다.
고유한 GUID입니다. IHV는 GUID를 지정한 후, 이를 사용하여 나중에 메모리 덤프에서 초기화 진단을 식별하고 검색합니다. 예를 들어 .enumtag 명령을 사용하여 진단을 검색할 수 있습니다.
EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS 이벤트를 위한 콜백 함수입니다. NetAdapterCx는 이 콜백을 호출하여 진단을 수집합니다. 클라이언트 드라이버가 EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS 콜백을 제공하는 경우 NetAdapterCx는 전용 스레드를 사용하여 클라이언트 드라이버에서 호출합니다.
다음 예제에서는 NetAdapterCx에 NET_DEVICE_RESET_CAPABILITIES 등록하는 방법을 보여줍니다.
EVT_WDF_DRIVER_DEVICE_ADD EvtWdfDriverDeviceAdd;
EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS EvtDeviceCollectResetDiagnostics;
NTSTATUS EvtWdfDriverDeviceAdd(
WDFDRIVER Driver,
PWDFDEVICE_INIT DeviceInit
)
{
...
NET_DEVICE_RESET_CAPABILITIES resetCapabilities;
NET_DEVICE_RESET_CAPABILITIES_INIT(
&resetCapabilities,
DUMMY_GUID,
EvtDeviceCollectResetDiagnostics);
NetDeviceInitSetResetCapabilities(DeviceInit, &resetCapabilities);
...
}
NET_DEVICE_RESET_CAPABILITIES 구조를 초기화하는 방법에 대한 자세한 내용은 NET_DEVICE_RESET_CAPABILITIES_INIT참조하세요.
NetAdapterCx에 NET_DEVICE_RESET_CAPABILITIES 구조를 광고하는 방법을 배우려면 NetDeviceInitSetResetCapabilities를 참조하십시오.
EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS을 구현합니다.
재설정 및 복구 순서는 언제든지 발생할 수 있습니다. 따라서 클라이언트 드라이버의 EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS 콜백 구현은 다음을 고려해야 합니다.
NetAdapterCx는 EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS 콜백을 전원 다운 시퀀스동안 발생할 수 있는 다른 콜백들과 동기화합니다. 클라이언트 드라이버는 NetAdapterCx가 EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS 반환될 때까지 패킷 큐 취소/중지, 하드웨어 릴리스 및 디바이스 개체 삭제와 같은 콜백을 호출하지 않는다고 가정할 수 있습니다.
교착 상태를 방지하려면 클라이언트 드라이버에서 진단 컬렉션을 처리할 때 주의해야 합니다. 하드웨어가 이미 실패한 상태일 수 있다는 점을 고려해야 합니다.
PLDR 프로세스의 나머지 부분을 진행할 수 있도록 EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS는 가능한 한 빨리 완료하는 것이 중요합니다. EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS 신뢰할 수 있어야 하며 3초 이내에 반환해야 합니다.
NetAdapterCx는 항상 PASSIVE_LEVEL에서 EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS을 호출합니다.
NetAdapterCx에 진단을 제출하기 위해 클라이언트 드라이버는 다음 단계를 수행합니다.
페이징된 풀 또는 페이징되지 않은 풀에서 재설정 진단 정보를 수집하기 위해 평면 버퍼를 미리 할당합니다. 디바이스를 다시 설정하는 동안 메모리 부족 오류를 방지하려면 드라이버가 이 버퍼를 미리 할당해야 합니다.
EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS 콜백 내에서 NetDeviceStoreResetDiagnostics API를 호출하여 진단을 플랫 데이터 버퍼로 제출합니다. 클라이언트 드라이버는 PASSIVE_LEVEL NetDeviceStoreResetDiagnostics API를 호출해야 합니다.
NetDeviceStoreResetDiagnostics 반환되면 데이터 버퍼를 해제합니다.
중요하다
NetDeviceStoreResetDiagnostics API는 EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS 콜백에서만 호출되어야 합니다. 또한 이전 NetDeviceStoreResetDiagnostics 반환된 후에 진단 데이터를 다시 제출하는 데 사용할 수 없습니다. 이러한 경우 중 하나를 위반하면 버그 검사가 발생합니다.
중요하다
다시 설정 진단의 크기 제한은 1MB입니다.
클라이언트 드라이버가 PLDR을 요청하는 방법
클라이언트 드라이버는 디바이스 오류를 감지할 때 NetAdapterCx NetDeviceRequestReset API를 사용하여 PLDR을 트리거합니다. NetDeviceRequestReset 클라이언트 드라이버에 즉시 반환됩니다. NetAdapterCx 재설정 및 복구 시퀀스에서 설명된 재설정 및 복구 순서가 트리거되며, 이는 NetDeviceRequestReset 호출과 비동기적입니다.
지정된 시간에 하나의 PLDR 작업만 발생할 수 있습니다. 따라서 PLDR 작업이 이미 시작된 경우, NetDeviceRequestReset의 후속 호출은 어떤 영향도 주지 않습니다.
전원 다운 시퀀스 이미 시작된 경우에도 NetDeviceRequestReset 호출해도 효과가 없습니다.
NetAdapterCx 초기화 및 복구 절차
OS 또는 클라이언트 드라이버가 PLDR을 트리거하는 경우 다음 시퀀스가 발생합니다.
재설정 진단 수집: NetAdapterCx는 클라이언트 드라이버의 EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS 콜백을 호출하여 실패한 디바이스에서 진단을 수집합니다. 예를 들어 드라이버는 디바이스 펌웨어의 스냅샷을 수집할 수 있습니다. 이 단계는 선택 사항이며 클라이언트 드라이버가 NET_DEVICE_RESET_CAPABILITIES 구조를 등록한 경우에만 발생합니다. 그렇지 않으면 NetAdapterCx는 이 단계를 건너뜁니다.
PLDR 수행: NetAdapterCx는 플랫폼 수준 디바이스 재설정 작업을 수행합니다. NetAdapterCx는 하드웨어를 재시작하고 소프트웨어 디바이스 스택을 해체합니다.
다음 다이어그램에서는 NetAdapterCx 재설정 및 복구 시퀀스를 보여 줍니다.
NetAdapterCx 재설정 및 복구 시퀀스를 보여 주는