정적 드라이버 검증 도구를 사용하여 Windows 드라이버에서 결함 찾기
SDV(정적 드라이버 검증 도구)는 인터페이스 규칙 집합과 운영 체제 모델을 사용하여 드라이버가 Windows 운영 체제와 올바르게 상호 작용하는지 확인합니다. SDV는 드라이버 코드에서 드라이버의 잠재적 버그를 가리킬 수 있는 결함을 찾습니다.
SDV는 WDM, KMDF, NDIS 또는 Storport 드라이버 모델 중 하나를 준수하는 커널 모드 드라이버를 분석할 수 있습니다. 자세한 내용은 지원되는 드라이버를 참조하고 정적 드라이버 검증 도구가 드라이버 또는 라이브러리를 지원하는지 여부를 확인합니다. 또한 SDV는 위의 드라이버 모델을 따르지 않는 드라이버에 대해 제한된 지원(null 역참조와 같은 일반적인 오류에 초점을 맞춘 엄격하게 제한된 규칙 집합)을 제공합니다.
Important
SDV는 더 이상 지원되지 않으며 Windows 24H2 WDK 또는 EWDK 릴리스에서는 SDV를 사용할 수 없습니다. 빌드 26017보다 최신의 WDK에서는 사용할 수 없으며 Windows 24H2 RTM WDK에는 포함되지 않습니다.
SDV는 WDK(Windows 드라이버 키트) 다운로드에서 Visual Studio 빌드 도구 17.1.5와 함께 Windows 11 버전 22H2 EWDK(2023년 10월 24일 릴리스)를 다운로드하여 계속 사용할 수 있습니다. SDV를 실행하는 데 엔터프라이즈 WDK만 사용하는 것이 좋습니다. 최신 버전의 Visual Studio와 함께 표준 WDK의 이전 버전을 사용하는 것은 권장되지 않습니다. 따라서 분석 실패가 발생할 수 있습니다.
앞으로 CodeQL은 드라이버의 기본 정적 분석 도구가 될 것입니다. CodeQL은 코드를 쿼리할 데이터베이스로 처리하는 강력한 쿼리 언어를 제공하므로 특정 동작, 패턴 등에 대한 쿼리를 간단하게 작성할 수 있습니다.
CodeQL 사용에 대한 자세한 내용은 CodeQL 및 정적 도구 로고 테스트를 참조하세요.
소스 코드 준비
다음 단계를 사용하여 분석을 위해 코드를 준비합니다.
함수 역할 형식을 사용하여 드라이버 제공 함수 선언
SDV를 사용하려면 함수 역할 형식 선언을 사용하여 함수를 선언해야 합니다. 예를 들어 DRIVER_INITIALIZE 함수 역할 유형을 사용하여 DriverEntry 루틴을 선언해야 합니다.
DRIVER_INITIALIZE DriverEntry;
선언 후에는 다음과 같이 콜백 루틴을 구현(또는 정의)합니다.
/ // Driver initialization routine // NTSTATUS DriverEntry( _In_ struct _DRIVER_OBJECT *DriverObject, _In_ PUNICODE_STRING RegistryPath ) { // Function body }
지원되는 각 드라이버 모델에는 드라이버 콜백 함수 및 디스패치 루틴에 대한 함수 역할 형식 집합이 있습니다. 이러한 함수 역할 형식은 WDK 헤더 파일에 선언됩니다. 예를 들어 Wdm.h에 표시되는 DRIVER_INITIALIZE 역할 형식에 대한 함수 프로토타입은 다음과 같습니다.
/ // Define driver initialization routine type. // _Function_class_(DRIVER_INITIALIZE) _IRQL_requires_same_ typedef NTSTATUS DRIVER_INITIALIZE ( _In_ struct _DRIVER_OBJECT *DriverObject, _In_ PUNICODE_STRING RegistryPath ); typedef DRIVER_INITIALIZE *PDRIVER_INITIALIZE;
함수 역할 형식은 WDK 헤더 파일에 이미 정의되어 있으므로 콜백 함수를 해당 형식으로 선언하기만 하면 됩니다. 이 경우 DriverEntry를 DRIVER_INITIALIZE 형식으로 선언합니다. 드라이버 모델에 대한 함수 역할 형식의 전체 목록은 함수 역할 형식 선언 사용을 참조 하세요.
C/C++에 대한 코드 분석 실행
소스 코드가 준비되었는지 여부를 확인하려면 Visual Studio에서 코드 분석 도구를 실행합니다. 코드 분석 도구는 SDV에 필요한 함수 역할 형식 선언을 확인합니다. 코드 분석 도구를 사용하면 누락되었을 수 있는 함수 선언을 식별하거나 함수 정의의 매개 변수가 함수 역할 형식의 매개 변수와 일치하지 않을 때 경고할 수 있습니다.
- Visual Studio에서 드라이버 프로젝트를 엽니다.
- 빌드 메뉴에서 솔루션에서 코드 분석 실행을 클릭합니다.
결과는 코드 분석 창에 표시됩니다. 누락되었을 수 있는 함수 선언을 수정합니다. 솔루션을 빌드할 때마다 실행되도록 코드 분석 도구를 구성할 수도 있습니다.
다음 표에서는 코드 분석 도구가 드라이버 코드에서 찾을 수 있는 몇 가지 경고를 보여 줍니다. 정적 드라이버 검증 도구를 실행하려면 드라이버에 이러한 결함이 없어야 합니다.
C/C++ 경고에 대한 코드 분석 설명 C28101 드라이버 모듈은 현재 함수를 <function-type> 함수로 유추했습니다. C28022 이 함수의 함수 클래스가 정의에 사용된 typedef의 함수 클래스와 일치하지 않습니다. C28023 할당되거나 전달되는 함수에는 하나 이상의 클래스에 대한 _Function_class_ 주석이 있어야 합니다. C28024 할당 중인 함수 포인터에 함수 클래스로 주석이 추가되었는데 이 클래스는 함수 클래스 목록에 포함되지 않습니다. C28169 디스패치 함수 <함수> 에 _Dispatch_type_ 주석이 없습니다. C28208 함수 서명이 함수 선언과 일치하지 않음
정적 드라이버 검증 도구 실행
Visual Studio에서 드라이버 프로젝트(.vcxProj) 파일을 엽니다. 드라이버 메뉴에서 정적 드라이버 검증 도구 시작...을 클릭합니다.
정적 드라이버 검증 도구가 분석을 수행하는 시기를 제어, 구성 및 예약할 수 있는 정적 드라이버 검증 도구 애플리케이션이 열립니다.
드라이버에 라이브러리가 포함된 경우 라이브러리 탭을 클릭하고 라이브러리 추가를 클릭하여 라이브러리를 추가합니다.
라이브러리 소스 코드의 디렉터리로 이동하여 프로젝트 파일(.vcxProj)을 선택합니다. 드라이버에 포함된 모든 라이브러리를 추가합니다. SDV가 드라이버를 분석하기 전에 라이브러리를 추가해야 합니다. 드라이버 분석을 시작하면 SDV는 처리되지 않은 라이브러리도 분석합니다. 라이브러리가 처리되면 전역 SDV 캐시에 저장됩니다. 자세한 내용은 정적 드라이버 검증 도구의 라이브러리 처리를 참조 하세요.
정적 드라이버 검증 도구에 대한 구성 설정을 확인합니다. 구성 탭을 클릭합니다.
프로젝트 구성 프로젝트 구성에는 Visual Studio에서 선택한 구성 및 플랫폼 설정이 표시됩니다.
리소스 대부분의 경우 기본 설정을 사용할 수 있습니다. SDV가 시간 제한, 포기 또는 스페이스아웃을 보고하는 경우 이러한 설정을 조정하려고 할 수 있습니다. 자세한 내용은 정적 드라이버 검증 도구 문제 해결을 위한 권장 사항을 참조 하세요.
예약 확인이 시작될 시작 시간을 선택합니다. 기본 설정은 기본 탭에서 시작을 클릭한 직후 분석을 시작하는 것입니다. 드라이버의 크기와 복잡성에 따라 정적 분석을 실행하는 데 시간이 오래 걸릴 수 있습니다. 가장 편리한 경우 분석을 시작하도록 예약할 수 있습니다. 예를 들어 하루가 끝날 때입니다.
참고 항목
컴퓨터의 전원 관리 계획을 확인하여 분석 중에 컴퓨터가 절전 모드로 전환되지 않도록 해야 합니다.
분석을 시작할 때 확인할 드라이버 API 사용 규칙을 선택하려면 규칙 탭을 클릭합니다.
정적 드라이버 검증 도구는 분석 중인 드라이버 유형(WDF, WDM, NDIS 또는 Storport)을 검색하고 드라이버 유형에 대한 기본 규칙 집합을 선택합니다. 드라이버에서 SDV를 처음 실행하는 경우 기본 규칙 집합을 실행해야 합니다.
규칙에 대한 자세한 내용은 DDI 준수 규칙을 참조 하세요.
정적 분석을 시작합니다. 주 탭을 클릭하고 시작을 클릭합니다. 시작을 클릭하면 정적 분석이 예약되고 분석이 실행되는 데 시간이 오래 걸릴 수 있음을 알리는 메시지가 표시됩니다. 계속하려면 확인 을 클릭합니다. 분석은 예약할 때 시작됩니다.
결과 보기 및 분석
정적 분석이 진행됨에 따라 SDV는 분석 상태를 보고합니다. 분석이 완료되면 SDV는 결과 및 통계를 보고합니다. 드라이버가 API 사용 규칙을 충족하지 못하면 결과가 결함으로 보고됩니다.
문제가 발생한 경우 SDV는 경고 및 오류 페이지에 해당 문제를 표시합니다. 드라이버 속성 페이지에는 특정 드라이버 속성에 대한 테스트 결과가 표시됩니다. 드라이버 속성 테스트는 분석을 더 한정하기 위해 드라이버 기능을 식별하는 데 사용됩니다. 드라이버 속성 결과를 사용하여 드라이버의 예상 속성 및 지원되는 기능을 확인할 수 있습니다.
정적 드라이버 검증 도구 보고서에서 특정 결함을 보려면 결과 창에서 결함을 클릭합니다. 그러면 규칙 위반에 대한 코드 경로의 추적이 표시되는 추적 뷰어가 열립니다. 자세한 내용은 정적 드라이버 검증 도구 결과 해석을 참조하세요.
참고 항목
정적 드라이버 검증 도구는 분석의 결과와 설정을 유지합니다. 결과를 지우려면 [정리]를 클릭합니다.
정적 드라이버 검증 도구 결과 문제 해결
SDV에서 결함이 발견되지 않았다고 보고하는 경우 주 탭을 확인하여 진입점이 검색되었는지 확인합니다. 드라이버가 함수 역할 형식을 사용하여 함수를 선언하지 않으면 SDV는 드라이버 코드에서 결함을 분석하고 찾을 수 없습니다. 자세한 내용은 함수 역할 형식 선언 사용을 참조 하세요.
SDV가 시간 제한을 보고하거나 유용한 결과를 반환하지 못하는 경우 몇 가지 SDV 구성 옵션을 변경해야 할 수 있습니다. SDV 문제를 해결하는 방법에 대한 자세한 내용은 정적 드라이버 검증 도구 문제 해결을 위한 권장 사항을 참조 하세요.