정적 드라이버 검증 도구를 사용하여 Windows 드라이버의 결함 찾기

SDV(정적 드라이버 검증 도구)는 인터페이스 규칙 집합과 운영 체제 모델을 사용하여 드라이버가 Windows 운영 체제와 올바르게 상호 작용하는지 확인합니다. SDV는 드라이버 코드에서 드라이버의 잠재적 버그를 가리킬 수 있는 결함을 찾습니다.

SDV는 WDM, KMDF, NDIS 또는 Storport 드라이버 모델 중 하나를 준수하는 커널 모드 드라이버를 분석할 수 있습니다. 자세한 내용은 지원되는 드라이버정적 드라이버 검증 도구가 드라이버 또는 라이브러리를 지원하는지 확인을 참조하세요.

소스 코드 준비

 

다음 단계에 따라 분석할 코드를 준비합니다.

  1. 함수 역할 유형을 사용하여 드라이버에서 제공하는 함수 선언

    SDV를 사용하려면 함수 역할 유형 선언을 사용하여 함수를 선언해야 합니다. 예를 들어 DriverEntry 루틴은 DRIVER_INITIALIZE 함수 역할 유형을 사용하여 선언해야 합니다.

    
    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 헤더 파일에서 이미 정의되었기 때문에 콜백 함수를 해당 유형으로 선언하기만 하면 됩니다. 이 경우 DriverEntryDRIVER_INITIALIZE 유형으로 선언합니다. 드라이버 모델에 대한 함수 역할 유형의 전체 목록은 함수 역할 유형 선언 사용을 참조하세요.

  2. C/C++용 코드 분석 실행

    소스 코드가 준비되었는지 확인하려면 Visual Studio에서 코드 분석 도구를 실행합니다. 코드 분석 도구는 SDV에 필요한 함수 역할 유형 선언을 검사합니다. 코드 분석 도구는 누락되었을 수 있는 함수 선언을 식별하고, 함수 정의의 매개 변수가 함수 역할 유형에 있는 매개 변수와 일치하지 않으면 경고를 표시합니다.

    • Visual Studio에서 드라이버 프로젝트를 엽니다.
    • 빌드 메뉴에서 솔루션에서 코드 분석 실행을 클릭합니다.

    코드 분석 창에 결과가 표시됩니다. 누락되었을 수 있는 함수 선언을 모두 수정합니다. 솔루션을 빌드할 때마다 실행되도록 코드 분석 도구를 구성할 수도 있습니다.

    다음 표에서는 코드 분석 도구가 드라이버 코드에서 찾을 수 있는 경고 중 일부를 보여 줍니다. 정적 드라이버 검증 도구를 실행하려면 드라이버에 이러한 결함이 없어야 합니다.

    C/C++ 경고에 대한 코드 분석설명
    C28101드라이버 모듈에서 현재 함수가 <function-type> 함수라고 유추했습니다.
    C28022이 함수의 함수 클래스가 함수 정의에 사용된 typedef의 함수 클래스와 일치하지 않습니다.
    C28023할당 또는 전달되는 함수에 하나 이상의 클래스에 대한 _Function_class_ annotation이 있어야 합니다.
    C28024할당되는 함수 포인터에 주석으로 달린 함수 클래스가 함수 클래스 목록에 없습니다.
    C28169디스패치 함수 <function>에 _Dispatch_type_ annotations가 없습니다.
    C28208함수 서명이 함수 선언과 일치하지 않습니다.

     

