다음을 통해 공유


DDI 사용 규칙 집합(KMDF)

드라이버가 KMDF DDI를 올바르게 사용하는지 확인하려면 다음 규칙을 사용합니다.

섹션 내용

항목 Description

BufAfterReqCompletedIoctl

BufAfterReqCompletedIoctl 규칙은 EvtIoDeviceControl 콜백 함수 내에서 I/O 요청이 완료된 후 검색된 I/O 요청 버퍼에 액세스할 수 없음을 지정합니다.

BufAfterReqCompletedIntIoctl

BufAfterReqCompletedIntIoctl 규칙은 요청이 완료된 후 해당 버퍼에 액세스할 수 없음을 지정합니다(EvtIoInternalDeviceControl 콜백 함수 내에서만 해당). 버퍼는 WdfRequestRetrieveOutputBuffer 또는 WdfRequestRetrieveUnsafeUserOutputBuffer 또는 WdfRequestRetrieveInputBuffer 또는 WdfRequestRetrieveUnsafeUserInputBuffer를 호출하여 검색됩니다.

BufAfterReqCompletedIntIoctlA

BufAfterReqCompletedIntIoctlA 규칙은 요청이 완료된 후 해당 버퍼에 액세스할 수 없음을 확인합니다(EvtIoInternalDeviceControl 콜백 내에서만 해당). 버퍼는 WdfRequestRetrieveInputBuffer 또는 WdfRequestRetrieveOutputBuffer 또는 WdfRequestRetrieveUnsafeUserInputBuffer 또는 WdfRequestRetrieveUnsafeUserOutputBuffer를 호출하여 검색되었습니다.

BufAfterReqCompletedIoctlA

BufAfterReqCompletedIoctlA 규칙은 EvtIoDeviceControl 콜백 함수 내에서 I/O 요청이 완료된 후 검색된 I/O 요청 버퍼에 액세스할 수 없음을 지정합니다.

BufAfterReqCompletedRead

BufAfterReqCompletedRead 규칙은 EvtIoRead 콜백 함수 내에서 I/O 요청이 완료된 후 검색된 I/O 요청 버퍼에 액세스할 수 없음을 지정합니다. 가능한 버퍼 액세스 방법으로 사용할 수 있는 14가지 DDI가 있습니다.

BufAfterReqCompletedReadA

BufAfterReqCompletedReadA 규칙은 EvtIoRead 콜백 함수 내에서 I/O 요청이 완료된 후 검색된 I/O 요청 버퍼에 액세스할 수 없음을 지정합니다. 가능한 버퍼 액세스 방법으로 사용할 수 있는 14가지 DDI가 있습니다.

BufAfterReqCompletedWrite

BufAfterReqCompletedWrite 규칙은 EvtIoWrite 콜백 함수 내에서 I/O 요청이 완료된 후 검색된 I/O 요청 버퍼에 액세스할 수 없음을 지정합니다.

BufAfterReqCompletedWriteA

BufAfterReqCompletedWriteA 규칙은 EvtIoWrite 콜백 함수 내에서 I/O 요청이 완료된 후 검색된 I/O 요청 버퍼에 액세스할 수 없음을 지정합니다.

ChildDeviceInitApi

ChildDeviceInitApi 규칙은 드라이버가 자식 디바이스 개체에 대한 WdfDeviceCreate 메서드를 호출하기 전에 자식 디바이스의 경우 프레임워크 디바이스 개체 초기화 메서드를 호출해야 한다고 지정합니다.

ControlDeviceDeleted

ControDeviceDeleted 규칙은 PnP 드라이버가 컨트롤 디바이스 개체를 만드는 경우 드라이버가 언로드하기 전에 정리 콜백 함수 중 하나에서 컨트롤 디바이스 개체를 삭제해야 한다고 지정합니다.

ControlDeviceInitAPI

ControlDeviceInitAPI 규칙은 제어 디바이스에 대한 WDFDEVICE_INIT 구조를 설정하는 WdfControlDeviceInitAllocate 및 기타 모든 디바이스 개체 초기화 DDI를 제어 디바이스에 대해 WdfDeviceCreate 전에 호출해야 한다고 지정합니다.

