Функция StorPortAcquireSpinLockEx (storport.h)
Подпрограмма StorPortAcquireSpinLockEx получает указанную блокировку спина.
Синтаксис
ULONG StorPortAcquireSpinLockEx(
PVOID HwDeviceExtension,
STOR_SPINLOCK SpinLock,
PVOID LockContext,
PSTOR_LOCK_HANDLE LockHandle
);
Параметры
HwDeviceExtension
[in] Указатель на расширение устройства драйвера мини-порта для каждого адаптера.
SpinLock
[in] Задает значение перечислителя типа STOR_SPINLOCK , указывающее получаемую блокировку спина.
LockContext
[in] Указатель на объект DPC, для которого удерживается блокировка, если параметр SpinLock имеет значение DpcLock. Этот член должен иметь значение NULL, если SpinLock указывает тип InterruptLock или StartIoLock.
LockHandle
[вход/выход] Указатель на буфер, который при возврате будет содержать маркер блокировки. Чтобы освободить блокировку, вызывающий объект должен передать этот дескриптор в подпрограмму StorPortReleaseSpinLock .
Возвращаемое значение
StorPortAcquireSpinLockEx возвращает STOR_STATUS_SUCCESS, если блокировка спина успешно получена. В противном случае возвращается код состояния, например один из следующих:
Код состояния | Описание |
---|---|
STOR_STATUS_INVALID_PARAMETER | Недопустимый параметр. |
STOR_STATUS_INVALID_IRQL | Вызывающий объект имеет недопустимый irQL для типа SpinLock , который он пытается получить. |
Комментарии
Водители минипорта должны убедиться, что они не пытаются получить блокировку, которая уже удерживается, или получить блокировки в неправильном порядке. Любая из этих ошибок приведет к взаимоблокировке системы.
Некоторые блокировки автоматически удерживаются драйвером порта перед вызовом процедур обратного вызова драйвера минипорта. Для каждой подпрограммы обратного вызова драйвера мини-порта в следующей таблице показано, какие блокировки драйвер порта получает автоматически перед вызовом процедуры обратного вызова.
Подпрограмма драйвера miniport | Спин-блокировка, удерживаемая драйвером порта |
---|---|
HwStorFindAdapter | None |
HwStorInitialize | Прерывание (физические мини-порты), none (виртуальные минипорты) |
HwStorInterrupt | Прервать |
HwMSIInterruptRoutine | Прервать |
HwStorStartIo | StartIo (физические мини-порты только при запросе параллельных каналов <= 1) |
HwStorBuildIo | None |
HwStorTimer | Startio, Interrupt (если элемент SynchronizationModelPORT_CONFIGURATION_INFORMATION имеет значение StorSynchronizeHalfDuplex) |
HwStorResetBus | Startio, Interrupt (если элемент SynchronizationModelPORT_CONFIGURATION_INFORMATION имеет значение StorSynchronizeHalfDuplex) |
HwStorAdapterControl | Нет. (В Windows Server 2003 спиновая блокировка StartIo удерживалась, если тип элемента управления — ScsiStopAdapter.) |
HwStorUnitControl | None |
HwStorTracingEnabled | None |
HwStorPassiveInitializeRoutine | None |
HwStorDpcRoutine | None |
HwStorStateChange | Startio, Interrupt (если элемент SynchronizationModelPORT_CONFIGURATION_INFORMATION имеет значение StorSynchronizeHalfDuplex) |
Блокировки, удерживаемые драйвером порта, влияют на то, какие блокировки могут получать процедуры обратного вызова, так как спин-блокировки должны быть получены в следующем порядке:
- DPC или StartIo
- Прервать
Например, если драйвер порта получает блокировку прерывания спина перед вызовом процедуры обратного вызова, эта подпрограмма обратного вызова больше не сможет получить спиновую блокировку DPC или StartIo , так как спиновые блокировки DPC и StartIo имеют более низкий порядок, чем блокировка прерывания спина. С другой стороны, если драйвер порта получает спиновую блокировку StartIo перед вызовом процедуры обратного вызова, эта процедура обратного вызова при выполнении по-прежнему может получить прерывание или спиновую блокировку DPC .
В следующей таблице показано, какие спин-блокировки может получить каждая подпрограмма драйвера мини-порта. В тех случаях, когда подпрограмма драйвера мини-порта должна получить как блокировку спина StartIo , так и блокировку прерывания спина, подпрограмма всегда должна сначала получить блокировку спина StartIo .
Подпрограмма драйвера miniport | Разрешенные блокировки спина |
---|---|
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) |
Требования
Требование | Значение |
---|---|
Минимальная версия клиента | Windows 10, версия 1809 |
Верхняя часть | storport.h |