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