Minidriversynchronisierung
Streaming-Minidriver-Entwickler haben die Möglichkeit, dem Klassentreiber die Synchronisierung zu gestatten. Wenn minidriver sich beim Klassentreiber registrieren, können sie sich für die von der Klasse bereitgestellte Synchronisierung entscheiden, indem sie das Element "TurnOffSynchronization" von HW_INITIALIZATION_DATA auf FALSE festlegen.
Wenn der Klassentreiber die Synchronisierung übernimmt, wird sichergestellt, dass zwei Teile des Minidriver-Codes nie gleichzeitig ausgeführt werden. Der Klassentreiber stellt alle Streamanforderungen in die Warteschlange und übergibt sie einzeln an den Minitreiber.
Ein Zweck dieser Synchronisierung besteht darin, dem Minidriver-Writer zu ersparen, sich mit allen Details der Treibersynchronisierung und anforderungswarteschlangen in einer Multitasking-, Reentrant- und Multiprozessorumgebung befassen zu müssen. Einige Minitreiber sollten sie jedoch nicht verwenden. Im Thema Synchronisierungsbeispiele finden Sie zwei Beispiele, die veranschaulichen, was ein Minidriver in Bezug auf die Synchronisierung tun muss.
Das Deaktivieren der Streamklassensynchronisierung bedeutet, dass alle Anforderungen sofort und asynchron auf den Minidriver im Kontext des übermittelnden Threads bei PASSIVE_LEVEL aufgerufen werden. Ausnahmen von der vorherigen Regel sind HwCancelPacket-, TimeoutHandler- und Timerroutinen. Diese werden bei DISPATCH_LEVEL aufgerufen. Eine letzte Ausnahme ist der Interrupthandler, der bei DIRQL aufgerufen wird.
Wenn die Synchronisierung deaktiviert ist, ist der Minidriver für die Durchführung der Synchronisierung in Übereinstimmung mit dem WDM-Modell verantwortlich. Wenn ein Minidriver bei PASSIVE_LEVEL zurückgerufen wird, kann er durch alle höheren IRQL-Ereignisse wie DPCs oder Interrupts vorenthalten werden. Wenn ein Minidriver bei DISPATCH_LEVEL zurückgerufen wird, kann er später durch Unterbrechungen ersetzt werden. Minidriver-Funktionen, die freigegebene Ressourcen bearbeiten, müssen die Zugriffe synchronisieren.
Mehrere Anforderungen können gleichzeitig an dieselben oder unterschiedliche Streams ausgegeben werden, wenn die Streamklassensynchronisierung deaktiviert ist. Der Minidriver muss seine eigenen Anforderungen in die Warteschlange stellen und jede Hardwaresynchronisierung mit anderen Threads und dem ISR verarbeiten. Drehsperren, Mutexes und KeSynchronizeExecution sind einige der Synchronisierungsobjekte, die zum Streamen von Minidrivern ohne Streamklassensynchronisierung verfügbar sind.