다음을 통해 공유


C28168

경고 C28168: 디스패치 함수에 이 디스패치 테이블 항목과 일치하는 _Dispatch_type_ 주석이 없습니다.

이 경고는 디스패치 테이블에 할당된 각 함수에 해당 함수가 수행하는 디스패치 작업의 종류를 나타내는 하나 이상의 _Dispatch_type_ 주석으로 주석이 추가되어 있는지 확인하여 정적 드라이버 검증 도구가 지원됩니다. 코드 분석 도구는 함수의 주석이 디스패치 테이블 항목 슬롯과 일치하지 않을 때 이 오류를 보고합니다.

이 결함은 함수에 _Dispatch_type_ 주석을 추가하거나 사용 중인 디스패치 테이블 항목을 수정하여 수정할 수 있습니다.

예제

다음 코드 예제에서는 이 경고를 생성합니다.

DRIVER_DISPATCH SampleCreate;
...
pDo->MajorFunction[IRP_MJ_CREATE] = SampleCreate;
...

다음 코드 예제에서는 이 경고를 방지합니다.

_Dispatch_type_(IRP_MJ_CREATE) DRIVER_DISPATCH SampleCreate;
...
pDo->MajorFunction[IRP_MJ_CREATE] = SampleCreate;
...

코멘트

경우에 따라 이 경고를 표시하지 않을 수 있습니다. 일부 드라이버(예: 필터 드라이버)는 다른 드라이버를 직접 등록한 후 루프 내에 디스패치 루틴을 등록할 수 있습니다.

DriverObject->MajorFunction[IRP_MJ_CREATE]         = DispatchCreate;
DriverObject->MajorFunction[IRP_MJ_READ]           = DispatchRead;
for (Index = 0; Index <= IRP_MJ_MAXIMUM_FUNCTION; Index++)
    {
            DriverObject->MajorFunction[Index] = DispatchPassIrp;
    }

이 예제에서 DispatchPassIrp 함수는 다음 주석을 사용하여 올바르게 선언됩니다.

__drv_dispatchType(IRP_MJ_CREATE_NAMED_PIPE)
__drv_dispatchType(IRP_MJ_QUERY_INFORMATION)
// .... 
//  (additional dispatch type annotations) 
// ....
__drv_dispatchType(IRP_MJ_CREATE_NAMED_PIPE)
    DRIVER_DISPATCH DispatchPassIrp;

이 경우 코드 분석 도구는 다음 오류를 보고합니다.

The function 'DispatchPassIrp' does not have a _Dispatch_type_ annotation matching dispatch table position 'IRP_MJ_CREATE' (0x00):  This can be  corrected either by adding a _Dispatch_type_ annotation to the function declaration or correcting the dispatch table entry being used.

이러한 디스패치 테이블의 루프 사용은 일부 필터 드라이버에서 일반적입니다. 이 경우 정적 분석의 제한이므로 오류 메시지를 무시할 수 있습니다. 코드 분석 도구는 함수의 주석이 디스패치 테이블 항목 슬롯과 일치하지 않을 때 이 오류를 보고합니다. 이 경우 코드 분석 도구는 잘못된 할당을 보고합니다(나중에 실행 취소됨). 그러나 정적 도구에서 잘못된 상태가 나중에 실행 취소된다는 것을 알 수 있는 방법은 없습니다. 이러한 방식으로 할당을 수행하고 나중에 수정하는 경우 경고를 표시하지 않을 수 있습니다.