Windows Kernel-Mode Process 및 Thread Manager

프로세스는 현재 Windows에서 실행 중인 소프트웨어 프로그램입니다. 모든 프로세스에는 ID, ID를 식별하는 숫자가 있습니다. 스레드는 프로그램의 어느 부분이 실행 중인지 식별하는 개체입니다. 각 스레드에는 ID를 식별하는 번호가 있습니다.

프로세스에 둘 이상의 스레드가 있을 수 있습니다. 스레드의 목적은 프로세서 시간을 할당하는 것입니다. 프로세서가 하나 있는 컴퓨터에서는 둘 이상의 스레드를 할당할 수 있지만 한 번에 하나의 스레드만 실행할 수 있습니다. 각 스레드는 짧은 시간만 실행한 다음 실행이 다음 스레드로 전달되어 사용자에게 한 번에 두 개 이상의 일이 일어나고 있다는 환상을 제공합니다. 둘 이상의 프로세서가 있는 컴퓨터에서 진정한 다중 스레딩이 수행됩니다. 애플리케이션에 여러 스레드가 있는 경우 스레드는 다른 프로세서에서 동시에 실행할 수 있습니다.

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(Interprocess Communication) 함수 호출을 수행하지 마세요.
  • 재진입 교착 상태가 발생할 수 있으므로 다른 스레드와 동기화하지 마세요.
  • 시스템 작업자 스레드를 사용하여 특히 다음과 관련된 작업을 큐에 추가합니다.
    • 다른 프로세스를 호출하는 느린 API 또는 API입니다.
    • 핵심 서비스의 스레드를 중단시킬 수 있는 모든 차단 동작입니다.
  • 시스템 작업자 스레드를 사용하는 경우 작업이 완료되기를 기다리지 않습니다. 이렇게 하면 작업을 비동기적으로 완료하도록 큐에 대기하는 목적이 무효화됩니다.
  • 커널 모드 스택 사용에 대한 모범 사례를 고려해야 합니다. 예를 들어 어떻게 할까요? 드라이버가 커널 모드 스택이 부족하지 않도록 하려면? 및 주요 드라이버 개념 및 팁을 참조하세요.

하위 시스템 프로세스

Windows 10 WSL(Linux용 Windows 하위 시스템)을 사용하면 사용자가 다른 Windows 애플리케이션과 함께 Windows에서 네이티브 Linux ELF64 이진 파일을 실행할 수 있습니다. 이진 파일을 실행하는 데 필요한 WSL 아키텍처 및 사용자 모드 및 커널 모드 구성 요소에 대한 자세한 내용은 Linux용 Windows 하위 시스템 블로그의 게시물을 참조하세요.

구성 요소 중 하나는 /bin/bash와 같은 수정되지 않은 사용자 모드 Linux 이진 파일을 호스트하는 하위 시스템 프로세스 입니다. 하위 시스템 프로세스에는 PEB(프로세스 환경 블록) 및 TEB(스레드 환경 블록)와 같은 Win32 프로세스와 연결된 데이터 구조가 포함되지 않습니다. 하위 시스템 프로세스의 경우 시스템 호출 및 사용자 모드 예외가 쌍을 이루는 드라이버로 디스패치됩니다.

다음은 하위 시스템 프로세스를 지원하기 위해 프로세스 및 스레드 관리자 루틴 의 변경 내용입니다.

  • WSL 형식은 SUBSYSTEM_INFORMATION_TYPE 열거형의 SubsystemInformationTypeWSL 값으로 표시됩니다. 드라이버는 NtQueryInformationProcessNtQueryInformationThread 를 호출하여 기본 하위 시스템을 확인할 수 있습니다. 이러한 호출 은 WSL용 SubsystemInformationTypeWSL 을 반환합니다.
  • 다른 커널 모드 드라이버는 PsSetCreateProcessNotifyRoutineEx2 호출을 통해 콜백 루틴을 등록하여 하위 시스템 프로세스 생성/삭제에 대한 알림을 받을 수 있습니다. 스레드 만들기/삭제에 대한 알림을 받으려면 드라이버는 PsSetCreateThreadNotifyRoutineEx를 호출하고 PsCreateThreadNotifySubsystems 를 알림 유형으로 지정할 수 있습니다.
  • PS_CREATE_NOTIFY_INFO 구조체는 Win32 이외의 하위 시스템을 나타내는 IsSubsystemProcess 멤버를 포함하도록 확장되었습니다. FileObject, ImageFileName, CommandLine과 같은 다른 멤버는 하위 시스템 프로세스에 대한 추가 정보를 나타냅니다. 해당 멤버의 동작에 대한 자세한 내용은 SUBSYSTEM_INFORMATION_TYPE.