Função StorPortAcquireSpinLockEx (storport.h)
A rotina StorPortAcquireSpinLockEx adquire o bloqueio de rotação especificado.
Sintaxe
ULONG StorPortAcquireSpinLockEx(
PVOID HwDeviceExtension,
STOR_SPINLOCK SpinLock,
PVOID LockContext,
PSTOR_LOCK_HANDLE LockHandle
);
Parâmetros
HwDeviceExtension
[in] Ponteiro para a extensão do dispositivo de miniportor por adaptador.
SpinLock
[in] Especifica um valor enumerador do tipo STOR_SPINLOCK que especifica o bloqueio de rotação a ser adquirido.
LockContext
[in] Um ponteiro para o objeto DPC para o qual o bloqueio será mantido se SpinLock estiver definido como DpcLock. Esse membro deverá ser NULL se SpinLock indicar um tipo de InterruptLock ou StartIoLock.
LockHandle
[entrada/saída] Um ponteiro para um buffer que, no retorno, conterá um identificador de bloqueio. Para liberar o bloqueio, o chamador deve passar esse identificador para a rotinaStorPortReleaseSpinLock.
Valor de retorno
StorPortAcquireSpinLockEx retornará STOR_STATUS_SUCCESS se o bloqueio de rotação for adquirido com êxito. Caso contrário, ele retorna um código de status, como um dos seguintes:
Código de status | Descrição |
---|---|
STOR_STATUS_INVALID_PARAMETER | Um parâmetro é inválido. |
STOR_STATUS_INVALID_IRQL | O chamador está em um IRQL inválido para o tipo de SpinLock que ele está tentando adquirir. |
Observações
Os drivers de miniporto devem garantir que eles não tentem adquirir um bloqueio que já está mantido ou adquirir bloqueios em uma ordem incorreta. Qualquer um desses erros resultará em deadlock do sistema.
Determinados bloqueios são mantidos automaticamente pelo driver de porta antes que ele chame as rotinas de retorno de chamada do driver de miniport. Para cada rotina de retorno de chamada do driver de miniporto, a tabela a seguir indica qual bloqueio o driver de porta adquire automaticamente antes de chamar a rotina de retorno de chamada.
Rotina do driver de miniporto | Bloqueio de rotação mantido pelo driver de porta |
---|---|
HwStorFindAdapter | Nenhum |
HwStorInitialize | Interrupção (miniportos físicos), Nenhum (miniportos virtuais) |
HwStorInterrupt | Interromper |
HwMSIInterruptRoutine | Interromper |
HwStorStartIo | StartIo (miniportos físicos somente quando os canais simultâneos solicitados <= 1) |
HwStorBuildIo | Nenhum |
HwStorTimer | Startio, Interrupt (when SynchronizationModel member of PORT_CONFIGURATION_INFORMATION is set to StorSynchronizeHalfDuplex) |
HwStorResetBus | Startio, Interrupt (when SynchronizationModel member of PORT_CONFIGURATION_INFORMATION is set to StorSynchronizeHalfDuplex) |
HwStorAdapterControl | Nenhum. (No Windows Server 2003, o bloqueio de rotação do StartIo foi mantido quando o tipo de controle é ScsiStopAdapter.) |
HwStorUnitControl | Nenhum |
HwStorTracingEnabled | Nenhum |
HwStorPassiveInitializeRoutine | Nenhum |
HwStorDpcRoutine | Nenhum |
HwStorStateChange | Startio, Interrupt (when SynchronizationModel member of PORT_CONFIGURATION_INFORMATION is set to StorSynchronizeHalfDuplex) |
Os bloqueios mantidos pela influência do driver de porta que bloqueia as rotinas de retorno de chamada têm permissão para adquirir, pois os bloqueios de rotação devem ser adquiridos na seguinte ordem:
- DPC ou StartIo
- Interromper
Por exemplo, se o driver de porta adquirir a interrupção bloqueio de rotação antes de chamar uma rotina de retorno de chamada, essa rotina de retorno de chamada não poderá mais adquirir o de DPC ou o bloqueio de rotação do StartIo porque o de DPC e bloqueios de rotação do StartIo são de ordem inferior à interromper bloqueio de rotação. Por outro lado, se o driver de porta adquirir o StartIo bloqueio de rotação antes de chamar uma rotina de retorno de chamada, essa rotina de retorno de chamada, quando executada, ainda poderá adquirir uma interrupção ou um DPC bloqueio de rotação.
A tabela a seguir indica quais bloqueios de rotação cada rotina de driver de miniporto pode adquirir. Nos casos em que a rotina do driver de miniporto deve obter o startio o bloqueio de rotação e o bloqueio de rotação interrupção de, a rotina deve sempre adquirir o StartIo bloqueio de rotação primeiro.
Rotina do driver de miniporto | Bloqueios de rotação permitidos |
---|---|
HwStorFindAdapter | Nenhum |
HwStorInitialize | Nenhum |
HwStorInterrupt | Nenhum |
HwMSIInterruptRoutine | Nenhum |
HwStorStartIo | DPC, interrupção. Observe que o StartIo pode ser adquirido em um driver de miniporto virtual ou em um driver de miniporto físico que usa vários canais simultâneos. |
HwStorBuildIo | DPC, StartIo, Interrupt |
HwStorTimer | Interrupção (quando SynchronizationModel membro do PORT_CONFIGURATION_INFORMATION não é definido como StorSynchronizeHalfDuplex) |
HwStorResetBus | Interrupção (quando SynchronizationModel membro do PORT_CONFIGURATION_INFORMATION não é definido como StorSynchronizeHalfDuplex) |
HwStorAdapterControl | DPC, StartIo, Interrupt. (No Windows Server 2003, o bloqueio sem rotação é permitido quando o tipo de controle é ScsiStopAdapter.) |
HwStorUnitControl | DPC, StartIo, Interrupt |
HwStorTracingEnabled | DPC, StartIo, Interrupt |
HwStorPassiveInitializeRoutine | Nenhum |
HwStorDpcRoutine | DPC, StartIo, Interrupt |
HwStorStateChange | Interrupção (quando SynchronizationModel membro do PORT_CONFIGURATION_INFORMATION não é definido como StorSynchronizeHalfDuplex) |
Requisitos
Requisito | Valor |
---|---|
de cliente com suporte mínimo | Windows 10, versão 1809 |
cabeçalho | storport.h |