StorPortAcquireSpinLock-Funktion (storport.h)

Die StorPortAcquireSpinLock-Routine ruft die angegebene Spinsperre ab.

Syntax

void StorPortAcquireSpinLock(
  [in]     PVOID             DeviceExtension,
  [in]     STOR_SPINLOCK     SpinLock,
  [in]     PVOID             LockContext,
  [in/out] PSTOR_LOCK_HANDLE LockHandle
);

Parameter

[in] DeviceExtension

Ein Zeiger auf die Geräteerweiterung des Miniporttreibers pro Adapter.

[in] SpinLock

Gibt einen Enumeratorwert vom Typ STOR_SPINLOCK an, der die abzurufende Spinsperre angibt. Für diese Funktion muss SpinLock eine der folgenden Sein: DpcLock, StartIoLock oder InterruptLock. Rufen Sie StorportAcquireSpinLockEx auf, um andere Arten von Spinsperren abzurufen.

[in] LockContext

Ein Zeiger auf das DPC-Objekt, für das die Sperre gehalten wird, wenn SpinLock auf DpcLock festgelegt ist. Dieser Member sollte NULL sein, wenn SpinLock einen Typ von InterruptLock oder StartIoLock angibt.

[in/out] LockHandle

Ein Zeiger auf einen Puffer, der bei der Rückgabe ein Sperrhandle enthält. Zum Freigeben der Sperre muss der Aufrufer dieses Handle an die StorPortReleaseSpinLock-Routine übergeben.

Rückgabewert

Keine

Bemerkungen

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

Bestimmte Sperren werden automatisch vom Porttreiber gehalten, bevor er die Rückrufroutinen des Miniporttreibers aufruft. Für jede Rückrufroutine für Miniporttreiber gibt die folgende Tabelle an, welche Sperren der Porttreiber vor dem Aufrufen der Rückrufroutine automatisch abruft.

Miniporttreiberroutine Vom Porttreiber gehaltene Spin-Sperre
HwStorFindAdapter Keine
HwStorInitialize Interrupt (physische Miniports), Keine (virtuelle Miniports)
HwStorInterrupt Interrupt
HwMSIInterruptRoutine Interrupt
HwStorStartIo StartIo (physische Miniports nur bei Anforderung gleichzeitiger Kanäle <= 1)
HwStorBuildIo Keine
HwStorTimer Startio, Interrupt (wenn SynchronizationModel-Member von PORT_CONFIGURATION_INFORMATION auf StorSynchronizeHalfDuplex festgelegt ist)
HwStorResetBus Startio, Interrupt (wenn SynchronizationModel-Member von PORT_CONFIGURATION_INFORMATION auf StorSynchronizeHalfDuplex festgelegt ist)
HwStorAdapterControl Keine. (In Windows Server 2003 wurde die StartIo-Spinsperre gehalten, wenn der Steuerelementtyp ScsiStopAdapter lautet.)
HwStorUnitControl Keine
HwStorTracingEnabled Keine
HwStorPassiveInitializeRoutine Keine
HwStorDpcRoutine Keine
HwStorStateChange Startio, Interrupt (wenn SynchronizationModel-Member von PORT_CONFIGURATION_INFORMATION auf StorSynchronizeHalfDuplex festgelegt ist)

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

  • DPC oder StartIo
  • Interrupt

Wenn instance der Porttreiber vor dem Aufrufen einer Rückrufroutine die Interrupt-Spinsperre erhält, kann diese Rückrufroutine die DPC- oder StartIo-Spinsperre nicht mehr abrufen, da die DPC- und StartIo-Spinsperren eine niedrigere Reihenfolge aufweisen als die Interrupt-Spinsperre. Wenn der Porttreiber hingegen vor dem Aufrufen einer Rückrufroutine die StartIo-Spinsperre erwirbt, könnte diese Rückrufroutine bei Ausführung dennoch eine Interrupt- oder DPC-Spinsperre abrufen.

In der folgenden Tabelle wird angegeben, welche Drehsperren jede Miniporttreiberroutine abrufen kann. In den Fällen, in denen die Miniporttreiberroutine sowohl die StartIo-Spinsperre als auch die Interrupt-Spinsperre erhalten muss, muss die Routine immer zuerst die StartIo-Spinsperre abrufen.

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

Anforderungen

Anforderung Wert
Zielplattform Universell
Header storport.h (einschließlich Storport.h)
DDI-Complianceregeln StorPortSpinLock(storport), StorPortSpinLock3(storport), StorPortSpinLock4(storport)

Weitere Informationen

STOR_SPINLOCK

StorPortReleaseSpinLock