정적 드라이버 검증 도구 실행

 

  1. Visual Studio에서 드라이버 프로젝트(.vcxProj) 파일을 엽니다. 드라이버 메뉴에서 정적 드라이버 검증 도구 시작...을 클릭합니다.

    그러면 정적 드라이버 검증 도구 응용 프로그램이 열리며, 여기서 정적 드라이버 검증 도구가 분석을 수행하는 시기를 제어, 구성 및 예약할 수 있습니다.

  2. 드라이버에 라이브러리가 포함된 경우 라이브러리 탭을 클릭한 다음 라이브러리 추가를 클릭하여 라이브러리를 추가합니다.

    라이브러리 소스 코드의 디렉터리로 이동하여 프로젝트 파일(.VcxProj)을 선택합니다. 드라이버에 포함된 라이브러리를 모두 추가합니다. SDV가 드라이버를 분석하기 전에 라이브러리를 추가해야 합니다. 드라이버 분석을 시작하면 SDV가 처리되지 않은 라이브러리도 분석합니다. 라이브러리는 처리된 후 전역 SDV 캐시에 저장됩니다. 자세한 내용은 정적 드라이버 검증 도구의 라이브러리 처리를 참조하세요.

  3. 정적 드라이버 검증 도구의 구성 설정을 확인합니다. 구성 탭을 클릭합니다.

    프로젝트 구성 프로젝트 구성은 Visual Studio에서 선택한 구성 및 플랫폼 설정을 보여 줍니다.

    리소스 대부분의 경우 기본 설정을 사용할 수 있습니다. SDV에서 시간 제한, 포기 또는 공간 제한을 보고하는 경우 이러한 설정을 조정해 볼 수 있습니다. 자세한 내용은 정적 드라이버 검증 도구 문제 해결을 위한 권장 사항을 참조하세요.

    예약 검증을 시작할 시작 시간을 선택합니다. 기본 설정은 기본 탭에서 시작을 클릭한 후 즉시 분석을 시작하는 것입니다. 드라이버 크기와 복잡성에 따라 정적 분석을 실행하는 데 오랜 시간이 걸릴 수 있습니다. 일과가 끝났을 때 등 가장 편리한 시간에 분석이 시작되도록 예약하는 것이 좋습니다.

    참고  컴퓨터의 전원 관리 계획을 검사하여 분석 중에 컴퓨터가 절전 상태로 전환되지 않도록 해야 합니다.
  4. 규칙 탭을 클릭하여 분석을 시작할 때 검증할 드라이버 API 사용 규칙을 선택합니다.

    정적 드라이버 검증 도구는 분석 중인 드라이버 유형(WDF, WDM, NDIS 또는 Storport)을 검색하고 드라이버 유형에 대한 기본 규칙 집합을 선택합니다. 드라이버에서 SDV를 처음 실행하는 경우 기본 규칙 집합을 실행해야 합니다.

    규칙에 대한 자세한 내용은 DDI 준수 규칙을 참조하세요.

  5. 정적 분석을 시작합니다. 기본 탭을 클릭한 다음 시작을 클릭합니다. 시작을 클릭하면 메시지가 표시되어 정적 분석이 예약되었으며 분석을 실행하는 데 오랜 시간이 걸릴 수 있음을 알립니다. 확인을 클릭하여 계속합니다. 예약한 시간에 분석이 시작됩니다.

결과 보기 및 분석

 

정적 분석이 진행됨에 따라 SDV에서 분석 상태를 보고합니다. 분석이 완료되면 SDV에서 결과와 통계를 보고합니다. 드라이버가 API 사용 규칙을 충족하지 않으면 결과가 결함으로 보고됩니다.

문제가 발생한 경우 SDV가 경고오류 페이지에 문제를 표시합니다. 드라이버 속성 페이지에는 특정 드라이버 속성의 테스트 결과가 표시됩니다. 드라이버 속성 테스트는 드라이버 기능을 식별하여 분석의 품질을 높이는 데 사용됩니다. 드라이버 속성 결과를 사용하여 드라이버의 예상 속성과 지원되는 기능을 확인합니다.

정적 드라이버 검증 도구 보고서에서 특정 결함을 보려면 결과 창에서 결함을 클릭합니다. 그러면 규칙 위반에 대한 코드 경로 추적을 표시하는 추적 뷰어가 열립니다. 자세한 내용은 정적 드라이버 검증 도구 결과 해석을 참조하세요.

참고  정적 드라이버 검증 도구는 분석의 결과와 설정을 보유합니다. 결과를 지우려면 정리를 클릭합니다.

정적 드라이버 검증 도구 결과 문제 해결

SDV가 결함을 찾을 수 없다고 보고하면 기본 탭을 검사하여 진입점이 검색되었는지 확인합니다. 드라이버가 함수 역할 유형을 사용하여 함수를 선언하지 않는 경우 SDV에서 드라이버 코드의 결함을 분석하고 찾을 수 없습니다. 자세한 내용은 함수 역할 유형 선언 사용을 참조하세요.

SDV가 시간 제한을 보고하거나 유용한 결과를 반환하지 못하면 몇 가지 SDV 구성 옵션을 변경해야 할 수도 있습니다. SDV 문제 해결 방법에 대한 자세한 내용은 정적 드라이버 검증 도구 문제 해결을 위한 권장 사항을 참조하세요.

관련 항목

정적 드라이버 검증 도구가 드라이버 또는 라이브러리를 지원하는지 확인
함수 역할 유형 선언 사용
정적 드라이버 검증 도구 규칙
코드 분석 도구

 

 

표시: