Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Поставляемый системой диспетчер процессов и потоков в режиме ядра 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.