Поделиться через


Диспетчер процессов и потоков Windows Kernel-Mode

Процесс — это программная программа, которая в настоящее время выполняется в Windows. Каждый процесс имеет идентификатор, число, идентифицирующее его. Поток — это объект, определяющий, какая часть программы выполняется. Каждый поток имеет идентификатор , число, которое идентифицирует его.

Процесс может содержать несколько потоков. Цель потока — выделить время процессора. На компьютере с одним процессором можно выделить несколько потоков, но одновременно может выполняться только один поток. Каждый поток выполняется только в течение короткого времени, а затем выполнение передается следующему потоку, создавая у пользователя иллюзию, что одновременно происходит несколько событий. На компьютере с несколькими процессорами может выполняться истинное многопоточное использование. Если приложение содержит несколько потоков, потоки могут выполняться одновременно на разных процессорах.

Процесс в режиме ядра Windows и диспетчер потоков обрабатывают выполнение всех потоков в процессе. Независимо от того, имеется ли у вас один или несколько процессоров, необходимо проявлять большую осторожность при программировании драйверов, чтобы убедиться, что все потоки спроектированы таким образом, чтобы независимо от того, в каком порядке обрабатываются потоки, ваш драйвер будет работать правильно.

Если потоки из разных процессов пытаются использовать один и тот же ресурс одновременно, могут возникнуть проблемы. Windows предоставляет несколько методов, чтобы избежать этой проблемы. Метод, обеспечивающий, чтобы потоки из разных процессов не касались одного и того же ресурса, называется синхронизацией. Дополнительные сведения о синхронизации см. в разделе Методы синхронизации.

Подпрограммы, предоставляющие прямой интерфейс для диспетчера процессов и потоков, обычно имеют префикс "Ps"; например , PsCreateSystemThread. Список DDIs ядра см. в разделе Ядро Windows.

Рекомендации по реализации функций обратного вызова, связанных с процессами и потоками

Этот набор рекомендаций применяется к следующим подпрограммам обратного вызова:

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

  • Держите процедуры короткими и простыми.
  • Не вызывайте службу пользовательского режима для проверки процесса, потока или образа.
  • Не делайте вызовы реестра.
  • Не делайте блокирующие и (или) вызовы функций межпроцессного взаимодействия (IPC).
  • Не синхронизируйте с другими потоками, так как это может привести к взаимоблокировке повторного входа.
  • Использование системных рабочих потоков для работы в очереди, особенно в том, что касается:
    • Медленные API или API, которые вызывают другой процесс.
    • Любая блокировка, которая может прерывать потоки в основных службах.
  • Если вы используете системные рабочие потоки, не дожидайтесь завершения работы. Это не позволяет ставить в очередь работу, выполняемую асинхронно.
  • Учитывайте рекомендации по использованию стека в режиме ядра. Примеры см. в разделах Разделы справки не использовать драйвер в режиме ядра? и Основные понятия и советы по драйверам.

Подсистемные процессы

Начиная с Windows 10, подсистема Windows для Linux (WSL) позволяет пользователю запускать собственные двоичные файлы Linux ELF64 в Windows вместе с другими приложениями Windows. Сведения об архитектуре WSL и компонентах пользовательского режима и режима ядра, необходимых для запуска двоичных файлов, см. в записях блога подсистема Windows для Linux.

Одним из компонентов является процесс подсистемы , в котором размещается неизмененные двоичные файлы Linux в пользовательском режиме, например /bin/bash. Процессы подсистемы не содержат структур данных, связанных с процессами Win32, таких как блок среды обработки (PEB) и блок среды потока (TEB). Для процесса подсистемы системные вызовы и исключения пользовательского режима отправляются в связанный драйвер.

Ниже приведены изменения в подпрограммах Process и Thread Manager для поддержки процессов подсистемы.

  • Тип WSL обозначается значением SubsystemInformationTypeWSL в перечислении SUBSYSTEM_INFORMATION_TYPE . Драйверы могут вызывать NtQueryInformationProcess и NtQueryInformationThread для определения базовой подсистемы. Эти вызовы возвращают SubsystemInformationTypeWSL для WSL.
  • Другие драйверы режима ядра могут получать уведомления о создании или удалении процесса подсистемы, регистрируя свою подпрограмму обратного вызова с помощью вызова PsSetCreateProcessNotifyRoutineEx2 . Чтобы получать уведомления о создании и удалении потоков, драйверы могут вызывать PsSetCreateThreadNotifyRoutineEx и указывать PsCreateThreadNotifySubsystems в качестве типа уведомления.
  • Структура PS_CREATE_NOTIFY_INFO была расширена, включив в него элемент IsSubsystemProcess , указывающий на подсистему, отличающуюся от Win32. Другие элементы, такие как FileObject, ImageFileName, CommandLine , указывают дополнительные сведения о процессе подсистемы. Сведения о поведении этих элементов см. в разделе SUBSYSTEM_INFORMATION_TYPE.