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) |