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

PCREATE_THREAD_NOTIFY_ROUTINE

PLOAD_IMAGE_NOTIFY_ROUTINE

POB_PRE_OPERATION_CALLBACK

POB_POST_OPERATION_CALLBACK

  • 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.