다음을 통해 공유


IWDFIoRequest2::RetrieveOutputBuffer 메서드(wudfddi.h)

[경고: UMDF 2는 UMDF의 최신 버전이며 UMDF 1을 대체합니다. 모든 새 UMDF 드라이버는 UMDF 2를 사용하여 작성해야 합니다. UMDF 1에 새 기능이 추가되지 않으며 최신 버전의 Windows 10 UMDF 1에 대한 지원이 제한됩니다. 유니버설 Windows 드라이버는 UMDF 2를 사용해야 합니다. 자세한 내용은 UMDF를 사용하여 시작 참조하세요.]

RequestRetrieveOutputBuffer 메서드는 I/O 요청의 출력 버퍼를 검색합니다.

구문

HRESULT RetrieveOutputBuffer(
  [in]            SIZE_T MinimumRequiredCb,
  [out]           PVOID  *Buffer,
  [out, optional] SIZE_T *BufferCb
);

매개 변수

[in] MinimumRequiredCb

드라이버가 I/O 요청을 처리하는 데 필요한 최소 버퍼 크기(바이트)입니다. 최소 버퍼 크기가 없는 경우 이 값은 0일 수 있습니다.

[out] Buffer

버퍼의 주소를 받는 위치에 대한 포인터입니다.

[out, optional] BufferCb

버퍼의 크기를 받는 위치에 대한 포인터(바이트)입니다. 이 매개 변수는 선택 사항이며 NULL일 수 있습니다.

반환 값

RequestRetrieveOutputBuffer는 작업이 성공하면 S_OK 반환합니다. 그렇지 않으면 이 메서드는 다음 값을 반환할 수 있습니다.

반환 코드 설명
HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER)
I/O 요청이 출력 버퍼를 제공하지 않았거나 출력 버퍼의 크기가 MinimumRequiredCb 가 지정한 최소 크기보다 작습니다.
E_OUTOFMEMORY
메모리가 부족하여 버퍼를 검색할 수 없습니다. 드라이버는 오류 상태 값으로 요청을 완료해야 합니다.
 

이 메서드는 Winerror.h에 포함된 다른 값 중 하나를 반환할 수 있습니다.

설명

요청의 출력 버퍼는 드라이버가 요청의 발신자에게 제공하는 디스크의 데이터와 같은 정보를 받습니다. 드라이버는 RequestRetrieveOutputBuffer 를 호출하여 읽기 요청 또는 디바이스 I/O 컨트롤 요청에 대한 출력 버퍼를 가져올 수 있지만 쓰기 요청은 출력 데이터를 제공하지 않기 때문에 쓰기 요청에 대해서는 가져올 수 없습니다.

RequestRetrieveOutputBuffer 메서드는 버퍼링된 I/O 또는 직접 I/O 메서드를 사용하여 데이터 버퍼에 액세스하는 I/O 요청에 대한 출력 버퍼를 검색합니다.

RequestRetrieveOutputBuffer가 S_OK 반환하는 경우 드라이버는 주소와 선택적으로 출력 버퍼의 크기를 받습니다.

드라이버는 I/O 요청을 완료할 때까지 검색된 버퍼에 액세스할 수 있습니다 .

드라이버는 RequestRetrieveOutputBuffer를 호출하는 대신 버퍼를 나타내는 프레임워크 메모리 개체를 만드는 IWDFIoRequest2::RetrieveOutputMemory를 호출할 수 있습니다.

I/O 요청의 데이터 버퍼에 액세스하는 방법에 대한 자세한 내용은 UMDF-Based 드라이버에서 데이터 버퍼 액세스를 참조하세요.

예제

다음 코드 예제에서는 직렬 포트 드라이버의 IQueueCallbackDeviceIoControl::OnDeviceIoControl 콜백 함수의 세그먼트를 보여줍니다. 코드 세그먼트는 I/O 요청의 출력 버퍼를 가져온 다음 디바이스에서 버퍼로 전송된 속도 정보를 전송합니다.

VOID
STDMETHODCALLTYPE
  CMyQueue::OnDeviceIoControl(
    __in IWDFIoQueue *pWdfQueue,
    __in IWDFIoRequest *pWdfRequest,
    __in ULONG ControlCode,
    __in SIZE_T InputBufferSizeInBytes,
    __in SIZE_T OutputBufferSizeInBytes
    )
{
    HRESULT hr;
    //
    // Declare an IWDFIoRequest2 interface pointer and obtain the
    // IWDFIoRequest2 interface from the IWDFIoRequest interface.
    //
    CComQIPtr<IWDFIoRequest2> r2 = pWdfRequest;

    switch (ControlCode)
    {
        case IOCTL_SERIAL_GET_BAUD_RATE:
        {
            SERIAL_BAUD_RATE *pBaudRateBuffer;
            hr = pWdfRequest2->RetrieveOutputBuffer(sizeof(SERIAL_BAUD_RATE),
                                                    (PVOID*) &pBaudRateBuffer,
                                                    NULL);
            if (SUCCEEDED(hr))
                  {
                      RtlZeroMemory(pBaudRateBuffer, sizeof(SERIAL_BAUD_RATE));
                      pBaudRateBuffer->BaudRate = m_Device->GetBaudRate();
                      reqCompletionInfo = sizeof(SERIAL_BAUD_RATE);
                  }
            
        }
        break;
        ...
    }
    ...
}

요구 사항

요구 사항
지원 종료 UMDF 2.0 이상에서는 사용할 수 없습니다.
대상 플랫폼 데스크톱
최소 UMDF 버전 1.9
머리글 wudfddi.h(Wudfddi.h 포함)
DLL WUDFx.dll

추가 정보

IWDFIoRequest2

IWDFIoRequest2::RetrieveInputBuffer

IWDFIoRequest2::RetrieveInputMemory

IWDFIoRequest2::RetrieveOutputMemory

IWDFIoRequest::GetInputMemory

IWDFIoRequest::GetOutputMemory