WdfIoTargetSendInternalIoctlSynchronously 함수(wdfiotarget.h)
[KMDF에만 적용]
WdfIoTargetSendInternalIoctlSynchronously 메서드는 내부 디바이스 제어 요청을 빌드하고 I/O 대상에 동기적으로 보냅니다.
통사론
NTSTATUS WdfIoTargetSendInternalIoctlSynchronously(
[in] WDFIOTARGET IoTarget,
[in, optional] WDFREQUEST Request,
[in] ULONG IoctlCode,
[in, optional] PWDF_MEMORY_DESCRIPTOR InputBuffer,
[in, optional] PWDF_MEMORY_DESCRIPTOR OutputBuffer,
[in, optional] PWDF_REQUEST_SEND_OPTIONS RequestOptions,
[out, optional] PULONG_PTR BytesReturned
);
매개 변수
[in] IoTarget
WdfDeviceGetIoTarget 또는
[in, optional] Request
프레임워크 요청 개체에 대한 핸들입니다. 이 매개 변수는 선택 사항이며 NULL
[in] IoctlCode
I/O 대상이 지원하는 I/O 제어 코드(IOCTL)입니다.
[in, optional] InputBuffer
I/O 대상에 기록될 버퍼를 설명하는 호출자 할당 WDF_MEMORY_DESCRIPTOR 구조체에 대한 포인터입니다. 자세한 내용은 다음 설명 섹션을 참조하세요. 이 매개 변수는 선택 사항이며 요청이 데이터를 보내지 않는 경우 NULL
[in, optional] OutputBuffer
I/O 대상에서 데이터를 수신할 버퍼를 설명하는 호출자 할당 WDF_MEMORY_DESCRIPTOR 구조체에 대한 포인터입니다. 자세한 내용은 다음 설명 섹션을 참조하세요. 이 매개 변수는 선택 사항이며 요청이 데이터를 수신하지 않는 경우 NULL
[in, optional] RequestOptions
요청에 대한 옵션을 지정하는 호출자가 할당한 WDF_REQUEST_SEND_OPTIONS 구조체에 대한 포인터입니다. 이 포인터는 선택 사항이며 NULL
[out, optional] BytesReturned
WdfRequestCompleteWithInformation호출하여 요청을 완료할 때 다른 드라이버가 제공하는 정보(예: 전송된 바이트 수)를 수신하는 위치에 대한 포인터입니다. 이 포인터는 선택 사항이며 NULL
반환 값
작업이 성공하면 WdfIoTargetSendInternalIoctlSynchronously 내부 디바이스 제어 요청이 완료된 후 반환되며 반환 값은 요청의 완료 상태 값입니다. 그렇지 않으면 이 메서드는 다음 값 중 하나를 반환할 수 있습니다.
반환 코드 | 묘사 |
---|---|
|
잘못된 매개 변수가 검색되었습니다. |
|
RequestOptions 매개 변수가 가리키는 WDF_REQUEST_SEND_OPTIONS 구조체의 크기가 잘못되었습니다. |
|
요청이 이미 I/O 대상에 큐에 대기되었습니다. |
|
프레임워크에서 시스템 리소스(일반적으로 메모리)를 할당할 수 없습니다. |
|
드라이버에서 제한 시간 값을 제공했으며 할당된 시간 내에 요청이 완료되지 않았습니다. |
|
Request 매개 변수가 나타내는 I/O 요청 패킷(IRP)은 드라이버가 요청을 전달할 수 있는 충분한 IO_STACK_LOCATION 구조를 제공하지 않습니다. |
이 메서드는다른
드라이버에서 잘못된 개체 핸들을 제공하면 버그 검사가 수행됩니다.
발언
WdfIoTargetSendInternalIoctlSynchronously 메서드를 사용하여 내부 디바이스 제어 요청을 동기적으로 보냅니다. 내부 디바이스 제어 요청을 비동기적으로 보내려면 WdfIoTargetFormatRequestForInternalIoctl 메서드와 WdfRequestSend 메서드를 사용합니다.
내부 디바이스 제어 요청에 대한 자세한 내용은I/O 제어 코드 사용
WdfIoTargetSendInternalIoctlSynchronously 메서드는 요청이 완료될 때까지, 드라이버가 RequestOptions 매개 변수의 WDF_REQUEST_SEND_OPTIONS 구조에 시간 제한 값을 제공하지 않거나 오류가 검색되지 않는 한 반환되지 않습니다.
드라이버가 I/O 큐에서 받은 내부 디바이스 제어 요청을 전달하거나 새 요청을 만들고 보낼 수 있습니다. 두 경우 모두 프레임워크에는 요청 개체와 일부 버퍼 공간이 필요합니다.
드라이버가 I/O 큐에서 받은 내부 디바이스 제어 요청을 전달하려면 다음을 수행합니다.
- WdfIoTargetSendInternalIoctlSynchronously 메서드의 Request 매개 변수에 대해 수신된 요청의 핸들을 지정합니다.
-
수신된 요청의 입력 버퍼를 WdfIoTargetSendInternalIoctlSynchronously 메서드의 InputBuffer 매개 변수에 사용합니다.
드라이버는 WdfRequestRetrieveInputMemory 호출하여 요청의 입력 버퍼에 대한 핸들을 가져와야 합니다. 그런 다음 드라이버는 InputBuffer 매개 변수에 대해 드라이버가 제공하는 WDF_MEMORY_DESCRIPTOR 구조에 해당 핸들을 배치해야 합니다.
-
WdfIoTargetSendInternalIoctlSynchronously 메서드의 OutputBuffer 매개 변수에 대해 수신된 요청의 출력 버퍼를 사용합니다.
드라이버는 WdfRequestRetrieveOutputMemory 호출하여 요청의 출력 버퍼에 대한 핸들을 가져와야 하며, 그런 다음 드라이버가 OutputBuffer 매개 변수에 제공하는 WDF_MEMORY_DESCRIPTOR 구조에 해당 핸들을 배치해야 합니다.
드라이버는 수신된 I/O 요청을 I/O 대상으로 보내는 더 작은 요청으로 나누는 경우가 많으므로 드라이버는 새 요청을 만들 수 있습니다.
새 I/O 요청을 만들려면 다음을 수행합니다.
-
WdfIoTargetSendInternalIoctlSynchronously 메서드의 Request 매개 변수에 대한 NULL 요청 핸들을 제공하거나 새 요청 개체를 만들고 해당 핸들을 제공합니다.
- NULL 요청 핸들을 제공하는 경우 프레임워크는 내부 요청 개체를 사용합니다. 이 기술은 사용하기는 간단하지만 드라이버는 요청을 취소할 수 없습니다.
- WdfRequestCreate 호출하여 하나 이상의 요청 개체를 만드는 경우 WdfRequestReuse호출하여 이러한 요청 개체를 다시 사용할 수 있습니다. 이 기술을 사용하면 드라이버의 EvtDriverDeviceAdd 콜백 함수가 디바이스에 대한 요청 개체를 미리 할당할 수 있습니다. 또한 필요한 경우 다른 드라이버 스레드가 WdfRequestCancelSentRequest 호출하여 요청을 취소할 수 있습니다.
드라이버가NULL이 아닌 또는 NULLRequest 매개 변수를 제공하는지 여부에 관계없이 드라이버에서NULLRequestOptions 매개 변수를 지정할 수 있습니다. 예를 들어 RequestOptions 매개 변수를 사용하여 제한 시간 값을 지정할 수 있습니다.
-
요청에 필요한 경우 WdfIoTargetSendInternalIoctlSynchronously 메서드의 InputBuffer 및 OutputBuffer 매개 변수에 대한 버퍼 공간을 제공합니다.
드라이버는 이 버퍼 공간을 로컬로 할당된 버퍼, WDFMEMORY 핸들 또는 MDL(메모리 설명자 목록)으로 지정할 수 있습니다. 가장 편리한 방법을 사용할 수 있습니다.
필요한 경우 프레임워크는 IOCTL의 전송 유형에 맞도록 버퍼 설명을 변환합니다. IOCTL 전송 형식에 대한 자세한 내용은 정의 I/O 제어 코드참조하세요.
버퍼 공간을 지정하는 다음 기술을 사용할 수 있습니다.
-
로컬 버퍼를 제공합니다.
WdfIoTargetSendInternalIoctlSynchronously I/O 요청을 동기적으로 처리하므로 드라이버는 다음 코드 예제와 같이 호출 루틴에 로컬인 요청 버퍼를 만들 수 있습니다.
WDF_MEMORY_DESCRIPTOR MemoryDescriptor; MY_BUFFER_TYPE MyBuffer; WDF_MEMORY_DESCRIPTOR_INIT_BUFFER(&MemoryDescriptor, (PVOID) &MyBuffer, sizeof(MyBuffer));
-
WDFMEMORY 핸들을 제공합니다.
다음 코드 예제와 같이 WdfMemoryCreate 또는 WdfMemoryCreatePreallocated 호출하여 프레임워크 관리 메모리에 대한 핸들을 가져옵니다.
WDF_MEMORY_DESCRIPTOR MemoryDescriptor; WDFMEMORY MemoryHandle = NULL; status = WdfMemoryCreate(NULL, NonPagedPool, POOL_TAG, MY_BUFFER_SIZE, &MemoryHandle, NULL); WDF_MEMORY_DESCRIPTOR_INIT_HANDLE(&MemoryDescriptor, MemoryHandle, NULL);
또는 드라이버가 해당 버퍼의 콘텐츠를 I/O 대상에 전달하도록 하려면 WdfRequestRetrieveInputMemory 또는 WdfRequestRetrieveOutputMemory 호출하여 수신된 I/O 요청의 버퍼를 나타내는 프레임워크 메모리 개체에 대한 핸들을 가져올 수 있습니다. I/O 대상에 보내는
WdfIoTargetSendInternalIoctlSynchronously 새 요청이 삭제, 재사용 또는 다시 포맷될 때까지 드라이버는 수신된 I/O 요청을 완료하지 않아야 합니다. (WdfIoTargetSendInternalIoctlSynchronously 메모리 개체의 참조 수를 증가합니다. 요청 개체를 삭제, 재사용 또는 다시 포맷하면 메모리 개체의 참조 수가 감소합니다.) -
MDL을 제공합니다.
드라이버는
WdfRequestRetrieveInputWdmdl 호출하고 WdfRequestRetrieveOutputWdmMdl수신된 I/O 요청과 연결된 MDL을 가져올 수 있습니다.
-
로컬 버퍼를 제공합니다.
WdfIoTargetSendInternalIoctlSynchronously
I/O 대상에 대한 자세한 내용은 I/O 대상 사용참조하세요.
예제
다음 코드 예제에서는 로컬 버퍼를 정의하고,
WDF_MEMORY_DESCRIPTOR outputDescriptor;
NTSTATUS status;
MY_DRIVER_INFORMATION driverInformation;
WDF_MEMORY_DESCRIPTOR_INIT_BUFFER(
&outputDescriptor,
(PVOID) &driverInformation,
sizeof(MY_DRIVER_INFORMATION)
);
status = WdfIoTargetSendInternalIoctlSynchronously(
hidTarget,
NULL,
IOCTL_INTERNAL_GET_MY_DRIVER_INFORMATION,
NULL,
&outputDescriptor,
NULL,
NULL
);
요구 사항
요구 | 값 |
---|---|
대상 플랫폼 | 보편적 |
최소 KMDF 버전 | 1.0 |
헤더 | wdfiotarget.h(Wdf.h 포함) |
라이브러리 | Wdf01000.sys(프레임워크 라이브러리 버전 관리 참조) |
IRQL |
PASSIVE_LEVEL |
DDI 규정 준수 규칙 |
참고 항목
WdfIoTargetCreate
WdfIoTargetFormatRequestForInternalIoctl
WdfIoTargetSendIoctlSynchronously
WdfRequestCompleteWithInformation
WdfRequestRetrieveOutputMemory