일반 I/O 대상의 상태 제어
I/O 대상 개체를 두 개의 게이트인 인 게이트와 아웃 게이트를 갖는 것으로 시각화할 수 있습니다. Out-gate는 프레임워크가 대상 디바이스 개체에 요청을 전달하는 시기를 제어하고, 게이트 내는 요청이 I/O 대상에 전혀 들어갈 수 있는 경우를 제어합니다.
프레임워크는 일반 I/O 대상에 대해 다음 상태를 정의합니다.
시작
I/O 대상 개체의 두 게이트가 모두 열려 있습니다. 드라이버는 I/O 대상 큐에 I/O 요청을 보낼 수 있으며 프레임워크는 적절한 드라이버에 요청을 전달합니다.
중지
I/O 대상의 인-게이트가 열려 있지만 외부 게이트는 닫힙니다. 프레임워크는 적절한 드라이버에 대한 요청 배달을 중지합니다. I/O 요청을 I/O 대상으로 보내려면 드라이버는 각 요청의 WDF_REQUEST_SEND_OPTIONS 구조에서 WDF_REQUEST_SEND_OPTION_IGNORE_TARGET_STATE 또는 WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET 설정해야 합니다.
제거
I/O 대상 개체의 두 게이트가 모두 닫힙니다. 드라이버는 WDF_REQUEST_SEND_OPTION_IGNORE_TARGET_STATE 또는WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET 설정하지 않는 한 I/O 요청을 I/O 대상으로 보낼 수 없습니다. 또한 프레임워크는 I/O 대상 개체의 내부 큐에서 처리되지 않은 요청을 취소합니다. 이 상태는 KMDF 버전 1.11부터 사용할 수 있습니다.
쿼리 제거를 위해 닫힘
디바이스가 곧 제거될 수 있으므로 원격 I/O 대상이 일시적으로 닫힙니다.
폐쇄
I/O 대상이 닫혀 있으며 시작하거나 중지할 수 없습니다.
WDF_IO_TARGET_STATE 열거형은 이러한 상태를 나타내는 값을 정의합니다. 드라이버는 WdfIoTargetGetState 를 호출하여 I/O 대상의 상태를 가져올 수 있습니다.
로컬 I/O 대상 상태
프레임워크가 자동으로 열리고 로컬 I/O 대상이 시작됩니다.
필요한 경우 드라이버는 WdfIoTargetStop을 호출하여 로컬 I/O 대상을 일시적으로 중지하고 WdfIoTargetStart 를 호출하여 다시 시작할 수 있습니다. 예를 들어 드라이버가 임시 오류 조건을 감지하면 로컬 I/O 대상을 중지한 다음 오류 조건이 수정되면 I/O 대상을 다시 시작할 수 있습니다.
KMDF 버전 1.11 이상에서 드라이버는 WdfIoTargetPurge 를 호출하여 I/O 요청이 로컬 I/O 대상으로 전송되는 것을 일시적으로 방지하고 대상 큐에서 처리되지 않은 요청을 취소할 수 있습니다. 예를 들어 파일 핸들 정리의 일부로 드라이버가 로컬 I/O 대상을 제거하여 드라이버로 전송된 모든 요청이 취소되도록 할 수 있습니다.
로컬 I/O 대상의 디바이스가 제거되면 프레임워크는 자동으로 I/O 대상을 중지하고 닫고 대상 큐에 있는 모든 I/O 요청을 취소합니다 . 프레임워크는 디바이스 개체 이벤트 콜백 함수를 호출하여 디바이스를 더 이상 사용할 수 없음을 드라이버에 알깁니다. 이러한 콜백 함수에 대한 자세한 내용은 PnP 및 전원 관리 시나리오를 참조하세요.
원격 I/O 대상 상태
드라이버는 WdfIoTargetOpen을 호출하여 원격 I/O 대상을 열어야 합니다. 드라이버가 원격 I/O 대상을 열면 프레임워크가 자동으로 I/O 대상을 시작합니다.
필요한 경우 드라이버는 WdfIoTargetStop을 호출하여 원격 I/O 대상을 일시적으로 중지하고 WdfIoTargetStart 를 호출하여 다시 시작할 수 있습니다.
KMDF 버전 1.11 이상에서 드라이버는 WdfIoTargetPurge 를 호출하여 I/O 요청이 원격 I/O 대상으로 전송되는 것을 일시적으로 방지하고 대상 큐에서 처리되지 않은 요청을 취소할 수 있습니다.
원격 I/O 대상의 디바이스가 제거되면 프레임워크는 자동으로 I/O 대상을 중지하고 닫고, 드라이버가 다음 이벤트 콜백 함수를 등록하지 않는 한 대상 큐에 있는 모든 I/O 요청을 취소합니다.
EvtIoTargetQueryRemove
원격 I/O 대상의 디바이스가 제거될 수 있음을 드라이버에 알릴 수 있습니다. 드라이버가 디바이스 제거를 허용하려면 드라이버가 WdfIoTargetCloseForQueryRemove 를 호출해야 합니다.
EvtIoTargetRemoveComplete
원격 I/O 대상의 디바이스가 제거되었음을 드라이버에 알릴 수 있습니다. 이 콜백 함수는 WdfIoTargetClose를 호출해야 합니다.
EvtIoTargetRemoveCanceled
원격 I/O 대상의 디바이스를 제거하려는 시도가 취소되었음을 드라이버에 알릴 수 있습니다. 이 콜백 함수는 WdfIoTargetOpen을 호출해야 하며 드라이버는 일반적으로 WDF_IO_TARGET_OPEN_PARAMS_INIT_REOPEN 호출하여 WDF_IO_TARGET_OPEN_PARAMS_INIT 함수를 초기화합니다.
드라이버가 원격 I/O 대상 사용을 완료하고 대상을 다시 사용하지 않고 대상에 아직 보류 중인 자식 요청 개체가 없는 경우 드라이버는 먼저 WdfIoTargetClose를 호출하지 않고 WdfObjectDelete를 호출할 수 있습니다. 대상에 아직 보류 중인 자식 요청 개체가 있는 경우 드라이버는 WdfObjectDelete를 안전하게 호출하기 전에 WdfIoTargetClose를 호출해야 합니다.