Compartir a través de


Función StorPortAcquireSpinLockEx (storport.h)

La rutina StorPortAcquireSpinLockEx adquiere el bloqueo de número especificado.

Sintaxis

ULONG StorPortAcquireSpinLockEx(
  PVOID             HwDeviceExtension,
  STOR_SPINLOCK     SpinLock,
  PVOID             LockContext,
  PSTOR_LOCK_HANDLE LockHandle
);

Parámetros

HwDeviceExtension

[in] Puntero a la extensión de dispositivo por adaptador del controlador de minipuerto.

SpinLock

[in] Especifica un valor de enumerador de tipo STOR_SPINLOCK que especifica el bloqueo de número que se va a adquirir.

LockContext

[in] Puntero al objeto DPC para el que se mantiene el bloqueo si SpinLock está establecido en DpcLock. Este miembro debe ser NULL si SpinLock indica un tipo de InterruptLock o StartIoLock.

LockHandle

[in/out] Un puntero a un búfer que, de vuelta, contendrá un identificador de bloqueo. Para liberar el bloqueo, el autor de la llamada debe pasar este identificador a la rutina StorPortReleaseSpinLock .

Valor devuelto

StorPortAcquireSpinLockEx devuelve STOR_STATUS_SUCCESS si el bloqueo de número se adquiere correctamente. De lo contrario, devuelve un código de estado como uno de los siguientes:

status code Descripción
STOR_STATUS_INVALID_PARAMETER Si se devuelve este valor, significará que el parámetro en cuestión no es válido.
STOR_STATUS_INVALID_IRQL El autor de la llamada está en un IRQL no válido para el tipo de SpinLock que está intentando adquirir.

Comentarios

Los controladores de minipuerto deben asegurarse de que no intenten adquirir un bloqueo que ya está retenido o adquirir bloqueos en un orden incorrecto. Cualquiera de estos errores provocará un interbloqueo del sistema.

El controlador de puerto mantiene automáticamente ciertos bloqueos antes de llamar a las rutinas de devolución de llamada del controlador de miniporte. Para cada rutina de devolución de llamada del controlador de miniporte, la tabla siguiente indica qué bloqueos adquiere el controlador de puerto automáticamente antes de llamar a la rutina de devolución de llamada.

Rutina del controlador miniport Bloqueo de número mantenido por el controlador de puerto
HwStorFindAdapter None
HwStorInitialize Interrupción (minipuertos físicos), None (miniports virtuales)
HwStorInterrupt Interrupción
HwMSIInterruptRoutine Interrupción
HwStorStartIo StartIo (miniportes físicos solo cuando se solicitan canales <simultáneos = 1)
HwStorBuildIo None
HwStorTimer Startio, Interrupt (cuando el miembro SynchronizationModel de PORT_CONFIGURATION_INFORMATION está establecido en StorSynchronizeHalfDuplex)
HwStorResetBus Startio, Interrupt (cuando el miembro SynchronizationModel de PORT_CONFIGURATION_INFORMATION está establecido en StorSynchronizeHalfDuplex)
HwStorAdapterControl Ninguno. (En Windows Server 2003, el bloqueo de número StartIo se mantuvo cuando el tipo de control es ScsiStopAdapter).
HwStorUnitControl None
HwStorTracingEnabled None
HwStorPassiveInitializeRoutine None
HwStorDpcRoutine None
HwStorStateChange Startio, Interrupt (cuando el miembro SynchronizationModel de PORT_CONFIGURATION_INFORMATION está establecido en StorSynchronizeHalfDuplex)

Los bloqueos mantenidos por el controlador de puerto influyen en los bloqueos que bloquean las rutinas de devolución de llamada pueden adquirirse, ya que los bloqueos de número deben adquirirse en el orden siguiente:

  • DPC o StartIo
  • Interrupción

Por ejemplo, si el controlador de puerto adquiere el bloqueo de número de interrupción antes de llamar a una rutina de devolución de llamada, esa rutina de devolución de llamada ya no puede adquirir el bloqueo de número DPC o StartIo porque los bloqueos de número DPC e StartIo tienen un orden inferior al bloqueo de número de interrupción . Por otro lado, si el controlador de puerto adquiere el bloqueo de número StartIo antes de llamar a una rutina de devolución de llamada, esa rutina de devolución de llamada, cuando se ejecuta, podría adquirir un bloqueo de número de interrupción o DPC .

En la tabla siguiente se indica qué bloqueos de número puede adquirir cada rutina de controlador de minipuerto. En aquellos casos en los que la rutina del controlador de miniporte debe obtener el bloqueo de giro StartIo y el bloqueo de giro de interrupción , la rutina siempre debe adquirir primero el bloqueo de giro StartIo .

Rutina del controlador miniport Bloqueos de número permitidos
HwStorFindAdapter None
HwStorInitialize None
HwStorInterrupt None
HwMSIInterruptRoutine None
HwStorStartIo DPC, Interrupción. Tenga en cuenta que StartIo se puede adquirir en un controlador de minipuerto virtual o desde un controlador de miniporte físico que usa varios canales simultáneos.
HwStorBuildIo DPC, StartIo, Interrupt
HwStorTimer Interrupción (cuando el miembro SynchronizationModel de PORT_CONFIGURATION_INFORMATION no está establecido en StorSynchronizeHalfDuplex)
HwStorResetBus Interrupción (cuando el miembro SynchronizationModel de PORT_CONFIGURATION_INFORMATION no está establecido en StorSynchronizeHalfDuplex)
HwStorAdapterControl DPC, StartIo, Interrupt. (En Windows Server 2003, no se permite el bloqueo de número cuando el tipo de control es ScsiStopAdapter).
HwStorUnitControl DPC, StartIo, Interrupt
HwStorTracingEnabled DPC, StartIo, Interrupt
HwStorPassiveInitializeRoutine None
HwStorDpcRoutine DPC, StartIo, Interrupt
HwStorStateChange Interrupción (cuando el miembro SynchronizationModel de PORT_CONFIGURATION_INFORMATION no está establecido en StorSynchronizeHalfDuplex)

Requisitos

Requisito Value
Cliente mínimo compatible Windows 10, versión 1809
Encabezado storport.h

Consulte también

STOR_SPINLOCK

StorPortReleaseSpinLock