CtlDeviceFinishInitDeviceAdd

CtlDeviceFinishInitDeviceAdd 규칙은 드라이버가 EvtDriverDeviceAdd 콜백 함수에서 제어 디바이스 개체를 만드는 경우 디바이스를 만든 후 EvtDriverDeviceAdd 콜백 함수에서 종료하기 전에 WdfControlFinishInitializing을 호출해야 한다고 지정합니다. 이 규칙은 PnP가 아닌 드라이버에는 적용되지 않습니다.

CtlDeviceFinishInitDrEntry

CtlDeviceFinishInitDrEntry 규칙은 드라이버가 DriverEntry 콜백 함수에서 제어 디바이스 개체를 만드는 경우 디바이스를 만든 후 EvtDriverDeviceAdd 콜백 함수에서 종료하기 전에 WdfControlFinishInitializing을 호출해야 한다고 지정합니다. 이 규칙은 PnP가 아닌 드라이버에는 적용되지 않습니다.

DeviceCreateFail

DeviceCreateFail 규칙은 WdfDeviceCreate에 대한 호출이 실패할 때 EVT_WDF_DRIVER_DEVICE_ADD 오류 상태 반환하도록 지정합니다.

DeviceInitAllocate

DeviceInitAllocate 규칙은 PDO 디바이스 또는 제어 디바이스 개체의 경우 드라이버가 WdfDeviceCreate를 호출하기 전에 프레임워크 디바이스 개체 초기화 메서드 WdfPdoInitAllocate 또는 WdfControlDeviceInitAllocate를 호출해야 한다고 지정합니다.

DeviceInitAPI

FDO 디바이스의 경우 드라이버가 디바이스 개체에 대한 WdfDeviceCreate 메서드를 호출하기 전에 프레임워크 디바이스 개체 초기화 메서드 및 프레임워크 FDO 초기화 메서드를 호출해야 합니다.

DoubleDeviceInitFree

DoubleDeviceInitFree 규칙은 드라이버가 디바이스 초기화 구조를 두 번 해제해서는 안 되도록 지정합니다.

DriverCreate

DriverCreate 규칙은 KMDF(커널 모드 드라이버 프레임워크)를 사용하는 드라이버가 WdfDriverCreate 메서드를 호출하여 DriverEntry 루틴 내에서 프레임워크 드라이버 개체를 만들어야 한다고 지정합니다.

InitFreeDeviceCallback

InitFreeDeviceCallback 규칙은 드라이버가 새 프레임워크 디바이스 개체를 초기화하는 동안 오류가 발생하고 드라이버가 WdfControlDeviceInitAllocate 호출에서 WDFDEVICE_INIT 구조를 수신한 경우 드라이버가 WdfDeviceInitFree를 호출하도록 지정합니다.

InitFreeDeviceCreate

InitFreeDeviceCreate 규칙은 디바이스 개체 초기화 메서드 중 하나에서 오류가 발생하고 드라이버가 WdfControlDeviceInitAllocate 호출에서 WDFDEVICE_INIT 구조를 수신한 경우 드라이버가 WdfDeviceCreate 대신 WdfDeviceInitFree를 호출하도록 지정합니다.

InitFreeDeviceCreateType2

InitFreeDeviceCreateType2 규칙은 드라이버가 WdfDeviceInitFree를 호출한 후 WdfDeviceCreate를 호출하지 않도록 지정합니다.

InitFreeDeviceCreateType4

InitFreeDeviceCreateType4 규칙은 드라이버가 WdfDeviceCreate를 호출하는 동안 오류가 발생하고 드라이버가 WdfControlDeviceInitAllocate 호출에서 WDFDEVICE_INIT 구조를 수신한 경우 드라이버가 WdfDeviceInitFree를 호출하도록 지정합니다.

InitFreeNull

InitFreeNull 규칙은 WDFDEVICE_INIT 구조체대한 NULL 포인터를 사용하여 PWDFDEVICE_INIT 매개 변수로 수신하는 DDI를 호출할 수 없도록 지정합니다.

MdlAfterReqCompletedIntIoctl

