Набор правил использования DDI (NDIS)

Используйте эти правила, чтобы убедиться, что драйвер правильно использует DDIs NDIS.

В этом разделе

Тема Описание

Init_DeRegisterInterrupt

Правило Init_DeRegisterInterrupt указывает, что если NdisMRegisterInterruptEx вызывается по крайней мере один раз во время MPInitilize, NdisMDeregisterInterruptEx должен вызываться по крайней мере один раз в MPHaltEx.

Init_NdisAllocateIoWorkItem

Правило Init_NdisAllocateIoWorkItem указывает, что если NdisAllocateIoWorkItem вызывается по крайней мере один раз во время MiniportInitializeEx, функция NdisFreeIoWorkItem должна:

  • — вызывается по крайней мере один раз в MPHaltEx, если MiniportInitializeEx успешно выполняется.
  • — вызывается в MiniportInitializeEx, если MiniportInitializeEx завершается ошибкой.

Init_RegisterInterrupt

Правило Init_RegisterInterrupt указывает, что регистрация прерываний, которая обычно происходит во время инициализации, должна быть отменена, если в процессе инициализации что-то происходит неправильно или во время остановки драйвера мини-порта.

Если NdisMRegisterInterruptEx вызывается по крайней мере один раз во время MiniportInitializeEx, функция NdisMDeregisterInterruptEx должна вызываться по крайней мере один раз в MiniportHaltEx.

Init_RegisterSG

Правило Init_RegisterSG указывает, что регистрация списка Scatter-Gather (SG), которая обычно происходит во время инициализации, должна быть отменена, если в процессе инициализации или при остановке минипортового драйвера происходит ошибка.

Если NdisMRegisterScatterGatherDma вызывается по крайней мере один раз во время MiniportInitializeEx, функция NdisMDeregisterScatterGatherDma должна вызываться по крайней мере один раз в MiniportHaltEx.

NdisFDeregisterFilterDriver

Драйвер фильтра должен вызывать NdisFDeregisterFilterDriver из подпрограммы FilterDriverUnload .

NdisMDeregisterInterruptEx

После возврата элемента управления NdisMDeregisterInterruptEx драйвер минипорта не может вызвать функцию NdisMSynchronizeWithInterruptEx .

NullCheck

Правило NULLCheck проверяет, что значение NULL в коде драйвера не разыменовывается впоследствии в драйвере. Это правило сообщает о дефекте, если одно из этих условий истинно.

  • Происходит присваивание значения NULL, которое разыменовывается позже.
  • В драйвере есть глобальный или передаваемый параметр процедуры, который может принимать значение NULL и используется позже; там есть явная проверка, которая предполагает, что начальное значение указателя может быть NULL.

При нарушениях правил NullCheck наиболее релевантные операторы кода выделены в области дерева трассировки. Дополнительные сведения о работе с выходными данными отчета см. в отчете средства проверки статических драйверов и понимании средства просмотра трассировки.

Выбор набора правил использования DDI

  1. Выберите проект драйвера (.vcxProj) в Microsoft Visual Studio. В меню драйвера щелкните Запустить средство проверки статических драйверов....

  2. Перейдите на вкладку "Правила ". В разделе "Наборы правил" выберите DDIUsage.

    Чтобы выбрать набор правил по умолчанию в окне командной строки разработчика Visual Studio, укажите DDIUsage.sdv с параметром /check . Рассмотрим пример.

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

    Дополнительные сведения см. в статье Использование средства проверки статических драйверов для поиска дефектов в драйверах и команды средства проверки статических драйверов (MSBuild).