다음을 통해 공유


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 경우 드라이버는 다음 예제 섹션에서 보여 주는 단계를 사용하여 IoFreeIrp 호출하여 IRP를 제거해야 합니다.

[out] Request

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

반환 값

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

이 메서드는 다른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에서 프레임워크 요청 개체를 만든 다음 삭제합니다. 다음은 요청 핸들이 제거될 때 프레임워크가 IRP를 제거하도록 RequestFreesIrp 매개 변수를 TRUE설정하는 예제입니다.

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