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에서 프레임워크 요청 개체를 만든 다음 삭제합니다. 다음은 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(
¶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) |
참고 항목
피드백
다음에 대한 사용자 의견 제출 및 보기