신뢰할 수 있는 Kernel-Mode 드라이버 만들기
드라이버는 커널 모드에서 실행되는 총 코드의 상당 부분을 차지합니다. 커널 모드 드라이버는 사실상 운영 체제의 구성 요소입니다. 따라서 안정적이고 안전한 드라이버는 운영 체제의 전반적인 신뢰도에 크게 기여합니다. 신뢰할 수 있는 커널 모드 드라이버를 만들려면 다음 지침을 따릅니다.
디바이스 개체를 올바르게 보호합니다.
시스템의 드라이버 및 디바이스에 대한 사용자 액세스는 시스템이 디바이스 개체에 할당하는 보안 설명자에 의해 제어됩니다. 대부분의 경우 시스템은 디바이스가 설치될 때 디바이스 보안 매개 변수를 설정합니다. 자세한 내용은 보안 디바이스 설치 만들기를 참조하세요. 경우에 따라 드라이버가 디바이스에 대한 액세스를 제어하는 역할을 하는 것이 적절합니다. 자세한 내용은 디바이스 개체 보안을 참조하세요.
디바이스 개체의 유효성을 올바르게 검사합니다.
드라이버가 여러 유형의 디바이스 개체를 만드는 경우 각 IRP에서 수신하는 형식을 검사 합니다. 자세한 내용은 디바이스 개체 유효성 검사 실패를 참조하세요.
"안전 문자열" 함수를 사용합니다.
문자열을 조작할 때 드라이버는 C/C++ 언어 런타임 라이브러리와 함께 제공되는 문자열 함수 대신 안전한 문자열 함수를 사용해야 합니다. 자세한 내용은 안전 문자열 함수 사용을 참조하세요.
개체 핸들의 유효성을 검사합니다.
입력으로 개체 핸들을 수신하는 드라이버는 핸들이 유효하고 액세스할 수 있으며 예상되는 형식인지 확인해야 합니다. 개체 핸들 사용에 대한 자세한 내용은 다음 topics 참조하세요.
다중 프로세서를 제대로 지원합니다.
드라이버가 단일 프로세서 시스템에서만 실행된다고 가정하지 마세요. 드라이버가 다중 프로세서 시스템에서 제대로 작동하도록 하는 데 사용할 수 있는 프로그래밍 기술에 대한 자세한 내용은 다음 topics 참조하세요.
드라이버 상태를 올바르게 처리합니다.
항상 드라이버가 있는 것으로 가정하는 상태에 있는지 확인하는 것이 중요합니다. 예를 들어 드라이버가 IRP를 수신하는 경우 동일한 형식의 IRP를 이미 서비스하고 있나요? 드라이버가 이 상황에 대해 검사 않으면 첫 번째 IRP가 손실될 수 있습니다. 자세한 내용은 드라이버 상태 확인 실패를 참조하세요.
IRP 입력 값의 유효성을 검사합니다.
안정성과 보안 관점에서 버퍼 주소 및 길이와 같이 IRP와 연결된 모든 값의 유효성을 검사하는 것이 필수적입니다. 다음 topics IRP 입력 값의 유효성을 검사하는 방법에 대한 정보를 제공합니다.
버퍼링된 I/O를 사용하여 DispatchReadWrite
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 요청이 완료되거나 취소된 후 닫기 요청이 도착합니다. 자세한 내용은 아래 항목을 참조하세요.
IRP를 올바르게 처리하는 방법에 대한 자세한 내용은 IRP 처리의 추가 오류를 참조하세요.
드라이버 검증 도구 사용
드라이버 검증 도구 는 드라이버의 안정성을 보장하는 데 사용할 수 있는 가장 중요한 도구입니다. 드라이버 검증 도구는 이 섹션에서 설명하는 몇 가지 일반적인 드라이버 문제를 포함하여 다양한 일반적인 드라이버 문제를 검사 수 있습니다. 그러나 드라이버 검증 도구의 사용은 신중하고 신중한 소프트웨어 디자인을 대체하지 않습니다.