Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Поставляемый системой диспетчер процессов и потоков в режиме ядра Windows контролирует выполнение процессов и потоков в операционной системе Windows. Понимание этого диспетчера важно для разработчиков драйверов в режиме ядра, которые должны создавать потоки, отслеживать создание процесса или синхронизировать доступ к общим ресурсам.
В примере драйвера ObCallback показано, как использовать подпрограммы обработки и уведомлений потока в драйвере режима ядра.
Общие сведения о процессах и потоках
Процесс — это программа программного обеспечения, которая в настоящее время работает в Windows и определяется уникальным идентификатором процесса (PID). В каждом процессе один или несколько потоков представляют фактические единицы выполнения, которые выполняют код программы. Каждый поток также имеет уникальный идентификатор потока (TID) в процессе.
Потоки позволяют выполнять многозадачность путем совместного использования времени процессора. На одном процессоре можно выделить несколько потоков, но одновременно выполняется только один. Процессор быстро переключается между потоками, создавая иллюзию одновременного выполнения. В системах с несколькими процессорами выполняется истинное параллельное выполнение, когда потоки выполняются одновременно на разных процессорах.
Диспетчер процессов и потоков режима ядра Windows управляет выполнением всех потоков в процессе. Независимо от того, имеется ли один процессор или несколько, необходимо соблюдать большую осторожность в программировании драйверов, чтобы убедиться, что все потоки процесса разработаны таким образом, чтобы независимо от порядка обработки потоков, драйвер работает правильно.
Если потоки из разных процессов пытаются использовать один и тот же ресурс одновременно, могут возникнуть проблемы. Windows предоставляет несколько методов, чтобы избежать этой проблемы. Способ убедиться, что потоки из разных процессов не касаются одного ресурса, называется синхронизацией. Дополнительные сведения о синхронизации см. в методах синхронизации.
Подпрограммы, обеспечивающие прямой интерфейс для управляющего процессами и потоками, обычно начинаются с букв "Ps"; например, PsCreateSystemThread. Для списка DDI ядра см. раздел ядра 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, использующие другой процесс.
- Любое поведение блокировки, которое может прервать потоки в основных службах.
- Если вы используете рабочие потоки системы, не ожидайте завершения работы. Это сводит на нет смысл очередности выполнения работы асинхронно.
- Учтите лучшие практики для использования стека в режиме ядра. Примеры см. в разделе Как предотвратить исчерпание стека режима ядра драйвером? и Основные понятия и советы по драйверам.
Процессы подсистемы
Начиная с Windows 10 подсистема Windows для Linux (WSL) позволяет пользователю запускать собственные двоичные файлы Linux ELF64 в Windows, а также другие приложения Windows. Сведения об архитектуре WSL и компонентах пользовательского режима и режима ядра, необходимых для запуска двоичных файлов, см. в блоге подсистемы Windows для Linux.
Одним из компонентов является процесс подсистемы, в котором размещается неизмененный двоичный файл Linux, работающий в пользовательском режиме, например /bin/bash. Процессы подсистемы не содержат структур данных, связанных с процессами Win32, такими как блок среды обработки (PEB) и блок среды потоков (TEB). Для процесса подсистемы системные вызовы и исключения пользовательского режима отправляются в сопряженный драйвер.
Ниже приведены изменения в подпрограммах диспетчера процессов и потоков для поддержки процессов подсистемы:
Тип WSL указывается значением SubsystemInformationTypeWSL в перечислении SUBSYSTEM_INFORMATION_TYPE. Драйверы могут вызывать NtQueryInformationProcess и NtQueryInformationThread для определения базовой подсистемы. Эти вызовы возвращают SubsystemInformationTypeWSL для WSL.
Другие драйверы режима ядра могут получать оповещения о создании и удалении процессов подсистемы, регистрируя свою обратную функцию через вызов PsSetCreateProcessNotifyRoutineEx2. Чтобы получать уведомления о создании и удалении потоков, драйверы могут вызывать PsSetCreateThreadNotifyRoutineExи указать PsCreateThreadNotifySubsystems в качестве типа уведомления.
Структура PS_CREATE_NOTIFY_INFO была расширена для включения члена IsSubsystemProcess , указывающего подсистему, отличной от Win32. Другие члены, такие как FileObject, ImageFileName, CommandLine указывают дополнительные сведения о процессе подсистемы. См. сведения о поведении этих членов в SUBSYSTEM_INFORMATION_TYPE.