Compartilhar via


Gerenciador de processos e threads do modo núcleo do Windows

O gerenciador de processos e threads em modo kernel do Windows fornecido pelo sistema controla como processos e threads são executados no sistema operacional Windows. Entender esse gerente é essencial para desenvolvedores de driver no 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 no modo kernel.

Visão geral de processos e tópicos

Um processo é um programa de software que está sendo executado no Windows e identificado por uma ID de processo exclusiva (PID). Em 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 uma TID (ID de thread) exclusiva em seu processo.

Os threads habilitam a multitarefa compartilhando o tempo do processador. Em um computador de processador único, vários threads podem ser alocados, mas apenas um é executado por vez. O processador alterna rapidamente entre threads, criando a ilusão de execução simultânea. Em sistemas multiprocessador, a execução paralela verdadeira ocorre quando os threads são executados simultaneamente em processadores diferentes.

O processo do 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 seu processo sejam projetados para que, independentemente de qual ordem os threads sejam tratados, seu driver opere corretamente.

Se threads de processos diferentes tentarem usar o mesmo recurso ao mesmo tempo, problemas poderão ocorrer. 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 o gerenciador de threads geralmente são prefixadas com as letras "Ps"; por exemplo, PsCreateSystemThread. Para obter uma lista de DDIs do kernel, consulte o kernel do Windows.

Esse conjunto de diretrizes se aplica a essas rotinas de retorno de chamada:

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, o thread ou a imagem.
  • Não faça chamadas ao Registro do sistema.
  • 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 reentrada.
  • Use os Threads do System Worker para enfileirar o trabalho especialmente envolvendo:
    • APIs lentas ou APIs que chamam para outro processo.
    • Qualquer comportamento de bloqueio que possa interromper threads em serviços principais.
  • Se você usar o System Worker Threads, não aguarde a conclusão do trabalho. Isso derrota o propósito de enfileirar o trabalho a ser concluído de forma assíncrona.
  • Lembre-se das práticas recomendadas para o uso da pilha do modo kernel. Para obter exemplos, veja Como faço para impedir que meu driver fique sem pilha de modo kernel? e Conceitos e Dicas do Key Driver.

Processos de subsistema

A partir do Windows 10, o Subsistema do Windows para Linux (WSL) 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 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 de modo de usuário são enviadas 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 em modo kernel podem ser notificados sobre a criação/exclusão de processos de subsistema por meio da função PsSetCreateProcessNotifyRoutineEx2 ao registrar sua rotina de retorno de chamada. Para obter notificações sobre criação/exclusão de thread, os drivers podem chamar PsSetCreateThreadNotifyRoutineEx e especificar PsCreateThreadNotifySubsystems como o tipo de notificação.

  • A estrutura de 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.