Gerenciador de Processos e Threads do Windows Kernel-Mode
Um processo é um programa de software que está em execução no Windows. Cada processo tem uma ID, um número que a identifica. Um thread é um objeto que identifica qual parte do programa está em execução. Cada thread tem uma ID, um número que a identifica.
Um processo pode ter mais de um thread. A finalidade de um thread é alocar o tempo do processador. Em um computador com um processador, mais de um thread pode ser alocado, mas apenas um thread pode ser executado por vez. Cada thread é executado apenas um curto período e, em seguida, a execução é passada para o próximo thread, dando ao usuário a ilusão de que mais de uma coisa está acontecendo ao mesmo tempo. Em um computador com mais de um processador, pode ocorrer um verdadeiro multi-threading. Se um aplicativo tiver vários threads, os threads poderão ser executados simultaneamente em processadores diferentes.
O processo de modo kernel do Windows e o gerenciador de threads manipulam a execução de todos os threads em um processo. Independentemente de você ter um processador ou mais, é necessário ter muito cuidado na programação do driver para garantir que todos os threads do processo sejam projetados para que, independentemente da ordem em que os threads sejam tratados, o driver opere corretamente.
Se threads de processos diferentes tentarem usar o mesmo recurso ao mesmo tempo, poderão ocorrer problemas. O Windows fornece várias técnicas para evitar esse problema. A técnica de garantir que threads de processos diferentes não toquem no mesmo recurso é chamada de sincronização. Para obter mais informações sobre sincronização, consulte Técnicas de sincronização.
As rotinas que fornecem uma interface direta para o processo e o gerenciador de threads geralmente são prefixadas com as letras "Ps"; por exemplo, PsCreateSystemThread. Para obter uma lista de DDIs de kernel, consulte Kernel do Windows.
Práticas recomendadas para implementar funções de retorno de chamada relacionadas ao processo e ao thread
Esse conjunto de diretrizes se aplica a essas rotinas de retorno de chamada:
PCREATE_PROCESS_NOTIFY_ROUTINE
PCREATE_PROCESS_NOTIFY_ROUTINE_EX
- Mantenha as rotinas curtas e simples.
- Não faça chamadas em um serviço de modo de usuário para validar o processo, o thread ou a imagem.
- Não faça chamadas do Registro.
- Não faça chamadas de função de bloqueio e/ou comunicação entre processos (IPC).
- Não sincronize com outros threads porque isso pode levar a deadlocks de reentrância.
- Use Threads de Trabalho do Sistema para enfileirar o trabalho especialmente o trabalho envolvendo:
- API ou API lentas que chamam outro processo.
- Qualquer comportamento de bloqueio que possa interromper threads nos principais serviços.
- Se você usar Threads de Trabalho do Sistema, não aguarde a conclusão do trabalho. Isso derrota a finalidade de enfileirar o trabalho a ser concluído de forma assíncrona.
- Considere as práticas recomendadas para o uso da pilha do modo kernel. Para obter exemplos, confira Como fazer impedir que meu driver fique sem pilha no modo kernel? e Conceitos e dicas do Key Driver.
Processos de subsistema
A partir do Windows 10, o WSL (Subsistema do Windows para Linux) permite que um usuário execute binários nativos do Linux ELF64 no Windows, juntamente com outros aplicativos do Windows. Para obter informações sobre a arquitetura WSL e os componentes do modo de usuário e do modo kernel necessários para executar os binários, consulte as postagens no blog do Subsistema do Windows para Linux.
Um dos componentes é um processo de subsistema que hospeda o binário do Linux no modo de usuário não modificado, como /bin/bash. Os processos de subsistema não contêm estruturas de dados associadas a processos do Win32, como PEB (Process Environment Block) e TEB (Thread Environment Block). Para um processo de subsistema, as chamadas do sistema e as exceções do modo de usuário são expedidas para um driver emparelhado.
Aqui estão as alterações nas Rotinas do Gerenciador de Processos e Threads para dar suporte a processos de subsistema:
- O tipo WSL é indicado pelo valor SubsystemInformationTypeWSL na enumeração SUBSYSTEM_INFORMATION_TYPE . Os drivers podem chamar NtQueryInformationProcess e NtQueryInformationThread para determinar o subsistema subjacente. Essas chamadas retornam SubsystemInformationTypeWSL para WSL.
- Outros drivers de modo kernel podem ser notificados sobre a criação/exclusão do processo do subsistema registrando sua rotina de retorno de chamada por meio da chamada PsSetCreateProcessNotifyRoutineEx2 . Para obter notificações sobre a criação/exclusão de thread, os drivers podem chamar PsSetCreateThreadNotifyRoutineEx e especificar PsCreateThreadNotifySubsystems como o tipo de notificação.
- A estrutura PS_CREATE_NOTIFY_INFO foi estendida para incluir um membro IsSubsystemProcess que indica um subsistema diferente do Win32. Outros membros, como FileObject, ImageFileName, CommandLine , indicam informações adicionais sobre o processo do subsistema. Para obter informações sobre o comportamento desses membros, consulte SUBSYSTEM_INFORMATION_TYPE.