비고
이 함수는 드라이버 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 |
참고하십시오
DRIVER_PROXY_ENDPOINT_INFORMATION