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


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

См. также

STOR_SPINLOCK

StorPortReleaseSpinLock