Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
O processo de modo kernel do Windows fornecido pelo sistema e o gerenciador de threads controlam como os processos e threads são executados no sistema operacional Windows. Entender esse gerenciador é essencial para desenvolvedores de drivers de modo kernel que precisam criar threads, monitorar a criação de processos ou sincronizar o acesso a recursos compartilhados.
O exemplo de driver ObCallback demonstra como usar rotinas de notificação de processo e thread em um driver de modo kernel.
Visão geral de processos e threads
Um processo é um programa de software que está atualmente em execução no Windows e identificado por um ID de processo exclusivo (PID). Dentro de cada processo, um ou mais threads representam as unidades reais de execução que executam o código do programa. Cada thread também tem um ID de thread exclusivo (TID) dentro do seu processo.
Os threads permitem a multitarefa compartilhando o tempo do processador. Em uma máquina de processador único, vários threads podem ser alocados, mas apenas um é executado de cada vez. O processador alterna rapidamente entre threads, criando a ilusão de execução simultânea. Em sistemas com vários processadores, a verdadeira execução paralela ocorre quando threads são executados simultaneamente em processadores diferentes.
O processo de modo kernel do Windows e o gerenciador de threads lidam com a execução de todos os threads em um processo. Se você tem um processador ou mais, muito cuidado deve ser tomado na programação do driver para se certificar de que todos os threads do seu processo são projetados para que, independentemente da ordem em que os threads são manipulados, seu driver funcione corretamente.
Se threads de processos diferentes tentarem usar o mesmo recurso ao mesmo tempo, podem 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.
Rotinas que fornecem uma interface direta para o processo e gerenciador de threads são geralmente prefixadas com as letras "Ps"; por exemplo, PsCreateSystemThread. Para obter uma lista de DDIs do kernel, consulte Kernel do Windows.
Práticas recomendadas para implementar funções callback relacionadas a processos e threads
Este conjunto de diretrizes aplica-se a estas rotinas de retorno de chamada:
- PCREATE_PROCESS_NOTIFY_ROUTINE
- PCREATE_PROCESS_NOTIFY_ROUTINE_EX
- PCREATE_THREAD_NOTIFY_ROUTINE
- PLOAD_IMAGE_NOTIFY_ROUTINE
- POB_PRE_OPERATION_CALLBACK
- POB_POST_OPERATION_CALLBACK
Use estas práticas recomendadas:
- Mantenha as rotinas curtas e simples.
- Não faça chamadas em um serviço de modo de usuário para validar o processo, thread ou imagem.
- Não faça chamadas de registro.
- Não faça chamadas de função de bloqueio e/ou comunicação entre processos (IPC).
- Não sincronize com outros tópicos porque isso pode levar a bloqueios de reentrância.
- Utilize Threads de Trabalho do Sistema para enfileirar tarefas, especialmente as que envolvem:
- APIs lentas ou APIs que chamam para outro processo.
- Qualquer comportamento de bloqueio que possa interromper threads nos serviços principais.
- Se você usar threads de trabalho do sistema, não espere o trabalho ser concluído. Fazer isso derrota o propósito de enfileirar o trabalho a ser concluído de forma assíncrona.
- Seja atencioso com as melhores práticas para o uso da pilha do modo kernel. Para obter exemplos, consulte Como posso evitar que o meu controlador fique sem pilha de modo núcleo? e Principais conceitos e dicas sobre controladores.
Processos do subsistema
A partir do Windows 10, o Subsistema Windows para Linux (WSL) permite que um usuário execute binários Linux ELF64 nativos no Windows, juntamente com outros aplicativos do Windows. Para obter informações sobre a arquitetura WSL e os componentes de modo de usuário e modo kernel necessários para executar os binários, consulte as postagens no blog do Subsistema Windows para Linux .
Um dos componentes é um processo de subsistema que hospeda o binário Linux de modo de usuário não modificado, como /bin/bash. Os processos do subsistema não contêm estruturas de dados associadas aos processos do Win32, como o Process Environment Block (PEB) e o Thread Environment Block (TEB). Para um processo de subsistema, as chamadas do sistema e as exceções do modo de usuário são enviadas para um driver emparelhado.
Aqui estão as alterações nas rotinas do processo e do gerenciador de threads para dar suporte aos processos do 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 em modo kernel podem ser notificados sobre a criação/exclusão de processos de subsistemas registando a sua rotina de notificação de retorno por meio da chamada PsSetCreateProcessNotifyRoutineEx2. Para obter notificações sobre criação/exclusão de threads, 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.