MdlAfterReqCompletedIntIoctl 규칙은 EvtIoInternalDeviceControl 콜백 함수 내에서 I/O 요청이 완료된 후 MDL(메모리 설명자 목록)에 액세스할 수 없음을 지정합니다.

MdlAfterReqCompletedIntIoctlA

MdlAfterReqCompletedIntIoctlA 규칙은 EvtIoInternalDeviceControl 콜백 함수 내에서 I/O 요청이 완료된 후 MDL(메모리 설명자 목록)에 액세스할 수 없음을 지정합니다.

MdlAfterReqCompletedIoctl

MdlAfterReqCompletedIoctl 규칙은 EvtIoDeviceControl 콜백 함수 내에서 I/O 요청이 완료된 후 MDL(메모리 설명자 목록)에 액세스할 수 없하도록 지정합니다.

MdlAfterReqCompletedIoctlA

MdlAfterReqCompletedIoctlA 규칙은 EvtIoDeviceControl 콜백 함수 내에서 I/O 요청이 완료된 후 MDL(메모리 설명자 목록)에 액세스할 수 없음을 지정합니다.

MdlAfterReqCompletedRead

MdlAfterReqCompletedRead 규칙은 EvtIoRead 콜백 함수 내에서 I/O 요청이 완료된 후 검색된 MDL(메모리 설명자 목록) 개체에 액세스할 수 없음을 지정합니다.

MdlAfterReqCompletedReadA

MdlAfterReqCompletedReadA 규칙은 EvtIoRead 콜백 함수 내에서 I/O 요청이 완료된 후 검색된 MDL(메모리 설명자 목록) 개체에 액세스할 수 없음을 지정합니다.

MdlAfterReqCompletedWrite

MdlAfterReqCompletedWrite 규칙은 EvtIoWrite 콜백 함수 내에서 I/O 요청이 완료된 후 검색된 MDL(메모리 설명자 목록) 개체에 액세스할 수 없음을 지정합니다.

MdlAfterReqCompletedWriteA

MdlAfterReqCompletedWriteA 규칙은 EvtIoWrite 콜백 함수 내에서 I/O 요청이 완료된 후 검색된 MDL(메모리 설명자 목록) 개체에 액세스할 수 없음을 지정합니다.

MemAfterReqCompletedIntIoctl

MemAfterReqCompletedIntIoctl 규칙은 EvtIoInternalDeviceControl 콜백 함수 내에서 I/O 요청이 완료된 후 프레임워크 메모리 개체에 액세스할 수 없하도록 지정합니다.

MemAfterReqCompletedIntIoctlA

MemAfterReqCompletedIntIoctlA 규칙은 EvtIoInternalDeviceControl 콜백 함수 내에서 I/O 요청이 완료된 후 프레임워크 메모리 개체에 액세스할 수 없하도록 지정합니다.

MemAfterReqCompletedIoctl

MemAfterReqCompletedIoctl 규칙은 EvtIoDeviceControl 콜백 함수 내에서 I/O 요청이 완료된 후 프레임워크 메모리 개체에 액세스할 수 없하도록 지정합니다.

MemAfterReqCompletedIoctlA

MemAfterReqCompletedIoctlA 규칙은 EvtIoDeviceControl 콜백 함수 내에서 I/O 요청이 완료된 후 프레임워크 메모리 개체에 액세스할 수 없하도록 지정합니다.

MemAfterReqCompletedRead

MemAfterReqCompletedRead 규칙은 I/O 요청이 완료된 후 EvtIoRead 콜백 함수 내에서 프레임워크 메모리 개체에 액세스할 수 없음을 지정합니다.

MemAfterReqCompletedReadA

MemAfterReqCompletedReadA 규칙은 I/O 요청이 완료된 후 EvtIoRead 콜백 함수 내에서 프레임워크 메모리 개체에 액세스할 수 없음을 지정합니다.

MemAfterReqCompletedWrite

MemAfterReqCompletedWrite 규칙은 EvtIoWrite 콜백 함수 내에서 I/O 요청이 완료된 후에는 프레임워크 메모리 개체에 액세스할 수 없하도록 지정합니다.

