Функция 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) |