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


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

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

STOR_SPINLOCK

StorPortReleaseSpinLock