Поделиться через


Набор правил блокировки (Storport)

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

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

Раздел Описание

CancelSpinLock

Правило CancelSpinLock (Storport) проверяет, что за каждым вызовом IoAcquireCancelSpinLock незамедлительно следует вызов IoReleaseCancelSpinLock.

QueuedSpinLock

Правило QueuedSpinLock проверяет, что блокировки спина в очереди в стеке, полученные с помощью KeAcquireInStackQueuedSpinLock , немедленно освобождаются с помощью KeReleaseInStackQueuedSpinLock. Кроме того, в конце процедуры отправки или отмены драйвер не должен удерживать блокировки.

QueuedSpinLockRelease

Это правило проверяет, не вызывает ли драйвер KeReleaseInStackQueuedSpinLock без предварительного получения блокировки через KeAcquireInStackQueuedSpinLock.

Спин

Это правило проверяет, что за вызовом KeAcquireSpinLock следует вызов KeReleaseSpinlock. Если драйвер снова вызывает KeAcquireSpinLockRaiseToDpc или KeAcquireSpinLock перед освобождением блокировки, правило завершается ошибкой. Кроме того, перед выходом из процедуры отправки или отмены драйвер должен снять блокировку спина.

SpinLockDpc

Это правило проверяет, что за вызовом KeAcquireSpinLockRaiseToDpc следует вызов KeReleaseSpinlock. Если драйвер снова вызывает KeAcquireSpinLock или KeAcquireSpinLockRaiseToDpc перед освобождением блокировки, правило завершается ошибкой. Кроме того, перед выходом из процедуры отправки или отмены драйвер должен снять блокировку спина.

SpinLockRelease

Это правило проверяет, что драйвер не пытается освободить блокировку через KeReleaseSpinLock , не получив ее с помощью KeAquireSpinlock или KeAcquireSpinLockRaiseToDpc. Правило проходит, когда полученная спиновая блокировка освобождается.

SpinLockSafe

Это правило проверяет, не вызываются ли подпрограммы IoStartNextPacket и IoCompleteRequest при удержании спин-блокировки. Правило отслеживает количество блокировок спина, удерживаемых в любое время, и если это число не равно 0 при вызове любой из подпрограмм, драйвер не выполняет правило.

StorPortMSILock

Драйверы минипорта необходимы для получения блокировки спина MSI для сообщения, если и только в том случае, если элемент InterruptSynchronizationMode структуры PORT_CONFIGURATION_INFORMATION (Storport) имеет значение InterruptSynchronizePerMessage. Это правило проверяет, что вызовы StorPortAcquireMSISpinLock выполняются только в том случае, если режим синхронизации — InterruptSynchronizePerMessage.

StorPortSpinLock

Это правило проверяет, что блокировки, полученные с помощью StorPortAcquireSpinLock , быстро освобождаются с помощью StorPortReleaseSpinLock. Драйвер мини-порта не выполняет правило, если он пытается получить уже полученную блокировку или пытается освободить блокировку, которую он не получил. Кроме того, в конце процедуры отправки или отмены водитель не должен удерживать блокировки спина.

StorPortSpinLock3

Правило StorPortSpinLock3 проверяет иерархию получения блокировки, описанную в документации по подпрограмме StorPortAcquireSpinLock .

StorPortSpinLock4

Это правило является аналогом выпускаStorPortSpinLock. Это похоже на правило SpinLockRelease .

Выбор набора правил блокировки

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

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

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

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

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