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(
¶ms,
WDF_REQUEST_REUSE_NO_FLAGS,
STATUS_SUCCESS
);
WDF_REQUEST_REUSE_PARAMS_SET_NEW_IRP(
¶ms,
NULL
);
status = WdfRequestReuse(
request,
¶ms
);
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) |