Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Beachten Sie bei der Implementierung einer StartIo-Routine die folgenden Punkte:
Eine StartIo-Routine muss ihren Zugriff auf ein physisches Gerät und alle freigegebenen Zustandsinformationen oder Ressourcen synchronisieren, die der Treiber in der Geräteerweiterung mit den anderen Routinen des Treibers verwaltet, die auf dasselbe Gerät, denselben Speicherort oder ressourcen zugreifen.
Wenn die StartIo-Routine das Gerät oder den Status mit dem ISR teilt, muss keSynchronizeExecution verwendet werden, um eine vom Treiber bereitgestellte SynchCritSection-Routine aufzurufen, um das Gerät zu programmieren oder auf den freigegebenen Zustand zuzugreifen. Weitere Informationen finden Sie unter Using Critical Sections.
Wenn die StartIo-Routine den Zustand oder Ressourcen mit anderen Routinen als dem ISR teilt, muss sie den geteilten Zustand oder die Ressourcen mit einem vom Treiber initialisierten Executive-Spinlock schützen, für den der Treiber den Speicher bereitstellt. Weitere Informationen finden Sie unter Spin Locks.
Wenn ein monolithischer Nicht-WDM-Gerätetreiber ein Controllerobjekt einrichtet, kann die Routine StartIo das Controllerobjekt verwenden, um Operationen über ein gemeinsames physisches Gerät mit angeschlossenen (ähnlichen) Geräten zu synchronisieren.
Weitere Informationen finden Sie unter Controllerobjekte .
Sofern ein eng gekoppelter Treiber mit höherer Ebene große DMA-Übertragungsanforderungen für den zugrunde liegenden Gerätetreiber vorsplittet, muss die StartIo-Routine des zugrunde liegenden Gerätetreibers große Übertragungsanforderungen in Teilübertragungsbereiche aufteilen und der Treiber muss eine Abfolge von Teilübertragungs-Geräteoperationen ausführen. Jede partielle Übertragung muss entsprechend den Fähigkeiten der Hardware angepasst werden, um entweder den Funktionen des Treibergeräts oder, für ein untergeordnetes DMA-Gerät, den Funktionen des System-DMA-Controllers zu entsprechen, je nachdem, welche strengeren Einschränkungen unterliegen.
Weitere Informationen zur Verwendung von System- oder Busmaster-DMA finden Sie unter Adapterobjekte und DMA .
Die StartIo-Routine eines Treibers, der DMA verwendet, muss Übertragungen mit einem Adapterobjekt synchronisieren.
Eine StartIo-Routine wird bei IRQL = DISPATCH_LEVEL ausgeführt, wodurch der Satz von Supportroutinen eingeschränkt wird, die aufgerufen werden können.
Eine StartIo-Routine kann z. B. weder auf den auslagerungsfähigen Speicher zugreifen noch diesen zuordnen, und sie kann nicht warten, bis ein Dispatcherobjekt auf den signalierten Zustand festgelegt wird. Andererseits kann eine StartIo-Routine einen vom Treiber zugewiesenen Spinlock mit KeAcquireSpinLockAtDpcLevel und KeReleaseSpinLockFromDpcLevel erwerben und freigeben, die schneller ausgeführt werden als KeAcquireSpinLock und KeReleaseSpinLock.
Weitere Informationen finden Sie unter Verwalten von Hardwareprioritäten und Drehsperren .
Wenn der Treiber IRPs in einem abbruchfähigen Zustand enthält, muss die StartIo-Routine überprüfen, ob das Eingabe-IRP bereits abgebrochen wurde, bevor die Verarbeitung für diese Anforderung auf seinem Gerät beginnt. Weitere Informationen finden Sie unter "Abbrechen von IRPs".