드라이버 검사
/scan 명령 옵션을 사용하여 드라이버를 검사하는 것은 선택 사항입니다. 드라이버를 확인하기 전에 검사하지 않으면 SDV는 함수 역할 유형 선언을 검사하고 드라이버를 확인할 때 Sdv-map.h 파일을 만듭니다.
이 검사 중에 SDV는 드라이버를 확인하는 데 필요한 드라이버 진입점을 검색하려고 시도합니다. 드라이버의 원본 디렉터리에 만든 파일인 Sdv-map.h에서 검사 결과를 기록합니다.
그러나 검사 단계 후 또는 확인 후에 이 파일을 검토하여 SDV가 올바른 진입점을 검색했는지 확인하는 것이 매우 중요합니다. 진입점이 없거나 잘못된 경우 확인이 신뢰할 수 없을 수 있습니다. 더 중요한 것은 SDV가 진입점을 검색할 수 없는 경우 드라이버를 확인할 수 없다는 것입니다.
각 드라이버에 대해 한 번만 검색하면 됩니다. 이후 SDV는 향후 확인을 위해 드라이버에 대한 Sdv-map.h 파일을 유지합니다.
Sdv-map.h 파일 검사
검사 명령을 실행하거나 드라이버를 확인한 후 Sdv-map.h 파일을 열고 파일을 검사합니다. Sdv-map.h는 서식이 지정된 텍스트 파일입니다. 메모장과 같은 모든 텍스트 편집기를 읽을 수 있습니다.
Sdv-map.h 파일의 내용을 드라이버에 대해 선언된 함수 역할 형식과 비교합니다. Sdv-map.h 파일의 내용을 검사하여 드라이버의 콜백 또는 디스패치 루틴이 올바르게 식별되었는지 확인합니다.
Sdv-map.h 파일은 드라이버의 모든 진입점을 나열할 필요가 없습니다. 분석에 사용되는 IRP 주 함수 코드 또는 함수 역할 형식에 대한 진입점만 있습니다. 파일에 IRP 주 함수 코드 또는 함수 역할 형식을 추가하지 마세요.
Sdv-map.h 파일에 대한 자세한 내용은 Sdv-map.h를 참조하세요. 형식은 Sdv-map.h 파일의 형식에 설명되어 있습니다. Sdv-map.h 파일에 나타날 수 있는 오류는 Sdv-map.h 파일 승인에 설명되어 있습니다.
다음 예제에서는 tools\sdv\samples\fail_drivers\wdm 디렉터리의 샘플 WDM 드라이버인 Fail_driver1 Sdv-map.h 파일의 콘텐츠를 보여 줍니다.
//Approved=false
//DriverAddDevice
#define fun_AddDevice DriverAddDevice
//DriverEntry
#define fun_DriverEntry DriverEntry
//DriverUnload
#define fun_DriverUnload DriverUnload
//CompletionRoutine
#define fun_IO_COMPLETION_ROUTINE_1 CompletionRoutine
//DpcForIsrRoutine
#define fun_IO_DPC_ROUTINE_1 DpcForIsrRoutine
//DispatchCreate
#define fun_IRP_MJ_CREATE DispatchCreate
//DispatchPnp
#define fun_IRP_MJ_PNP DispatchPnp
//DispatchPower
#define fun_IRP_MJ_POWER DispatchPower
//DispatchRead
#define fun_IRP_MJ_READ DispatchRead
//DispatchSystemControl
#define fun_IRP_MJ_SYSTEM_CONTROL DispatchSystemControl
//InterruptServiceRoutine
#define fun_KSERVICE_ROUTINE_1 InterruptServiceRoutine
Sdv-map.h 파일 수정
드라이버를 확인하기 전에 Sdv-map.h 파일의 오류를 수정합니다. SDV는 Sdv-map.h 파일이 잘못되었거나 승인되지 않은 경우에도 드라이버를 확인하지만 확인 결과는 신뢰할 수 없을 수 있습니다. 예를 들어 해당 함수 역할 형식을 사용하여 드라이버의 디스패치 또는 콜백 루틴을 선언하지 않으면 드라이버 루틴이 Sdv-map.h 파일에 표시되지 않습니다. 따라서 SDV는 확인의 일부로 해당 규칙을 지정한 경우에도 함수 역할 형식을 사용하는 규칙을 적용할 수 없는 것으로 간주하므로 코드에서 결함을 찾을 수 없습니다.
Sdv-map.h 파일을 수정하려면 적절한 함수 역할 형식을 사용하여 드라이버의 디스패치 또는 콜백 루틴을 선언해야 합니다. 그런 다음 드라이버를 다시 검사하고 Sdv-map.h 파일에 표시되는지 확인합니다.
Sdv-map.h 파일 승인
Sdv-map.h 파일이 올바른지 확인하면 파일을 승인할 수 있습니다. 파일을 변경하지 않은 경우 승인할 필요가 없습니다.
SDV는 Sdv-map.h 파일이 승인되지 않은 경우에도 드라이버를 확인합니다.
Sdv-map.h 파일을 승인하려면 파일의 첫 번째 줄에서 다음을 변경합니다.
//Approved=false
다음과 같이 변경합니다.
//Approved=true
각 드라이버에 대해 Sdv-map.h 파일을 한 번만 승인하면 됩니다. 그 후 SDV는 향후 확인을 위해 드라이버에 대해 승인된 Sdv-map.h 파일을 유지합니다. SDV가 소스 코드에서 함수 역할 형식 선언을 다시 검사하려면 파일을 삭제하기만 하면 됩니다.
다음 예제에서는 FAIL_DRIVER1 KMDF 샘플 드라이버에 대해 승인된 Sdv-map.h 파일을 보여 줍니다. SDV는 Sdv-map.h 파일을 사용하여 드라이버의 선언된 콜백 함수를 확인에 필요한 함수 역할 유형 SDV와 매핑합니다.
//Approved=true
//DriverEntry
#define fun_DriverEntry DriverEntry
//EvtDriverDeviceAdd
#define fun_WDF_DRIVER_DEVICE_ADD EvtDriverDeviceAdd
//EvtIoDeviceControl
#define fun_WDF_IO_QUEUE_IO_DEVICE_CONTROL EvtIoDeviceControl
//EvtIoInternalDeviceControl
#define fun_WDF_IO_QUEUE_IO_INTERNAL_DEVICE_CONTROL EvtIoInternalDeviceControl
//EvtIoRead
#define fun_WDF_IO_QUEUE_IO_READ EvtIoRead
//EvtRequestCancel
#define fun_WDF_REQUEST_CANCEL_1 EvtRequestCancel