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

Vedi anche

STOR_SPINLOCK

StorPortReleaseSpinLock