Funzione StorPortAcquireSpinLockEx (storport.h)
La routine StorPortAcquireSpinLockEx acquisisce il blocco di selezione specificato.
Sintassi
ULONG StorPortAcquireSpinLockEx(
PVOID HwDeviceExtension,
STOR_SPINLOCK SpinLock,
PVOID LockContext,
PSTOR_LOCK_HANDLE LockHandle
);
Parametri
HwDeviceExtension
[in] Puntatore all'estensione del dispositivo miniport driver per adattatore.
SpinLock
[in] Specifica un valore enumeratore di tipo STOR_SPINLOCK che specifica il blocco spin da acquisire.
LockContext
[in] Puntatore all'oggetto DPC per il quale viene mantenuto il blocco se SpinLock è impostato su DpcLock. Questo membro deve essere NULL se SpinLock indica un tipo di InterruptLock o StartIoLock.
LockHandle
[in/out] Puntatore a un buffer che, al momento della restituzione, conterrà un handle di blocco. Per rilasciare il blocco, il chiamante deve passare questo handle alla routine StorPortReleaseSpinLock .
Valore restituito
StorPortAcquireSpinLockEx restituisce STOR_STATUS_SUCCESS se il blocco di selezione viene acquisito correttamente. In caso contrario, restituisce un codice di stato, ad esempio uno dei seguenti:
Codice stato | Descrizione |
---|---|
STOR_STATUS_INVALID_PARAMETER | Un parametro non è valido. |
STOR_STATUS_INVALID_IRQL | Il chiamante è in corrispondenza di un IRQL non valido per il tipo di SpinLock che sta tentando di acquisire. |
Commenti
I driver Miniport devono assicurarsi che non tentino di acquisire un blocco già mantenuto o acquisire blocchi in un ordine non corretto. Uno di questi errori comporterà un deadlock del sistema.
Alcuni blocchi vengono mantenuti automaticamente dal driver della porta prima di chiamare le routine di callback del driver miniport. Per ogni routine di callback del driver miniport, la tabella seguente indica il blocco che il driver della porta acquisisce automaticamente prima di chiamare la routine di callback.
Routine del driver Miniport | Blocco di rotazione mantenuto dal driver di porta |
---|---|
HwStorFindAdapter | Nessuno |
HwStorInitialize | Interrupt (miniport fisici), Nessuno (miniport virtuali) |
HwStorInterrupt | Interrompere |
HwMSIInterruptRoutine | Interrompere |
HwStorStartIo | StartIo (miniport fisici solo quando sono richiesti canali <simultanei = 1) |
HwStorBuildIo | Nessuno |
HwStorTimer | Startio, Interrupt (quando il membro SynchronizationModel di PORT_CONFIGURATION_INFORMATION è impostato su StorSynchronizeHalfDuplex) |
HwStorResetBus | Startio, Interrupt (quando il membro SynchronizationModel di PORT_CONFIGURATION_INFORMATION è impostato su StorSynchronizeHalfDuplex) |
HwStorAdapterControl | Nessuno. In Windows Server 2003 il blocco di selezione StartIo è stato mantenuto quando il tipo di controllo è ScsiStopAdapter. |
HwStorUnitControl | Nessuno |
HwStorTracingEnabled | Nessuno |
HwStorPassiveInitializeRoutine | Nessuno |
HwStorDpcRoutine | Nessuno |
HwStorStateChange | Startio, Interrupt (quando il membro SynchronizationModel di PORT_CONFIGURATION_INFORMATION è impostato su StorSynchronizeHalfDuplex) |
I blocchi mantenuti dal driver di porta influiscono sui blocchi che bloccano le routine di callback possono acquisire, perché i blocchi di rotazione devono essere acquisiti nell'ordine seguente:
- DPC o StartIo
- Interrompere
Ad esempio, se il driver della porta acquisisce il blocco di rotazione Interrupt prima di chiamare una routine di callback, tale routine di callback non può più acquisire il blocco di rotazione DPC o StartIo perché i blocchi di rotazione DPC e StartIo sono di un ordine inferiore rispetto al blocco di rotazione Interrupt. D'altra parte, se il driver della porta acquisisce il blocco spin StartIo prima di chiamare una routine di callback, tale routine di callback, quando eseguita, potrebbe comunque acquisire un interrupt o un blocco di rotazione DPC .
La tabella seguente indica i blocchi di rotazione che ogni routine del driver miniport può acquisire. In quei casi in cui la routine del driver miniport deve ottenere sia il blocco di rotazione StartIo che il blocco di rotazione Interrupt , la routine deve sempre acquisire il blocco di rotazione StartIo per primo.
Routine del driver Miniport | Blocchi di rotazione consentiti |
---|---|
HwStorFindAdapter | Nessuno |
HwStorInitialize | Nessuno |
HwStorInterrupt | Nessuno |
HwMSIInterruptRoutine | Nessuno |
HwStorStartIo | DPC, Interrupt. Si noti che StartIo può essere acquisito in un driver miniport virtuale o da un driver miniport fisico che usa più canali simultanei. |
HwStorBuildIo | DPC, StartIo, Interrupt |
HwStorTimer | Interrupt (quando il membro SynchronizationModel di PORT_CONFIGURATION_INFORMATION non è impostato su StorSynchronizeHalfDuplex) |
HwStorResetBus | Interrupt (quando il membro SynchronizationModel di PORT_CONFIGURATION_INFORMATION non è impostato su StorSynchronizeHalfDuplex) |
HwStorAdapterControl | DPC, StartIo, Interrupt. In Windows Server 2003 il blocco di selezione non è consentito quando il tipo di controllo è ScsiStopAdapter. |
HwStorUnitControl | DPC, StartIo, Interrupt |
HwStorTracingEnabled | DPC, StartIo, Interrupt |
HwStorPassiveInitializeRoutine | Nessuno |
HwStorDpcRoutine | DPC, StartIo, Interrupt |
HwStorStateChange | Interrupt (quando il membro SynchronizationModel di PORT_CONFIGURATION_INFORMATION non è impostato su StorSynchronizeHalfDuplex) |
Requisiti
Requisito | Valore |
---|---|
Client minimo supportato | Windows 10, versione 1809 |
Intestazione | Storport.h |