신뢰할 수 있는 Kernel-Mode 드라이버 만들기
드라이버는 커널 모드에서 실행되는 전체 코드의 상당 부분을 차지합니다. 커널 모드 드라이버는 사실상 운영 체제의 구성 요소입니다. 따라서 안정적이고 안전한 드라이버는 운영 체제의 전반적인 신뢰도에 크게 기여합니다. 신뢰할 수 있는 커널 모드 드라이버를 만들려면 다음 지침을 따릅니다.
디바이스 개체를 올바르게 보호합니다.
시스템의 드라이버 및 디바이스에 대한 사용자 액세스는 시스템이 디바이스 개체에 할당하는 보안 설명자에 의해 제어됩니다. 대부분의 경우 시스템은 디바이스가 설치될 때 디바이스 보안 매개 변수를 설정합니다. 자세한 내용은 보안 디바이스 설치 만들기참조하세요. 경우에 따라 드라이버가 디바이스에 대한 액세스를 제어하는 역할을 하는 것이 적절합니다. 자세한 내용은 디바이스 개체 보안
참조하세요. 디바이스 개체의 유효성을 올바르게 검사합니다.
드라이버가 여러 유형의 디바이스 개체를 만드는 경우 각 IRP에서 수신하는 형식을 확인해야 합니다. 자세한 내용은 디바이스 개체유효성 검사 실패를 참조하세요.
"safe string" 함수를 사용합니다.
문자열을 조작할 때 드라이버는 C/C++ 언어 런타임 라이브러리와 함께 제공되는 문자열 함수 대신 안전한 문자열 함수를 사용해야 합니다. 자세한 내용은 안전한 문자열 함수 사용에 대한 정보를 참조하세요.
개체 핸들의 유효성을 확인합니다.
개체 핸들을 입력으로 수신하는 드라이버는 핸들이 유효하고, 액세스할 수 있으며, 예상되는 형식인지 확인해야 합니다. 개체 핸들 사용에 대한 자세한 내용은 다음 항목을 참조하세요.
다중 프로세서를 제대로 지원합니다.
드라이버가 단일 프로세서 시스템에서만 실행된다고 가정하지 마세요. 드라이버가 다중 프로세서 시스템에서 제대로 작동하도록 하는 데 사용할 수 있는 프로그래밍 기술에 대한 자세한 내용은 다음 항목을 참조하세요.
드라이버 상태를 올바르게 관리하십시오.
항상 드라이버가 예상한 상태에 있는지 확인하는 것이 중요합니다. 예를 들어 드라이버가 IRP를 수신하는 경우 동일한 형식의 IRP를 이미 서비스하고 있나요? 드라이버가 이 상황을 확인하지 않으면 첫 번째 IRP가 손실될 수 있습니다. 자세한 내용은 드라이버 상태 확인 실패에 대한 을 참조하십시오.
IRP 입력 값의 유효성을 검사합니다.
안정성과 보안 측면에서는 버퍼 주소 및 길이와 같이 IRP와 연결된 모든 값의 유효성을 검사해야 합니다. 다음 항목에서는 IRP 입력 값의 유효성을 검사하는 방법에 대한 정보를 제공합니다.
I/O 스택을 제대로 처리하세요.
드라이버 스택 IRP를 전달하는드라이버가 IoSkipCurrentIrpStackLocation 호출하거나 IoCopyCurrentIrpStackLocationToNext 호출하여 다음 드라이버의 I/O 스택 위치를 설정하는 것이 중요합니다. 하나의 I/O 스택 위치를 다음 위치에 직접 복사하는 코드를 작성하지 마세요.
IRP 완료 작업을 올바르게 처리합니다.
드라이버는 실제로 IRP를 지원하고 처리하지 않는 한 상태 값이 STATUS_SUCCESS인 IRP를 완료해서는 안 됩니다. IRP 완료 작업을 올바르게 처리하는 방법에 대한 정보는 완료 IRPs를 참조하세요.
IRP 취소 작업을 올바르게 처리합니다.
취소 작업은 일반적으로 비동기적으로 실행되므로 제대로 코딩하기 어려울 수 있습니다. 이 코드는 일반적으로 실행 중인 시스템에서 자주 실행되지 않으므로 취소 작업을 처리하는 코드의 문제는 오랫동안 눈에 띄지 않을 수 있습니다.
IRP 취소제공된 모든 정보를 읽고 이해해야 합니다. IRP 취소 동기화에 특별히 주의하고, IRP를 취소할 때 고려해야 할 지점에 유의하세요.
취소 작업과 관련된 동기화 문제를 방지하는 한 가지 방법은 취소로부터 안전한 IRP 큐구현하는 것입니다. 취소로부터 안전한 IRP 큐는 Windows XP 이상 운영 체제 버전에 도입되었지만 이전 버전과 호환되는 드라이버 관리 큐입니다.
IRP 정리 작업을 처리하고 닫기 작업을 제대로 수행하십시오.
IRP_MJ_CLEANUP 요청과 IRP_MJ_CLOSE 요청의 차이점을 이해해야 합니다. 정리 요청은 애플리케이션이 파일 개체의 모든 핸들을 닫은 후에 도착하지만 때로는 모든 I/O 요청이 완료되기 전에 도착합니다. 파일 개체에 대한 모든 I/O 요청이 완료되거나 취소된 후 닫기 요청이 도착합니다. 자세한 내용은 다음 항목을 참조하세요.
IRP를 올바르게 처리하는 방법에 대한 자세한 내용은 IRP처리의 추가 오류를 참조하세요.
드라이버 검증 도구 사용
드라이버 검증 도구 드라이버의 안정성을 보장하는 데 사용할 수 있는 가장 중요한 도구입니다. 드라이버 검증 도구는 이 섹션에서 설명한 몇 가지 일반적인 드라이버 문제를 포함하여 다양한 일반적인 드라이버 문제를 확인할 수 있습니다. 그러나 드라이버 검증 도구의 사용은 신중하고 신중한 소프트웨어 디자인을 대체하지 않습니다.