WdfDeviceEnqueueRequest 함수(wdfdevice.h)
[KMDF에만 적용]
WdfDeviceEnqueueRequest 메서드는 프레임워크에 지정된 I/O 요청을 전달하므로 프레임워크는 이후에 드라이버가 지정된 디바이스에 대해 만든 I/O 큐 중 하나에 요청을 추가할 수 있습니다.
구문
NTSTATUS WdfDeviceEnqueueRequest(
[in] WDFDEVICE Device,
[in] WDFREQUEST Request
);
매개 변수
[in] Device
프레임워크 디바이스 개체에 대한 핸들입니다.
[in] Request
프레임워크 요청 개체에 대한 핸들입니다.
반환 값
작업이 성공하면 메서드는 STATUS_SUCCESS 반환합니다. 추가 반환 값은 다음과 같습니다.
반환 코드 | 설명 |
---|---|
|
사용 가능한 메모리 양이 부족합니다. |
|
드라이버가 디바이스에 대한 I/O 큐를 만들지 않았으며 드라이버가 필터 드라이버가 아닙니다. |
|
디바이스의 I/O 큐가 요청을 수락하지 않습니다. |
메서드는 다른 NTSTATUS 값을 반환할 수 있습니다.
드라이버가 잘못된 개체 핸들을 제공하는 경우 버그 검사 발생합니다.
설명
드라이버는 EvtIoInCallerContext 콜백 함수에서만 WdfDeviceEnqueueRequest를 호출할 수 있습니다.
WdfDeviceEnqueueRequest 메서드는 드라이버가 디바이스를 만든 경우 드라이버의 요청 유형별 I/O 큐에 요청을 추가합니다. 그렇지 않으면 드라이버가 만든 경우 메서드는 디바이스의 기본 큐에 요청을 추가합니다.
드라이버가 디바이스에 대한 I/O 큐를 만들지 않은 경우 WdfDeviceEnqueueRequest 는 다음을 수행합니다.
- 드라이버가 필터 드라이버인 경우 WdfDeviceEnqueueRequest 는 드라이버의 I/O 대상에 요청을 보냅니다.
- 드라이버가 필터 드라이버가 아닌 경우 WdfDeviceEnqueueRequest 는 STATUS_INVALID_DEVICE_REQUEST 반환합니다.
따라서 드라이버가 WdfDeviceEnqueueRequest를 호출한 후 요청 또는 해당 컨텍스트를 사용해야 하는 경우 WdfDeviceEnqueueRequest를 호출하기 전에 요청에 대한 참조를 가져와야 합니다.
이렇게 하려면 드라이버가 WdfDeviceEnqueueRequest를 호출한 후 WdfObjectReference를 호출한 다음 WdfObjectDereference를 호출할 수 있습니다. 드라이버는 EvtIoInCallerContext를 종료하기 전에 요청을 역참조해야 합니다.
WdfDeviceEnqueueRequest 메서드에 대한 자세한 내용은 I/O 큐 관리를 참조하세요.
KMDF 버전 1.0 및 1.5의 경우 PASSIVE_LEVEL WdfDeviceEnqueueRequest 를 호출해야 합니다. 버전 1.7 이상에서는 IRQL <= DISPATCH_LEVEL WdfDeviceEnqueueRequest를 호출할 수 있습니다.
예제
다음 코드 예제는 사용자 지정 I/O 제어 코드 IOCTL_NONPNP_METHOD_NEITHER 포함된 요청을 찾는 EvtIoInCallerContext 콜백 함수입니다. I/O 컨트롤 코드를 찾을 수 없는 경우 콜백 함수는 프레임워크에 요청을 반환합니다. 콜백 함수가 I/O 컨트롤 코드를 찾으면 요청을 전처리한 다음 프레임워크로 반환합니다. 오류가 발생하면 콜백 함수가 요청을 완료합니다.
VOID
MyEvtDeviceIoInCallerContext(
IN WDFDEVICE Device,
IN WDFREQUEST Request
)
{
NTSTATUS status = STATUS_SUCCESS;
WDF_REQUEST_PARAMETERS params;
WDF_REQUEST_PARAMETERS_INIT(¶ms);
WdfRequestGetParameters(
Request,
¶ms
);
if(!(params.Type == WdfRequestTypeDeviceControl &&
params.Parameters.DeviceIoControl.IoControlCode == IOCTL_NONPNP_METHOD_NEITHER)) {
status = WdfDeviceEnqueueRequest(
Device,
Request
);
if(!NT_SUCCESS(status)) {
goto End;
}
return;
}
//
// Found a match for the control code. Preprocess the request, and then
// return the request to the framework.
//
//...(Preprocess the request here.)
status = WdfDeviceEnqueueRequest(
Device,
Request
);
if(!NT_SUCCESS(status)) {
goto End;
}
return;
End:
WdfRequestComplete(
Request,
status
);
return;
}
요구 사항
요구 사항 | 값 |
---|---|
대상 플랫폼 | 유니버설 |
최소 KMDF 버전 | 1.0 |
머리글 | wdfdevice.h(Wdf.h 포함) |
라이브러리 | Wdf01000.sys(프레임워크 라이브러리 버전 관리 참조) |
IRQL | <= DISPATCH_LEVEL(설명 섹션 참조) |
DDI 규정 준수 규칙 | DeferredRequestCompleted(kmdf), DriverCreate(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf), RequestCompleted(kmdf), RequestCompletedLocal(kmdf) |