Zu berücksichtigende Punkte für StartIo-Routinen
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, die der Treiber in der Geräteerweiterung verwaltet, mit den anderen Routinen des Treibers synchronisieren, die auf dasselbe Gerät, denselben Speicherort oder auf dieselben Ressourcen zugreifen.
Wenn die StartIo-Routine das Gerät oder den Zustand für die ISR freigibt, 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 Verwenden kritischer Abschnitte.
Wenn die StartIo-Routine Zustand oder Ressourcen für andere Routinen als die ISR freigibt, muss sie den freigegebenen Zustand oder die Ressourcen mit einer vom Treiber initialisierten Spin-Sperre schützen, für die der Treiber den Speicher bereitstellt. Weitere Informationen finden Sie unter Spin-Sperren.
Wenn ein monolithischer Nicht-WDM-Gerätetreiber ein Controllerobjekt einrichtet, kann seine StartIo-Routine das Controllerobjekt verwenden, um Vorgänge über ein freigegebenes physisches Gerät mit angeschlossenen (ähnlichen) Geräten zu synchronisieren.
Weitere Informationen finden Sie unter Controllerobjekte .
Es sei denn, ein eng gekoppelter Treiber auf höherer Ebene setzt große DMA-Übertragungsanforderungen für den zugrunde liegenden Gerätetreiber voraus, die StartIo-Routine des zugrunde liegenden Gerätetreibers muss große Übertragungsanforderungen in Teilübertragungsbereiche aufteilen, und der Treiber muss eine Sequenz von Gerätevorgängen mit teilweiser Übertragung durchführen. Jede Teilübertragung muss entsprechend den Funktionen der Hardware dimensioniert werden: entweder den Funktionen des Treibergeräts oder, bei einem untergeordneten DMA-Gerät, den Funktionen des DMA-Systems, je nachdem, was strengere Einschränkungen aufweist.
Weitere Informationen zur Verwendung von System- oder Bus-master DMA finden Sie unter Adapterobjekte und DMA.
Die StartIo-Routine eines Treibers, der DMA verwendet, muss Übertragungen mithilfe eines Adapterobjekts synchronisieren.
Eine StartIo-Routine wird unter IRQL = DISPATCH_LEVEL ausgeführt, wodurch der Satz von Supportroutinen eingeschränkt wird, die aufgerufen werden können.
Beispielsweise kann eine StartIo-Routine weder auf ausgelagerten Speicher zugreifen noch diesen zuordnen, und sie kann nicht warten, bis ein Dispatcherobjekt auf den signalierten Zustand festgelegt wird. Andererseits kann eine StartIo-Routine mit KeAcquireSpinLockAtDpcLevel und KeReleaseSpinLockFromDpcLevel eine vom Treiber zugewiesene Executive Spin-Sperre abrufen und freigeben, die schneller als KeAcquireSpinLock und KeReleaseSpinLock ausgeführt werden.
Weitere Informationen finden Sie unter Verwalten von Hardwareprioritäten und Spinsperren .
Wenn der Treiber IRPs in einem abbruchfähigen Zustand hält, muss seine StartIo-Routine überprüfen, ob der Eingabe-IRP bereits abgebrochen wurde, bevor er mit der Verarbeitung dieser Anforderung auf dem Gerät beginnt. Weitere Informationen finden Sie unter Abbrechen von IRPs.