다음을 통해 공유


신뢰할 수 있는 Kernel-Mode 드라이버 만들기

드라이버는 커널 모드에서 실행되는 총 코드의 상당 부분을 차지합니다. 커널 모드 드라이버는 사실상 운영 체제의 구성 요소입니다. 따라서 안정적이고 안전한 드라이버는 운영 체제의 전반적인 신뢰도에 크게 기여합니다. 신뢰할 수 있는 커널 모드 드라이버를 만들려면 다음 지침을 따릅니다.

  • 디바이스 개체를 올바르게 보호합니다.

    시스템의 드라이버 및 디바이스에 대한 사용자 액세스는 시스템이 디바이스 개체에 할당하는 보안 설명자에 의해 제어됩니다. 대부분의 경우 시스템은 디바이스가 설치될 때 디바이스 보안 매개 변수를 설정합니다. 자세한 내용은 보안 디바이스 설치 만들기를 참조하세요. 경우에 따라 드라이버가 디바이스에 대한 액세스를 제어하는 역할을 하는 것이 적절합니다. 자세한 내용은 디바이스 개체 보안을 참조하세요.

  • 디바이스 개체의 유효성을 올바르게 검사합니다.

    드라이버가 여러 유형의 디바이스 개체를 만드는 경우 각 IRP에서 수신하는 형식을 검사 합니다. 자세한 내용은 디바이스 개체 유효성 검사 실패를 참조하세요.

  • "안전 문자열" 함수를 사용합니다.

    문자열을 조작할 때 드라이버는 C/C++ 언어 런타임 라이브러리와 함께 제공되는 문자열 함수 대신 안전한 문자열 함수를 사용해야 합니다. 자세한 내용은 안전 문자열 함수 사용을 참조하세요.

  • 개체 핸들의 유효성을 검사합니다.

    입력으로 개체 핸들을 수신하는 드라이버는 핸들이 유효하고 액세스할 수 있으며 예상되는 형식인지 확인해야 합니다. 개체 핸들 사용에 대한 자세한 내용은 다음 topics 참조하세요.

    개체 관리

    개체 핸들 유효성 검사 실패

  • 다중 프로세서를 제대로 지원합니다.

    드라이버가 단일 프로세서 시스템에서만 실행된다고 가정하지 마세요. 드라이버가 다중 프로세서 시스템에서 제대로 작동하도록 하는 데 사용할 수 있는 프로그래밍 기술에 대한 자세한 내용은 다음 topics 참조하세요.

    동기화 기술

    다중 프로세서 환경의 오류

  • 드라이버 상태를 올바르게 처리합니다.

    항상 드라이버가 있는 것으로 가정하는 상태에 있는지 확인하는 것이 중요합니다. 예를 들어 드라이버가 IRP를 수신하는 경우 동일한 형식의 IRP를 이미 서비스하고 있나요? 드라이버가 이 상황에 대해 검사 않으면 첫 번째 IRP가 손실될 수 있습니다. 자세한 내용은 드라이버 상태 확인 실패를 참조하세요.

  • IRP 입력 값의 유효성을 검사합니다.

    안정성과 보안 관점에서 버퍼 주소 및 길이와 같이 IRP와 연결된 모든 값의 유효성을 검사하는 것이 필수적입니다. 다음 topics IRP 입력 값의 유효성을 검사하는 방법에 대한 정보를 제공합니다.

    버퍼링된 I/O를 사용하여 DispatchReadWrite

    버퍼링된 I/O의 오류

    직접 I/O를 사용하여 DispatchReadWrite

    직접 I/O의 오류

    I/O 제어 코드에 대한 보안 문제

    User-Space 주소 참조 오류

  • I/O 스택을 제대로 처리합니다.

    드라이버 스택 아래로 IRP를 전달할 때 드라이버가 IoSkipCurrentIrpStackLocation 또는 IoCopyCurrentIrpStackLocationToNext를 호출하여 다음 드라이버의 I/O 스택 위치를 설정하는 것이 중요합니다. 하나의 I/O 스택 위치를 다음 위치에 직접 복사하는 코드를 작성하지 마세요.

  • IRP 완료 작업을 올바르게 처리합니다.

    드라이버는 실제로 IRP를 지원하고 처리하지 않는 한 상태 값이 STATUS_SUCCESS IRP를 완료해서는 안 됩니다. IRP 완료 작업을 처리하는 올바른 방법에 대한 자세한 내용은 IRP 완료를 참조하세요.

  • IRP 취소 작업을 올바르게 처리합니다.

    취소 작업은 일반적으로 비동기적으로 실행되므로 제대로 코딩하기 어려울 수 있습니다. 이 코드는 일반적으로 실행 중인 시스템에서 자주 실행되지 않으므로 취소 작업을 처리하는 코드의 문제는 오랫동안 눈에 띄지 않을 수 있습니다.

    IRP 취소에 제공된 모든 정보를 읽고 이해해야 합니다. IRP 취소 동기화IRP를 취소할 때 고려해야 할 사항에 특히 주의하세요.

    취소 작업과 관련된 동기화 문제를 방지하는 한 가지 방법은 취소 안전 IRP 큐를 구현하는 것입니다. 취소 안전 IRP 큐는 Windows XP 이상 운영 체제 버전에 도입되었지만 이전 버전과 호환되는 드라이버 관리 큐입니다.

  • IRP 정리를 처리하고 작업을 제대로 닫습니다.

    IRP_MJ_CLEANUP 요청과 IRP_MJ_CLOSE 요청 간의 차이점을 이해해야 합니다. 정리 요청은 애플리케이션이 파일 개체의 모든 핸들을 닫은 후에 도착하지만 때로는 모든 I/O 요청이 완료되기 전에 도착합니다. 파일 개체에 대한 모든 I/O 요청이 완료되거나 취소된 후 닫기 요청이 도착합니다. 자세한 내용은 아래 항목을 참조하세요.

    DispatchCreate, DispatchClose 및 DispatchCreateClose 루틴

    DispatchCleanup 루틴

    정리 및 닫기 작업 처리 오류

IRP를 올바르게 처리하는 방법에 대한 자세한 내용은 IRP 처리의 추가 오류를 참조하세요.

드라이버 검증 도구 사용

드라이버 검증 도구 는 드라이버의 안정성을 보장하는 데 사용할 수 있는 가장 중요한 도구입니다. 드라이버 검증 도구는 이 섹션에서 설명하는 몇 가지 일반적인 드라이버 문제를 포함하여 다양한 일반적인 드라이버 문제를 검사 수 있습니다. 그러나 드라이버 검증 도구의 사용은 신중하고 신중한 소프트웨어 디자인을 대체하지 않습니다.