Функция StorPortAcquireSpinLock (storport.h)

Подпрограмма StorPortAcquireSpinLock получает указанную блокировку спина.

Синтаксис

void StorPortAcquireSpinLock(
  [in]     PVOID             DeviceExtension,
  [in]     STOR_SPINLOCK     SpinLock,
  [in]     PVOID             LockContext,
  [in/out] PSTOR_LOCK_HANDLE LockHandle
);

Параметры

[in] DeviceExtension

Указатель на расширение драйвера мини-порта для каждого адаптера.

[in] SpinLock

Задает значение перечислителя типа STOR_SPINLOCK , указывающее получаемую блокировку спина. Для этой функции SpinLock должен иметь один из следующих значений: DpcLock, StartIoLock или InterruptLock. Вызовите StorportAcquireSpinLockEx , чтобы получить другие типы спиновых блокировок.

[in] LockContext

Указатель на объект DPC, для которого удерживается блокировка, если для SpinLock задано значение DpcLock. Этот элемент должен иметь значение NULL, если SpinLock указывает тип ПрерываниеLock или StartIoLock.

[in/out] LockHandle

Указатель на буфер, который при возврате будет содержать дескриптор блокировки. Чтобы освободить блокировку, вызывающий объект должен передать этот дескриптор подпрограмме StorPortReleaseSpinLock .

Возвращаемое значение

None

Remarks

Водители минипорта должны убедиться, что они не пытаются получить блокировку, которая уже удерживается, или получить блокировки в неправильном порядке. Любая из этих ошибок приведет к взаимоблокировке системы.

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

Подпрограмма для водителя минипорта Спин-блокировка, удерживаемая драйвером порта
HwStorFindAdapter None
HwStorInitialize Прерывание (физические минипорты), None (виртуальные минипорты)
HwStorInterrupt Прервать
HwMSIInterruptRoutine Прервать
HwStorStartIo StartIo (физические минипорты только при запросе параллельных каналов <= 1)
HwStorBuildIo None
HwStorTimer Startio, Прерывание (если элемент SynchronizationModelPORT_CONFIGURATION_INFORMATION имеет значение StorSynchronizeHalfDuplex)
HwStorResetBus Startio, Прерывание (если элемент SynchronizationModelPORT_CONFIGURATION_INFORMATION имеет значение StorSynchronizeHalfDuplex)
HwStorAdapterControl Нет. (В Windows Server 2003 блокировка спина StartIo удерживалась, если тип элемента управления — ScsiStopAdapter.)
HwStorUnitControl None
HwStorTracingEnabled None
HwStorPassiveInitializeRoutine None
HwStorDpcRoutine None
HwStorStateChange Startio, Прерывание (если элемент SynchronizationModelPORT_CONFIGURATION_INFORMATION имеет значение StorSynchronizeHalfDuplex)

Блокировки, удерживаемые драйвером порта, влияют на блокировку процедур обратного вызова, так как спин-блокировки должны быть получены в следующем порядке:

  • DPC или StartIo
  • Прервать

Например, если драйвер порта получает блокировку прерывания перед вызовом процедуры обратного вызова, эта подпрограмма обратного вызова больше не сможет получить блокировку спина DPC или StartIo , так как блокировки спина DPC и StartIo имеют более низкий порядок, чем блокировка прерывания спина. С другой стороны, если драйвер порта получает спин-блокировку StartIo перед вызовом подпрограммы обратного вызова, эта процедура обратного вызова при выполнении может по-прежнему получить блокировку прерывания или спина DPC .

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

Подпрограмма для водителя минипорта Разрешенные блокировки спина
HwStorFindAdapter None
HwStorInitialize None
HwStorInterrupt None
HwMSIInterruptRoutine None
HwStorStartIo DPC, прерывание. Обратите внимание, что StartIo можно получить в виртуальном драйвере мини-порта или из физического драйвера мини-порта, использующего несколько параллельных каналов.
HwStorBuildIo DPC, StartIo, Прерывание
HwStorTimer Прерывание (если элемент SynchronizationModelPORT_CONFIGURATION_INFORMATION не имеет значение StorSynchronizeHalfDuplex)
HwStorResetBus Прерывание (если элемент SynchronizationModelPORT_CONFIGURATION_INFORMATION не имеет значение StorSynchronizeHalfDuplex)
HwStorAdapterControl DPC, StartIo, Прерывание. (В Windows Server 2003 блокировка спина не допускается, если тип элемента управления — ScsiStopAdapter.)
HwStorUnitControl DPC, StartIo, Прерывание
HwStorTracingEnabled DPC, StartIo, Прерывание
HwStorPassiveInitializeRoutine None
HwStorDpcRoutine DPC, StartIo, Прерывание
HwStorStateChange Прерывание (если элемент SynchronizationModelPORT_CONFIGURATION_INFORMATION не имеет значение StorSynchronizeHalfDuplex)

Требования

Требование Значение
Целевая платформа Универсальное
Верхняя часть storport.h (включая Storport.h)
Правила соответствия DDI StorPortSpinLock(storport), StorPortSpinLock3(storport), StorPortSpinLock4(storport)

См. также раздел

STOR_SPINLOCK

StorPortReleaseSpinLock