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 |