Introdução aos DPCs threaded
Os DPCs encadeados estão disponíveis no Windows Vista e em versões posteriores do Windows.
Um DPC encadeado é um DPC que o sistema executa em IRQL igual a PASSIVE_LEVEL. Os DPCs encadeados são habilitados por padrão, mas você pode desabilitá-los definindo a chave do Registro HKLM\System\CCS\Control\SessionManager\Kernel\ThreadDpcEnable como zero. Quando os DPCs encadeados são desabilitados, eles são executados como DPCs comuns.
Um DPC comum preempõe a execução de todos os threads e não pode ser precedido por um thread ou por outro DPC. Se o sistema tiver um grande número de DPCs comuns enfileirados ou se um desses DPCs for executado por um longo tempo, cada thread permanecerá em pausa por um longo tempo arbitrariamente. Assim, cada DPC comum aumenta a latência do sistema, o que pode prejudicar o desempenho de aplicativos sensíveis ao tempo, como reprodução de áudio ou vídeo.
Por outro lado, um DPC encadeado pode ser preempido por um DPC comum, mas não por outros threads. Portanto, você deve usar DPCs encadeados em vez de DPCs comuns, a menos que um DPC específico não precise ser preempido, nem mesmo por outro DPC.
O sistema representa DPCs threaded (e DPCs comuns) como estruturas KDPC . Para inicializar uma estrutura KDPC para um DPC encadeado, chame a rotina KeInitializeThreadedDpc e passe uma rotina CustomThreadedDpc que executa a ação do DPC.
Como uma rotina CustomThreadedDpc pode ser executada em PASSIVE_LEVEL ou DISPATCH_LEVEL, você deve garantir que sua rotina CustomThreadedDpc seja sincronizada corretamente em ambas as IRQLs. Para obter mais informações sobre como fazer isso, consulte Sincronização e DPCs encadeados.
Além disso, você deve garantir que sua rotina CustomThreadedDpc obedeça a todas as restrições para DISPATCH_LEVEL código. Se os DPCs encadeados estiverem habilitados, eles serão executados em IRQL = PASSIVE_LEVEL mas ainda estarão sujeitos às mesmas restrições que os DPCs comuns. Todo o código executado em um DPC encadeado, incluindo todas as funções chamadas pela rotina CustomThreadedDpc , deve estar em conformidade com as restrições do ambiente DPC. Por exemplo, o código não deve bloquear objetos de sincronização de nível passivo, como objetos KEVENT. Muitas pilhas de dispositivo existentes, como rede e USB, não dão suporte ao processamento de DPC encadeado e podem tentar bloquear se detectarem que são chamadas em PASSIVE_LEVEL. Por motivos semelhantes, o KMDF (Kernel-Mode Driver Framework ) não dá suporte ao processamento de DPC encadeado e os drivers KMDF não devem tentar usar DPCs encadeados. Para obter mais informações sobre o ambiente DPC, consulte Escrevendo rotinas de DPC.
Para adicionar um DPC encadeado à fila DPC, chame KeInsertQueueDpc. Para remover um DPC encadeado da fila antes de ser executado, chame KeRemoveQueueDpc.