Freigeben über


StorPortAcquireSpinLockEx-Funktion (storport.h)

Die StorPortAcquireSpinLockEx Routine übernimmt die angegebene Drehsperre.

Syntax

ULONG StorPortAcquireSpinLockEx(
  PVOID             HwDeviceExtension,
  STOR_SPINLOCK     SpinLock,
  PVOID             LockContext,
  PSTOR_LOCK_HANDLE LockHandle
);

Parameter

HwDeviceExtension

[in] Zeiger auf den Miniporttreiber pro Adaptergeräteerweiterung.

SpinLock

[in] Gibt einen Enumerationswert vom Typ STOR_SPINLOCK an, der die abzurufende Drehsperre angibt.

LockContext

[in] Ein Zeiger auf das DPC-Objekt, für das die Sperre gehalten wird, wenn SpinLock- auf DpcLock-festgelegt ist. Dieses Element sollte NULL sein, wenn SpinLock- einen Typ von entweder InterruptLock- oder StartIoLock-angibt.

LockHandle

[in/out] Ein Zeiger auf einen Puffer, der im Gegenzug einen Sperrpunkt enthält. Um die Sperre freizugeben, muss der Aufrufer dieses Handle an die StorPortReleaseSpinLock Routine übergeben.

Rückgabewert

StorPortAcquireSpinLockEx gibt STOR_STATUS_SUCCESS zurück, wenn die Drehsperre erfolgreich erworben wurde. Andernfalls wird ein Statuscode wie eine der folgenden zurückgegeben:

Statuscode Beschreibung
STOR_STATUS_INVALID_PARAMETER Ein Parameter ist ungültig.
STOR_STATUS_INVALID_IRQL Der Aufrufer befindet sich bei einem ungültigen IRQL für den Typ SpinLock-, den er erwerben möchte.

Bemerkungen

Miniporttreiber müssen sicherstellen, dass sie nicht versuchen, eine Bereits gehaltene Sperre zu erwerben oder Sperren in einer falschen Reihenfolge zu erwerben. Jeder dieser Fehler führt zu System-Deadlock.

Bestimmte Sperren werden automatisch vom Porttreiber gehalten, bevor sie die Miniporttreiberrückrufroutinen aufruft. Für jede Miniporttreiberrückrufroutine gibt die folgende Tabelle an, welche Sperrungen der Porttreiber automatisch abruft, bevor die Rückrufroutine aufgerufen wird.

Miniport-Treiberroutine Drehsperre, die vom Porttreiber gehalten wird
HwStorFindAdapter Nichts
HwStorInitialize- Interrupt (physische Miniports), None (virtuelle Miniports)
HwStorInterrupt Unterbrechen
HwMSIInterruptRoutine Unterbrechen
HwStorStartIo- StartIo (physische Miniports nur, wenn gleichzeitige Kanäle angefordert <= 1)
HwStorBuildIo- Nichts
HwStorTimer- Startio, Interrupt (wenn SynchronizationModel Member von PORT_CONFIGURATION_INFORMATION auf StorSynchronizeHalfDuplexfestgelegt ist)
HwStorResetBus Startio, Interrupt (wenn SynchronizationModel Member von PORT_CONFIGURATION_INFORMATION auf StorSynchronizeHalfDuplexfestgelegt ist)
HwStorAdapterControl- Nichts. (In Windows Server 2003 wurde die StartIo-Drehsperre gehalten, wenn der Steuertyp ScsiStopAdapter ist.)
HwStorUnitControl- Nichts
HwStorTracingEnabled- Nichts
HwStorPassiveInitializeRoutine Nichts
HwStorDpcRoutine- Nichts
HwStorStateChange- Startio, Interrupt (wenn SynchronizationModel Member von PORT_CONFIGURATION_INFORMATION auf StorSynchronizeHalfDuplexfestgelegt ist)

Die vom Porttreiber gehaltenen Sperren beeinflussen, welche Sperren die Rückrufroutinen erwerben dürfen, da Drehsperren in der folgenden Reihenfolge erworben werden müssen:

  • DPC oder StartIo
  • Unterbrechen

Wenn der Porttreiber z. B. die drehungssperre Interrupt abruft, bevor eine Rückrufroutine aufgerufen wird, kann diese Rückrufroutine die DPC- oder StartIo Spin-Sperre nicht mehr abrufen, da die DPC und StartIo Drehsperren eine niedrigere Reihenfolge haben als die Interrupt Drehsperre. Wenn der Porttreiber dagegen die StartIo Spin lockt, bevor eine Rückrufroutine aufgerufen wird, kann diese Rückrufroutine, wenn sie ausgeführt wird, weiterhin eine Interrupt- oder eine DPC- Spin-Sperre abrufen.

Die folgende Tabelle gibt an, welche Drehsperren jede Miniporttreiberroutine abrufen kann. In diesen Fällen, in denen die Miniporttreiberroutine sowohl die StartIo Spin-Lock als auch die Interrupt Drehsperre abrufen muss, muss die Routine immer zuerst die StartIo Drehsperre abrufen.

Miniport-Treiberroutine Zulässige Drehsperren
HwStorFindAdapter Nichts
HwStorInitialize- Nichts
HwStorInterrupt Nichts
HwMSIInterruptRoutine Nichts
HwStorStartIo- DPC, Interrupt. Beachten Sie, dass StartIo in einem virtuellen Miniporttreiber oder von einem physischen Miniporttreiber erworben werden kann, der mehrere gleichzeitige Kanäle verwendet.
HwStorBuildIo- DPC, StartIo, Interrupt
HwStorTimer- Interrupt (wenn SynchronizationModel Mitglied von PORT_CONFIGURATION_INFORMATION nicht auf StorSynchronizeHalfDuplex-festgelegt ist)
HwStorResetBus Interrupt (wenn SynchronizationModel Mitglied von PORT_CONFIGURATION_INFORMATION nicht auf StorSynchronizeHalfDuplex-festgelegt ist)
HwStorAdapterControl- DPC, StartIo, Interrupt. (In Windows Server 2003 ist keine Drehsperre zulässig, wenn der Steuerelementtyp ScsiStopAdapter ist.)
HwStorUnitControl- DPC, StartIo, Interrupt
HwStorTracingEnabled- DPC, StartIo, Interrupt
HwStorPassiveInitializeRoutine Nichts
HwStorDpcRoutine- DPC, StartIo, Interrupt
HwStorStateChange- Interrupt (wenn SynchronizationModel Mitglied von PORT_CONFIGURATION_INFORMATION nicht auf StorSynchronizeHalfDuplex-festgelegt ist)

Anforderungen

Anforderung Wert
mindestens unterstützte Client- Windows 10, Version 1809
Header- storport.h

Siehe auch

STOR_SPINLOCK

StorPortReleaseSpinLock