I/O 요청 다시 큐에 추가
드라이버는 I/O 큐에서 가져온 I/O 요청을 다시 큐에 추가할 수 있습니다. 드라이버는 드라이버가 동일한 디바이스에 대해 만든 다른 I/O 큐에 I/O 요청을 다시 큐에 추가할 수 있습니다. 또한 버스 드라이버는 자식 디바이스의 I/O 큐에서 부모 디바이스의 I/O 큐로 I/O 요청을 다시 큐에 추가할 수 있습니다.
디바이스에 대한 다른 I/O 큐에 I/O 요청 다시 큐
드라이버의 요청 처리기가 드라이버의 I/O 큐에서 I/O 요청을 받은 후 드라이버는 WdfRequestForwardToIoQueue 를 호출하여 요청을 다른 큐에 다시 큐에 추가할 수 있습니다.
예를 들어 드라이버가 요청을 처리하기 전에 요청에 리소스를 할당하도록 하려는 경우 드라이버의 EvtIoDefault 콜백 함수는 모든 요청을 수신하고, 각 요청의 컨텍스트 메모리에 리소스 정보를 저장한 다음, WdfRequestForwardToIoQueue 를 호출하여 각 요청을 추가 큐에 다시 큐에 추가할 수 있습니다.
드라이버 가 WdfRequestForwardToIoQueue 를 호출하여 순차적 디스패치 메서드를 사용하는 I/O 큐에서 가져온 I/O 요청을 다시 큐에 넣은 경우 프레임워크는 다시 큐에 추가된 요청이 완료될 때까지 기다리지 않고 순차 큐에서 드라이버로 다음 I/O 요청을 전달합니다.
드라이버가 수동 디스패치 메서드를 사용하는 경우 WdfRequestRequeue 메서드를 호출하여 드라이버가 가져온 I/O 큐의 헤드에 I/O 요청을 반환할 수 있습니다. WdfRequestRequeue를 호출한 후 드라이버의 다음 WdfIoQueueRetrieveNextRequest 호출은 다시 큐에 넣은 요청을 검색합니다.
부모 디바이스의 I/O 큐에 I/O 요청 다시 큐
부모 디바이스의 함수 드라이버는 부모 디바이스의 자식 디바이스를 열거하고 자식 디바이스에 대한 PDO(물리적 디바이스 개체)를 만드는 버스 드라이버 역할을 할 수 있습니다. 이러한 드라이버는 부모 디바이스가 처리해야 하는 자식 디바이스에 대한 I/O 요청을 받을 수 있습니다.
예를 들어 프로토콜 버스(예: USB)는 일반적으로 연결된 각 디바이스에 할당된 하드웨어 리소스를 제어합니다. 따라서 부모 버스의 함수 드라이버는 일반적으로 각 자식 디바이스에 대한 I/O 작업을 처리합니다. I/O 관리자가 자식 디바이스 중 하나의 디바이스 스택 에 I/O 요청을 보내면 해당 드라이버가 자식 디바이스의 PDO를 만들었기 때문에 버스의 함수 드라이버는 자식 디바이스의 I/O 큐 중 하나에서 I/O 요청을 받습니다. 드라이버가 부모 버스 디바이스의 컨텍스트에서 I/O 요청을 처리하려면 먼저 자식 디바이스의 I/O 큐에서 부모 디바이스에 속한 I/O 큐로 I/O 요청을 다시 큐에 추가해야 합니다.
그러나 드라이버는 WdfRequestForwardToIoQueue 를 호출하여 자식 큐에서 부모의 큐로 요청을 이동할 수 없습니다. I/O 관리자는 부모 및 자식 디바이스에 대해 별도의 디바이스 스택을 만들기 때문에 먼저 기본 WDM 디바이스 개체를 자식 디바이스를 나타내는 개체에서 부모를 나타내는 디바이스로 변경해야 합니다.
KMDF 버전 1.9 이전에는 드라이버가 원격 I/O 대상을 만들고, 자식 디바이스의 디바이스 스택 크기를 늘리고, 올바른 WDM 디바이스 개체를 지정해야만 자식 디바이스에서 부모로 I/O 요청을 보낼 수 있습니다.
KMDF 버전 1.9부터 드라이버는 자식 디바이스를 만들기 전에 WdfPdoInitAllowForwardingRequestToParent 를 호출한 다음 WdfRequestForwardToParentDeviceIoQueue 를 호출하여 자식의 I/O 큐에서 부모 큐로 요청을 다시 큐에 추가할 수 있습니다. 드라이버가WdfPdoInitAllowForwardingRequestToParent 및 WdfRequestForwardToParentDeviceIoQueue를 사용하는 경우 프레임워크는 자식의 디바이스 스택 크기를 늘리고 올바른 WDM 디바이스 개체를 I/O 요청에 할당합니다.