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 de dispositivo de miniportor por adaptador.
SpinLock
[in] Especifica um valor de 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 rotina StorPortReleaseSpinLock .
Retornar valor
StorPortAcquireSpinLockEx retornará STOR_STATUS_SUCCESS se o bloqueio de rotação for adquirido com êxito. Caso contrário, ele retornará um código 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 está tentando adquirir. |
Comentários
Os drivers de miniporta devem garantir que eles não tentem adquirir um bloqueio que já esteja 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 de chamar 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 | Interrupção |
HwMSIInterruptRoutine | Interrupção |
HwStorStartIo | StartIo (miniportos físicos somente quando solicitado canais <simultâneos = 1) |
HwStorBuildIo | Nenhum |
HwStorTimer | Startio, Interrupt (quando SynchronizationModel membro do PORT_CONFIGURATION_INFORMATION é definido como StorSynchronizeHalfDuplex) |
HwStorResetBus | Startio, Interrupt (quando SynchronizationModel membro do PORT_CONFIGURATION_INFORMATION é definido como StorSynchronizeHalfDuplex) |
HwStorAdapterControl | Nenhum. (No Windows Server 2003, o bloqueio de rotação StartIo foi mantido quando o tipo de controle é ScsiStopAdapter.) |
HwStorUnitControl | Nenhum |
HwStorTracingEnabled | Nenhum |
HwStorPassiveInitializeRoutine | Nenhum |
HwStorDpcRoutine | Nenhum |
HwStorStateChange | Startio, Interrupt (quando SynchronizationModel membro do PORT_CONFIGURATION_INFORMATION é definido como 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
- Interrupção
Por exemplo, se o driver de porta adquirir o bloqueio de rotação de interrupção antes de chamar uma rotina de retorno de chamada, essa rotina de retorno de chamada não poderá mais adquirir o bloqueio de rotação DPC ou StartIo porque os bloqueios de rotação DPC e StartIo são de uma ordem menor do que o bloqueio de rotação de interrupção . Por outro lado, se o driver de porta adquirir o bloqueio de rotação StartIo 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 bloqueio de rotação DPC .
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 bloqueio de rotação StartIo e o bloqueio de rotação de interrupção , a rotina sempre deve adquirir o bloqueio de rotação StartIo 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 miniporta virtual ou em um driver de miniporto físico que usa vários canais simultâneos. |
HwStorBuildIo | DPC, StartIo, Interrupt |
HwStorTimer | Interrupção (quando o membro SynchronizationModel do PORT_CONFIGURATION_INFORMATION não está definido como StorSynchronizeHalfDuplex) |
HwStorResetBus | Interrupção (quando o membro SynchronizationModel do PORT_CONFIGURATION_INFORMATION não está 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 o membro SynchronizationModel do PORT_CONFIGURATION_INFORMATION não está definido como StorSynchronizeHalfDuplex) |
Requisitos
Requisito | Valor |
---|---|
Cliente mínimo com suporte | Windows 10, versão 1809 |
Cabeçalho | storport.h |