MemAfterReqCompletedWriteA

MemAfterReqCompletedWriteA 규칙은 I/O 요청이 완료된 후 EvtIoWrite 콜백 함수 내에서 프레임워크 메모리 개체에 액세스할 수 없하도록 지정합니다.

NullCheck

NullCheck 규칙은 드라이버 코드 내의 NULL 값이 드라이버의 뒷부분에서 역참조되지 않는지 확인합니다. 이 규칙은 다음 조건 중 하나가 충족되는 경우 결함을 보고합니다.

  • 나중에 역참조되는 NULL 할당이 있습니다.
  • 나중에 역참조되는 NULL일 수 있는 드라이버의 프로시저에 전역/매개 변수가 있으며, 드라이버에는 포인터의 초기 값이 NULL일 수 있음을 암시하는 명시적 검사 있습니다.

NullCheck 규칙 위반을 사용하면 추적 트리 창에서 가장 관련성이 큰 코드 문이 강조 표시됩니다. 보고서 출력 작업에 대한 자세한 내용은 정적 드라이버 검증 도구 보고서추적 뷰어 이해를 참조하세요.

PdoDeviceInitAPI

PdoDeviceInitAPI 규칙은 드라이버가 PDO에 대해 WdfDeviceCreate를 호출하기 전에 WdfPdoInitAllocate 및 PDO(물리적 디바이스 개체)에 대한 WDFDEVICE_INIT 구조를 설정하는 다른 모든 디바이스 개체 초기화 DDI를 호출해야 한다고 지정합니다.

PdoInitFreeDeviceCallback

PdoInitFreeDeviceCallback 규칙은 드라이버가 프레임워크 디바이스 개체 초기화 함수를 호출할 때 오류가 발생하는 경우 드라이버가 WdfDeviceInitFree를 호출하도록 지정합니다.

PdoInitFreeDeviceCreate

PdoInitFreeDeviceCreate 규칙은 디바이스 개체 초기화 함수 중 하나에서 오류가 발생하고 드라이버가 WdfPdoInitAllocate 호출에서 WDFDEVICE_INIT 구조를 수신한 경우 드라이버가 WdfDeviceCreate 대신 WdfDeviceInitFree를 호출하도록 지정합니다.

PdoInitFreeDeviceCreateType2

PdoInitFreeDeviceCreateType2 규칙은 드라이버가 WdfDeviceInitFree를 호출한 후 WdfDeviceCreate를 호출하지 않도록 지정합니다.

PdoInitFreeDeviceCreateType4

PdoInitFreeDeviceCreateType4 규칙은 드라이버가 WdfDeviceCreate를 호출할 때 오류가 발생하는 경우 드라이버가 WdfDeviceInitFree를 호출하도록 지정합니다.

ControlDeviceInitAllocate

ControlDeviceInitAllocate 규칙은 제어 디바이스 개체의 경우 드라이버가 WdfDeviceCreate를 호출하기 전에 프레임워크 디바이스 개체 초기화 메서드 WdfControlDeviceInitAllocate를 호출해야 한다고 지정합니다.

InputBufferAPI

InputBufferAPI 규칙은 버퍼 검색을 위한 올바른 DDI가 EvtIoRead콜백 함수에 사용되도록 지정합니다. EvtIoRead 콜백 함수 내에서 버퍼 검색을 위해 다음 DPI를 호출할 수 없습니다.

DDI 사용 규칙 집합을 선택하려면

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

  2. 규칙 탭을 클릭합니다. 규칙 집합에서 DDIUsage를 선택합니다.

    Visual Studio 개발자 명령 프롬프트 창에서 기본 규칙 집합을 선택하려면 /검사 옵션을 사용하여 DDIUsage.sdv를 지정합니다. 예를 들면 다음과 같습니다.

    msbuild /t:sdv /p:Inputs="/check:DDIUsage.sdv" mydriver.VcxProj /p:Configuration="Win8 Release" /p:Platform=Win32
    

    자세한 내용은 정적 드라이버 검증 도구로 드라이버의 결함 찾기MSBuild(정적 드라이버 검증 도구 명령)를 참조하세요.