다음을 통해 공유


KMDF(경고 규칙 집합)

이러한 규칙을 사용하여 드라이버가 다양한 컨텍스트에서 IRP를 올바르게 처리하고 Microsoft 권장 모범 사례를 따를 수 있는지 확인합니다.

섹션 내용

항목 Description

DeferredRequestCompleted

DeferredRequestCompleted 규칙은 드라이버의 기본 I/O 큐에 제공된 I/O 요청이 콜백 함수에서 완료되지 않고 이후 처리를 위해 지연되는 경우 요청이 프레임워크로 전달되고 전달되지 않는 한 또는 WdfRequestStopAcknowledge 메서드가 호출되지 않는 한 지연 처리 콜백 함수에서 요청을 완료해야 한다고 지정합니다.

DriverAttributeChanged

DriverAttributeChanged 규칙은 드라이버가 KMDF 드라이버의 실행 수준 또는 동기화 scope 변경해서는 안 되도록 지정합니다.

DrvAckIoStop

DrvAckIoStop 규칙은 전원 관리 큐가 전원이 공급되는 동안 드라이버가 보류 중인 요청을 인식하고 드라이버가 그에 따라 보류 중인 요청을 승인, 완료 또는 취소하는지 확인합니다. 자체 관리형 I/O 요청의 경우 드라이버는 EvtDeviceSelfManagedIoSuspend 함수에서 이러한 요청을 올바르게 처리해야 합니다. 전원이 켜진 동안 이러한 요청을 처리하지 못하는 드라이버는 버그 검사 0x9F 발생합니다. DRIVER_POWER_STATE_FAILURE.

EvtIoResumeGetParam

EvtIoResumeGetParam 규칙은 WdfRequestGetParametersEvtIoResumeGetParam 콜백 함수 내에서 호출되지 않도록 지정합니다.

EvtIoStopGetParam

EvtIoStopGetParam 규칙은 WdfRequestGetParametersEvtIoStop 콜백 내에서 호출되지 않는지 확인합니다.

EvtIoStopResume

EvtIoStopResume 규칙은 드라이버가 EvtIoStop 콜백 함수를 등록한 다음 Requeue 매개 변수가 FALSE와 같은 WdfRequestStopAcknowledge를 호출하는 경우 드라이버가 EvtIoResume 콜백 함수를 등록해야 한다고 지정합니다. 프레임워크는 디바이스가 D0 상태로 다시 들어갈 때 EvtIoResume 콜백 함수에 요청을 전달합니다.

EvtSurpriseRemoveNoRequestComplete

EvtSurpriseRemoveNoRequestComplete 규칙은 WDF 드라이버가 EvtDeviceSurpriseRemoval 콜백의 요청을 완료하지 않도록 지정합니다. 대신 자체 관리형 I/O 콜백 함수를 사용해야 합니다. EvtDeviceSurpriseRemoval 콜백은 전원 다운 경로와 동기화되지 않습니다.

FDOPowerPolicyOwnerAPI

FDOPowerPolicyOwnerAPI 규칙은 FDO 드라이버가 전원 정책 소유권을 포기하는 경우 WdfDeviceInitSetPowerPolicyEventCallbacks, WdfDeviceAssignS0IdleSettingsWdfDeviceAssignSxWakeSettings 메서드는 드라이버가 전원 정책 소유자인 실행 경로에서만 호출할 수 있음을 지정합니다. SDV는 이 규칙에 대한 경고를 발행합니다.

NoCancelFromEvtSurpriseRemove

NoCancelFromEvtSurpriseRemove 규칙은 WDF 드라이버가 EvtDeviceSurpriseRemoval 콜백 함수의 요청을 취소하지 않도록 지정합니다. 대신 자체 관리형 I/O 콜백 함수를 사용해야 합니다. EvtDeviceSurpriseRemoval 콜백 함수는 전원 다운 경로와 동기화되지 않습니다.

PagedCodeAtD0

PagedCodeAtD0 규칙은 드라이버가 전원 공급 코드 경로에 있는 콜백 함수 내에서 코드를 페이징 가능으로 표시해서는 안 되도록 지정합니다.

ParentObjectCheck

ParentObjectCheck 규칙은 드라이버가 WDF_OBJECT_ATTRIBUTES 구조를 사용하여 부모 개체를 지정하는 WdfMemoryCreate를 호출하도록 지정합니다. 드라이버가 프레임워크 메모리 개체에 대한 부모 개체를 설정하지 않으면 프레임워크는 드라이버를 기본 부모로 설정하므로 드라이버가 프레임워크 메모리 개체를 명시적으로 삭제하지 않는 한 드라이버 개체가 언로드될 때까지 메모리에 유지됩니다.

ReqNotCanceledLocal

ReqNotCanceledLocal 규칙은 취소 가능으로 표시된 요청이 기본 I/O 큐 콜백 함수에서 완료된 경우 완료하기 전에 I/O 요청에 대해 WdfRequestUnmarkCancelable 메서드를 호출해야 한다고 지정합니다. 요청이 WdfRequestUnmarkCancelable을 호출하기 전에 취소되지 않는 한 I/O 요청을 완료해야 합니다.

ReqSendFail

ReqSendFail 규칙은 WdfRequestSend 메서드가 실패할 수 있는 경우 드라이버가 올바른 완료 상태 설정해야 한다고 지정합니다.

RequestCompletedLocal

RequestCompletedLocal 규칙은 I/O 요청이 EvtIoDefault에서 완료되지 않은 경우 를 지정합니다. EvtIoRead, EvtIoWrite, EvtIoDeviceControlEvtIoInternalDeviceControl 콜백 함수가 있으며, 콜백 함수 내에서 요청에 대해 WdfRequestMarkCancelable이 호출되지 않은 경우 드라이버 코드의 요청 완료에 문제가 있을 수 있습니다.

RequestForUrbXrb

클라이언트 드라이버가 WdfUsbTargetDeviceCreateWithParameters를 호출하고 WDF_USB_DEVICE_CREATE_CONFIG 구조의 클라이언트 계약 버전 USBD_CLIENT_CONTRACT_VERSION_602 지정하는 경우(Windows 8 USB 드라이버 스택의 새로운 기능을 사용) URB를 내부적으로 사용하는 DDI는 다음 사전 조건 중 어느 것이 적용되는 경우에만 URB 컨텍스트를 사용합니다.

SyncReqSend

SyncReqSend 규칙은 동기 특정 KMDF 디바이스 드라이버 인터페이스 메서드를 사용하여 모든 동기 전송 요청이 수행되고 메서드에 0이 아닌 시간 제한 값이 설정되도록 지정합니다.

SyncReqSend2

SyncReqSend2 규칙은 동기 요청 보내기에 0이 아닌 시간 제한 값이 설정되도록 지정합니다.

경고 규칙 집합을 선택하려면

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

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

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

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

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