Einführung in Threaded DPCs

Thread-DPCs sind in Windows Vista und höheren Versionen von Windows verfügbar.

Ein Thread-DPC ist ein DPC, den das System am IRQL gleich PASSIVE_LEVEL ausführt. Thread-DPCs sind standardmäßig aktiviert. Sie können sie jedoch deaktivieren, indem Sie den Registrierungsschlüssel HKLM\System\CCS\Control\SessionManager\Kernel\ThreadDpcEnable auf 0 festlegen. Wenn Thread-DPCs deaktiviert sind, werden sie als normale DPCs ausgeführt.

Ein gewöhnlicher DPC verdrängt die Ausführung aller Threads und kann nicht von einem Thread oder einem anderen DPC entfernt werden. Wenn das System eine große Anzahl gewöhnlicher DPCs in der Warteschlange hat oder einer dieser DPCs für eine lange Zeit ausgeführt wird, bleibt jeder Thread beliebig lange angehalten. Daher erhöht jeder gewöhnliche DPC die Systemlatenz, was die Leistung zeitsensibler Anwendungen wie Audio- oder Videowiedergabe beeinträchtigen kann.

Umgekehrt kann ein Thread-DPC von einem normalen DPC, aber nicht von anderen Threads entfernt werden. Daher sollten Sie threaded DPCs anstelle von gewöhnlichen DPCs verwenden – es sei denn, ein bestimmter DPC darf nicht vorbelastet werden, auch nicht von einem anderen DPC.

Das System stellt Thread-DPCs (und normale DPCs) als KDPC-Strukturen dar. Um eine KDPC-Struktur für einen Thread-DPC zu initialisieren, rufen Sie die KeInitializeThreadedDpc-Routine auf, und übergeben Sie ihr eine CustomThreadedDpc-Routine , die die Aktion des DPC ausführt.

Da eine CustomThreadedDpc-Routine entweder bei PASSIVE_LEVEL oder DISPATCH_LEVEL ausgeführt werden kann, müssen Sie sicherstellen, dass Ihre CustomThreadedDpc-Routine bei beiden IRQLs ordnungsgemäß synchronisiert wird. Weitere Informationen dazu finden Sie unter Synchronisierung und Thread-DPCs.

Darüber hinaus müssen Sie sicherstellen, dass Ihre CustomThreadedDpc-Routine alle Einschränkungen für DISPATCH_LEVEL Code befolgt. Wenn Thread-DPCs aktiviert sind, werden sie unter IRQL = PASSIVE_LEVEL ausgeführt, unterliegen jedoch weiterhin den gleichen Einschränkungen wie normale DPCs. Der gesamte Code, der in einem Thread-DPC ausgeführt wird – einschließlich aller Funktionen, die von der CustomThreadedDpc-Routine aufgerufen werden – muss den Einschränkungen der DPC-Umgebung entsprechen. Code darf beispielsweise keine Synchronisierungsobjekte auf passiver Ebene blockieren, z. B. KEVENT-Objekte. Viele vorhandene Gerätestapel, z. B. Netzwerk und USB, unterstützen keine DPC-Threadverarbeitung, und sie versuchen möglicherweise, zu blockieren, wenn sie erkennen, dass sie bei PASSIVE_LEVEL aufgerufen werden. Aus ähnlichen Gründen unterstützt das Kernelmodustreiberframework (KMDF) keine DPC-Verarbeitung im Thread, und KMDF-Treiber sollten nicht versuchen, DPCs mit Thread zu verwenden. Weitere Informationen zur DPC-Umgebung finden Sie unter Schreiben von DPC-Routinen.

Um der DPC-Warteschlange einen Thread-DPC hinzuzufügen, rufen Sie KeInsertQueueDpc auf. Um einen Thread-DPC aus der Warteschlange zu entfernen, bevor er ausgeführt wird, rufen Sie KeRemoveQueueDpc auf.