다음을 통해 공유


IoRegisterDriverProxyEndpoints 함수(wdm.h)

비고

이 함수는 드라이버 Hot-Swap V1에만 사용됩니다. 새 드라이버는 컴파일러 기반 엔드포인트 열거형을 통해 자동으로 엔드포인트 등록을 처리하는 드라이버 Hot-Swap V2를 사용해야 합니다.

IoRegisterDriverProxyEndpoints 함수는 엔드포인트 함수를 DriverProxy 확장에 등록하여 드라이버 Hot-Swap V1 구현에서 핫스왑 가능한 드라이버 기능을 사용하도록 설정합니다.

Syntax

NTSTATUS IoRegisterDriverProxyEndpoints(
  PDRIVER_PROXY_EXTENSION            DriverProxyExtension,
  PDRIVER_PROXY_ENDPOINT_INFORMATION EndpointInfo,
  ULONG                              Count,
  PDRIVER_PROXY_REGISTER_CALLBACK    PhasedCallback,
  PVOID                              Context
);

매개 변수

DriverProxyExtension

[in] 엔드포인트가 등록될 DriverProxy 확장에 대한 포인터입니다. 이 확장은 IoCreateDriverProxyExtension을 사용하여 만들어졌어야 합니다.

EndpointInfo

[in, out] 등록할 엔드포인트 함수를 설명하는 DRIVER_PROXY_ENDPOINT_INFORMATION 구조체의 배열입니다. 함수는 등록하는 동안 이 배열의 내용을 수정할 수 있습니다.

Count

[in] EndpointInfo 배열의 요소 수입니다.

PhasedCallback

[in, optional] 드라이버별 작업을 허용하기 위해 등록 프로세스 중에 다양한 단계에서 호출되는 DRIVER_PROXY_REGISTER_CALLBACK 함수에 대한 선택적 포인터입니다.

Context

[in, optional] PhasedCallback 함수에 전달될 선택적 컨텍스트 포인터입니다.

반환 값

IoRegisterDriverProxyEndpoints는 다음 NTSTATUS 값 중 하나를 반환합니다.

반환 코드 Description
STATUS_SUCCESS 엔드포인트가 성공적으로 등록되었습니다.
STATUS_INSUFFICIENT_RESOURCES 메모리가 부족하여 엔드포인트를 등록할 수 없습니다.
STATUS_INVALID_PARAMETER_3 하나 이상의 엔드포인트 정보 구조가 다른 매개 변수 수로 기존 함수를 덮어쓰려고 했습니다.
STATUS_UNSUCCESSFUL 기존 함수 호출이 완료될 때까지 기다리는 동안 작업 시간이 초과되었습니다.

비고

이 함수는 원래 드라이버 함수와 핫스왑 가능 래퍼 간의 매핑을 설정합니다. 등록되면 드라이버 프로시 시스템을 통해 원래 함수에 대한 호출이 리디렉션되므로 드라이버를 언로드하지 않고 런타임에 함수를 바꿀 수 있습니다.

이 함수는 복잡한 다단계 작업을 수행하여 기존 호출이 진행 중인 동안 함수 포인터를 안전하게 대체합니다. 등록 프로세스에는 다음이 포함됩니다.

  • 전처리 단계: 드라이버 준비를 허용하기 위해 DriverProxyRegisterCallbackPreProcess를 사용하여 선택적 PhasedCallback이 호출됩니다.

  • 런다운 획득: 함수는 계속하기 전에 등록된 엔드포인트에 대한 모든 기존 호출이 완료될 때까지 기다립니다.

  • 프록시 중단 단계: 모든 호출이 차단되는 동안 DriverProxyRegisterCallbackProxyStalled를 사용하여 PhasedCallback이 호출됩니다.

  • 함수 대체: 실제 함수 포인터는 원자성으로 업데이트됩니다.

  • 후처리 단계: DriverProxyRegisterCallbackPostProcess를 사용하여 PhasedCallback을 호출하여 드라이버 정리를 허용합니다.

엔드포인트의 ID가 기존 등록된 엔드포인트와 동일한 경우 엔드포인트는 동일한 매개 변수 개수가 있는 경우에만 대체됩니다.

이 함수는 드라이버 Hot-Swap V1: 초기 엔드포인트 등록( PhasedCallback 이 NULL이어야 하는 경우) 및 핫 스왑 작업 중 엔드포인트 교환에서 이중 용도로 사용됩니다.

기존 함수 호출이 완료될 때까지 기다려야 할 수 있으므로 PASSIVE_LEVEL 함수를 호출해야 합니다.

요구 사항

요구 사항 가치
대상 플랫폼 보편적
Header wdm.h
Library NtosKrnl.lib
IRQL PASSIVE_LEVEL

참고하십시오

IoCreateDriverProxyExtension

DRIVER_PROXY_ENDPOINT_INFORMATION

DRIVER_PROXY_REGISTER_CALLBACK

IoGetDriverProxyWrapperFromEndpoint