WdfRequestCreateFromIrp 함수(wdfrequest.h)

[KMDF에만 적용]

WdfRequestCreateFromIrp 메서드는 지정된 WDM IRP에서 프레임워크 요청 개체를 만듭니다.

구문

NTSTATUS WdfRequestCreateFromIrp(
  [in, optional] PWDF_OBJECT_ATTRIBUTES RequestAttributes,
  [in]           PIRP                   Irp,
  [in]           BOOLEAN                RequestFreesIrp,
  [out]          WDFREQUEST             *Request
);

매개 변수

[in, optional] RequestAttributes

요청 개체의 개체 특성을 지정하는 호출자가 할당한 WDF_OBJECT_ATTRIBUTES 구조체에 대한 포인터입니다. 이 매개 변수는 선택 사항이며 WDF_NO_OBJECT_ATTRIBUTES 수 있습니다.

[in] Irp

WDM I/O 요청 패킷을 포함하는 IRP 구조체에 대한 포인터입니다.

[in] RequestFreesIrp

TRUE인 경우 요청 핸들이 제거되면 프레임워크가 IRP를 제거한다는 것을 나타내는 부울 값입니다. FALSE이면 드라이버는 다음 예제 섹션에서 보여 주는 단계를 사용하여 IRP를 제거하기 위해 IoFreeIrp을 호출해야 합니다.

[out] Request

프레임워크 요청 개체에 대한 핸들을 수신하는 위치에 대한 포인터입니다.

반환 값

WdfRequestCreateFromIrp 은 작업이 성공하면 STATUS_SUCCESS 반환합니다. 추가 반환 값 목록은 프레임워크 개체 만들기 오류를 참조하세요.

이 메서드는 다른 NTSTATUS 값을 반환할 수도 있습니다.

설명

일반적으로 프레임워크 기반 드라이버는 WDM 디스패치 루틴에서 WDM IRP를 받은 다음 프레임워크 I/O 대상에 요청을 전달하는 경우에만 WdfRequestCreateFromIrp 을 호출합니다.

드라이버가 WdfRequestCreateFromIrp 을 호출하여 요청 개체를 만드는 경우 요청 개체에 대해 WdfRequestComplete 를 호출해서는 안됩니다. 대신 드라이버가 요청 개체 사용을 마쳤을 때 WdfObjectDelete 를 호출해야 합니다.

또한 드라이버는 새 요청 개체를 사용하여 WdfRequestRetrieveOutputMemory, WdfRequestRetrieveOutputBuffer, WdfRequestRetrieveInputBuffer 또는 WdfRequestRetrieveInputMemory 를 호출해서는 안됩니다.

기본적으로 새 요청 개체의 부모는 WdfDriverCreate 메서드가 만든 프레임워크 드라이버 개체입니다. WDF_OBJECT_ATTRIBUTES 구조체의 ParentObject 멤버를 사용하여 다른 부모를 지정할 수 있습니다. 프레임워크는 부모 개체를 삭제할 때 요청 개체를 삭제합니다. 드라이버가 기본 부모를 변경하지 않으면 드라이버가 개체 사용을 마쳤을 때 요청 개체를 삭제해야 합니다. 그렇지 않으면 I/O 관리자가 드라이버를 언로드할 때까지 요청 개체가 유지됩니다.

프레임워크 요청 개체를 만드는 방법에 대한 자세한 내용은 프레임워크 요청 개체 만들기를 참조하세요.

프레임워크 기반 드라이버는 IRP 구조체의 Tail.Overlay.DriverContext 멤버를 사용하지 않아야 합니다. 프레임워크는 이 멤버를 사용하기 때문입니다.

예제

예 1

다음 코드 예제에서는 지정된 WDM IRP에서 프레임워크 요청 개체를 만든 다음 삭제합니다. 다음은 RequestFreesIrp 매개 변수를 TRUE로 설정하여 요청 핸들이 제거되면 프레임워크가 IRP를 제거하는 예제입니다.

WDFREQUEST request;
PIRP irp;

//Creation
status = WdfRequestCreateFromIrp(
                                 WDF_NO_OBJECT_ATTRIBUTES,
                                 irp,
                                 TRUE,
                                 &request
                                 );
...
//Deletion
WdfObjectDelete(request);

예제 2

다음 코드 예제에서는 지정된 WDM IRP에서 프레임워크 요청 개체를 만든 다음 삭제합니다. 이 예제에서는 RequestFreesIrp 매개 변수를 FALSE로 설정하므로 드라이버는 IoFreeIrp 를 호출하여 IRP를 제거해야 합니다. 예제의 모든 함수 호출이 필요합니다.

WDF_REQUEST_REUSE_PARAMS params;
WDFREQUEST request;
PIRP irp;

//Creation
status = WdfRequestCreateFromIrp(
                                 WDF_NO_OBJECT_ATTRIBUTES,
                                 irp,
                                 FALSE,
                                 &request
                                 );
...
//Deletion
WDF_REQUEST_REUSE_PARAMS_INIT(
                              &params,
                              WDF_REQUEST_REUSE_NO_FLAGS,
                              STATUS_SUCCESS
                              );
WDF_REQUEST_REUSE_PARAMS_SET_NEW_IRP(
                                     &params,
                                     NULL
                                     );
status = WdfRequestReuse(
                         request,
                         &params
                         );
ASSERT(NT_SUCCESS(status));
IoFreeIrp(irp);
WdfObjectDelete(request);

요구 사항

요구 사항
대상 플랫폼 유니버설
최소 KMDF 버전 1.0
머리글 wdfrequest.h(Wdf.h 포함)
라이브러리 Wdf01000.sys(프레임워크 라이브러리 버전 관리 참조)
IRQL <=DISPATCH_LEVEL
DDI 규정 준수 규칙 DriverCreate(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf)

추가 정보

IoFreeIrp

WDF_OBJECT_ATTRIBUTES

WdfDeviceInitSetRequestAttributes

WdfDriverCreate

WdfRequestCreate

WdfRequestReuse