다음을 통해 공유


UMDF 드라이버에서 Kernel-Mode 클라이언트 지원

이 항목에서는 UMDF(User-Mode Driver Framework) 드라이버가 UMDF 버전 2부터 커널 모드 클라이언트를 지원하는 방법을 설명합니다.

커널 모드 클라이언트는 UMDF 드라이버에 I/O 요청을 보내는 커널 모드 드라이버입니다. 커널 모드 드라이버는 동일한 디바이스 스택에서 UMDF 드라이버 위에 있거나 다른 디바이스 스택에 있을 수 있습니다.

커널 모드 드라이버는 사용자 모드 애플리케이션에서 받은 I/O 요청을 전달하거나 새 I/O 요청을 만들어 사용자 모드 드라이버로 보낼 수 있습니다.

UMDF 드라이버에서 커널 모드 클라이언트를 지원하는 방법

커널 모드 클라이언트에 대해 UMDF 드라이버의 지원을 사용하도록 설정하려면 UMDF 드라이버의 INF 파일에 INF DDInstallUmdfKernelModeClientPolicy 지시문을 포함해야 합니다. WDF 섹션.

프레임워크는 커널 모드 클라이언트를 지원하는 드라이버에 유용한 두 가지 메서드를 제공합니다. 드라이버는 WdfRequestGetRequestorMode 메서드를 호출하여 I/O 요청이 커널 모드 또는 사용자 모드에서 왔는지 여부를 확인할 수 있습니다. I/O 요청이 사용자 모드에서 온 경우 드라이버는 WdfRequestIsFromUserModeDriver 를 호출하여 요청이 애플리케이션 또는 다른 사용자 모드 드라이버에서 왔는지 여부를 확인할 수 있습니다.

커널 모드 드라이버에 대한 제한 사항

UMDF 드라이버는 커널 모드 드라이버가 다음 요구 사항을 충족하는 경우에만 커널 모드 드라이버에서 I/O 요청을 처리할 수 있습니다.

  • 커널 모드 드라이버는 I/O 요청을 보낼 때 IRQL = PASSIVE_LEVEL 실행되어야 합니다.

  • 드라이버가 UmdfFileObjectPolicy INF 지시문을 AllowNullAndUnknownFileObjects로 설정하지 않은 경우 커널 모드 드라이버가 사용자 모드 드라이버에 보내는 각 I/O 요청에는 연결된 파일 개체가 있어야 합니다. 프레임워크는 이전에 I/O 관리자가 파일 개체를 만들었다는 알림을 받았어야 합니다. (이러한 알림으로 인해 프레임워크는 사용자 모드 드라이버의 EvtDeviceFileCreate 콜백 함수를 호출하지만 해당 콜백 함수는 선택 사항입니다.)

  • I/O 요청에는 IRP_MJ_INTERNAL_DEVICE_CONTROL 함수 코드가 포함될 수 없습니다.

  • 사용자 모드 드라이버는 포인터를 역참조할 수 없으므로 I/O 요청의 버퍼에는 추가 정보에 대한 포인터가 포함되어서는 안 됩니다.

  • I/O 요청에 "둘 다" 버퍼 액세스 메서드를 지정하는 I/O 컨트롤 코드 가 포함된 경우 커널 모드 드라이버는 I/O 요청을 만든 애플리케이션의 프로세스 컨텍스트에서 I/O 요청을 보내야 합니다. UMDF 드라이버에서 "둘 다" 메서드를 지원하는 방법에 대한 자세한 내용은 UMDF 드라이버에서 버퍼 액세스 메서드 관리를 참조하세요.

  • UMDF 드라이버는 사용자 모드에서 I/O 요청의 출력 데이터를 수정할 수 있습니다. 따라서 커널 모드 드라이버는 사용자 모드 드라이버에서 수신하는 출력 데이터의 유효성을 검사해야 합니다.

  • 커널 모드 클라이언트는 일반적으로 UMDF 드라이버가 WdfRequestCompleteWithInformation에 전달하는 정보 값의 유효성을 검사해야 합니다. 클라이언트가 KMDF 드라이버인 경우 WdfRequestGetCompletionParams 를 호출하여 IO_STATUS_BLOCK 구조에서 이 정보를 가져올 수 있습니다.

    일반적으로 프레임워크는 UMDF 드라이버가 WdfRequestCompleteWithInformation에 전달하는 정보 값의 유효성을 검사하지 않습니다. (이 매개 변수는 일반적으로 전송된 바이트 수를 지정합니다.) 프레임워크는 출력 버퍼에 대해서만 정보 값의 유효성을 검사하고 버퍼링된 I/O 데이터 액세스 메서드에 대해서만 유효성을 검사합니다. 예를 들어 프레임워크는 액세스 메서드가 버퍼링된 I/O인 경우 전송된 바이트 수가 읽기 작업의 출력 버퍼 크기를 초과하지 않는지 확인합니다.