IWDFIoQueue::RetrieveNextRequest 메서드(wudfddi.h)
[경고: UMDF 2는 UMDF의 최신 버전이며 UMDF 1을 대체합니다. 모든 새 UMDF 드라이버는 UMDF 2를 사용하여 작성해야 합니다. UMDF 1에는 새로운 기능이 추가되지 않으며 최신 버전의 Windows 10에서는 UMDF 1에 대한 지원이 제한되어 있습니다. 유니버설 Windows 드라이버는 UMDF 2를 사용해야 합니다. 자세한 내용은 UMDF시작 .]을 참조하세요.
RetrieveNextRequest 메서드는 I/O 큐에서 다음 I/O 요청을 검색합니다.
통사론
HRESULT RetrieveNextRequest(
[out] IWDFIoRequest **ppRequest
);
매개 변수
[out] ppRequest
다음 요청 개체에 대한 IWDFIoRequest 인터페이스에 대한 포인터를 수신하거나 큐가 비어 있거나 다음 요청을 찾을 수 없는 경우 NULL 수신하는 버퍼에 대한 포인터입니다.
반환 값
RetrieveNextRequest 다음 값 중 하나를 반환합니다.
반환 코드 | 묘사 |
---|---|
|
다음 I/O 요청이 I/O 큐에서 성공적으로 검색되었습니다. |
|
큐가 요청을 디스패치하지 않습니다. 이 상황은 디바이스가 전원 상태 전환을 겪고 모든 큐가 요청 디스패치에서 중지되거나 드라이버가 명시적으로 IWDFIoQueue::Stop 호출하여 요청 디스패치를 중지하는 경우에 발생합니다. 이 상황은 드라이버가 전원이 관리되고 전원이 켜진 수동 큐에서 요청을 제거하려고 시도하거나 큐가 일시 중지된 경우에도 발생할 수 있습니다. |
|
큐에 요청이 없습니다. |
|
병렬 큐에서 요청을 검색하기 위해 호출되었습니다. |
RetrieveNextRequest 다른 HRESULT 값도 반환할 수 있습니다.
발언
드라이버가 I/O 요청을 수동으로 디스패치하도록 I/O 큐를 구성하는 경우 드라이버는 RetrieveNextRequest 메서드를 호출하여 큐에서 다음 요청을 가져올 수 있습니다. I/O 요청을 수동으로 디스패치하는 방법에 대한 자세한 내용은 I/O 큐 대한 디스패치 모드 구성참조하세요.
드라이버가 I/O 요청을 순차적으로 디스패치하도록 I/O 큐를 구성하는 경우 드라이버는 여전히 RetrieveNextRequest 메서드를 호출하여 오류를 수신하지 않고 큐에서 다음 요청을 가져올 수 있습니다. 프레임워크는 드라이버가 순차 큐에서 요청을 검색하기 위해 RetrieveNextRequest 호출하도록 허용하지만 드라이버가 현재 요청을 완료하기 전에 RetrieveNextRequest 호출해야 합니다. 그렇지 않은 경우 드라이버가 현재 요청을 완료한 후 RetrieveNextRequest 호출하려고 하면 경합 상태가 발생할 수 있습니다. 이 경합 상태는 순차 큐에서 다음 요청을 자동으로 디스패치하는 프레임워크와 다음 요청을 검색하기 위해 RetrieveNextRequest 대한 드라이버 호출 사이에 발생합니다.
예제
umdf_fx2 샘플 드라이버의 다음 코드 예제는 요청을 검색할 수 있는 한 큐에서 요청을 폴링합니다. 코드는 먼저 요청이 특정 파일 개체와 연결되어 있는지 확인합니다.
VOID
CMyDevice::ServiceSwitchChangeQueue(
__in SWITCH_STATE NewState,
__in HRESULT CompletionStatus,
__in_opt IWDFFile *SpecificFile
)
{
IWDFIoRequest *fxRequest;
HRESULT enumHr = S_OK;
do {
HRESULT hr;
//
// Get the next request.
//
if (NULL != SpecificFile) {
enumHr = m_SwitchChangeQueue->RetrieveNextRequestByFileObject(
SpecificFile,
&fxRequest
);
}
else {
enumHr = m_SwitchChangeQueue->RetrieveNextRequest(&fxRequest);
}
//
// If a request was retrieved, complete it.
//
if (S_OK == enumHr) {
if (S_OK == CompletionStatus) {
IWDFMemory *fxMemory;
//
// Copy the result to the request buffer.
//
fxRequest->GetOutputMemory(&fxMemory);
hr = fxMemory->CopyFromBuffer(0,
&NewState,
sizeof(SWITCH_STATE));
fxMemory->Release();
}
else {
hr = CompletionStatus;
}
//
// Complete the request with the copy or
// completion status.
//
if (S_OK == hr) {
fxRequest->CompleteWithInformation(hr,
sizeof(SWITCH_STATE));
}
else {
fxRequest->Complete(hr);
}
fxRequest->Release();
}
}
while (S_OK == enumHr);
}
요구 사항
요구 | 값 |
---|---|
지원 종료 | UMDF 2.0 이상에서는 사용할 수 없습니다. |
대상 플랫폼 | 바탕 화면 |
최소 UMDF 버전 | 1.5 |
헤더 | wudfddi.h(Wudfddi.h 포함) |
DLL | WUDFx.dll |