Administrador de subprocesos y procesos de Windows Kernel-Mode

Un proceso es un programa de software que se está ejecutando actualmente en Windows. Cada proceso tiene un identificador, un número que lo identifica. Un subproceso es un objeto que identifica qué parte del programa se está ejecutando. Cada subproceso tiene un identificador, un número que lo identifica.

Un proceso puede tener más de un subproceso. El propósito de un subproceso es asignar tiempo de procesador. En una máquina con un procesador, se puede asignar más de un subproceso, pero solo se puede ejecutar un subproceso a la vez. Cada subproceso solo ejecuta un breve tiempo y, a continuación, la ejecución se pasa al siguiente subproceso, lo que da al usuario la ilusión de que más de una cosa está ocurriendo a la vez. En una máquina con más de un procesador, se pueden realizar subprocesos múltiples verdaderos. Si una aplicación tiene varios subprocesos, los subprocesos se pueden ejecutar simultáneamente en distintos procesadores.

El proceso en modo kernel de Windows y el administrador de subprocesos controla la ejecución de todos los subprocesos de un proceso. Ya sea que tenga un procesador o más, debe tener mucho cuidado en la programación de controladores para asegurarse de que todos los subprocesos del proceso están diseñados para que, independientemente del orden en que se controlen los subprocesos, el controlador funcionará correctamente.

Si los subprocesos de diferentes procesos intentan usar el mismo recurso al mismo tiempo, pueden producirse problemas. Windows proporciona varias técnicas para evitar este problema. La técnica de asegurarse de que los subprocesos de diferentes procesos no toquen el mismo recurso se denomina sincronización. Para obtener más información sobre la sincronización, consulte Técnicas de sincronización.

Las rutinas que proporcionan una interfaz directa al proceso y al administrador de subprocesos suelen tener el prefijo "Ps"; por ejemplo, PsCreateSystemThread. Para obtener una lista de los DDIS de kernel, consulte Kernel de Windows.

Procedimientos recomendados para implementar funciones de devolución de llamada relacionadas con procesos y subprocesos

Este conjunto de instrucciones se aplica a estas rutinas de devolución de llamada:

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

  • Mantenga las rutinas cortas y sencillas.
  • No realice llamadas a un servicio en modo de usuario para validar el proceso, el subproceso o la imagen.
  • No realice llamadas al Registro.
  • No realice llamadas de función de comunicación interprocesada (IPC) ni de bloqueo.
  • No se sincronice con otros subprocesos porque puede provocar interbloqueos de reentrada.
  • Use subprocesos de trabajo del sistema para poner en cola trabajos especialmente relacionados con:
    • Api lenta o API que llaman a otro proceso.
    • Cualquier comportamiento de bloqueo que pudiera interrumpir los subprocesos en los servicios principales.
  • Si usa subprocesos de trabajo del sistema, no espere a que se complete el trabajo. Al hacerlo, se derrota el propósito de poner en cola el trabajo para completarse de forma asincrónica.
  • Tenga en cuenta los procedimientos recomendados para el uso de la pila del modo kernel. Para obtener ejemplos, consulte Cómo impedir que mi controlador se agote de la pila del modo kernel?y Conceptos y sugerencias clave del controlador.

Procesos del subsistema

A partir de Windows 10, el Subsistema de Windows para Linux (WSL) permite a un usuario ejecutar archivos binarios nativos de Linux ELF64 en Windows, junto con otras aplicaciones de Windows. Para obtener información sobre la arquitectura de WSL y los componentes en modo de usuario y modo kernel necesarios para ejecutar los archivos binarios, consulte las entradas del blog de Subsistema de Windows para Linux.

Uno de los componentes es un proceso de subsistema que hospeda el binario linux en modo de usuario sin modificar, como /bin/bash. Los procesos del subsistema no contienen estructuras de datos asociadas a procesos win32, como bloque de entorno de proceso (PEB) y bloque de entorno de subprocesos (TEB). En el caso de un proceso de subsistema, las llamadas del sistema y las excepciones del modo de usuario se envían a un controlador emparejado.

Estos son los cambios realizados en las rutinas del Administrador de subprocesos y procesos para admitir procesos de subsistema:

  • El tipo WSL se indica mediante el valor SubsystemInformationTypeWSL de la enumeración SUBSYSTEM_INFORMATION_TYPE . Los controladores pueden llamar a NtQueryInformationProcess y NtQueryInformationThread para determinar el subsistema subyacente. Esas llamadas devuelven SubsystemInformationTypeWSL para WSL .
  • Otros controladores de modo kernel pueden recibir notificaciones sobre la creación o eliminación del proceso del subsistema registrando su rutina de devolución de llamada a través de la llamada PsSetCreateProcessNotifyRoutineEx2 . Para obtener notificaciones sobre la creación o eliminación de subprocesos, los controladores pueden llamar a PsSetCreateThreadNotifyRoutineEx y especificar PsCreateThreadNotifySubsystems como el tipo de notificación.
  • La estructura de PS_CREATE_NOTIFY_INFO se ha ampliado para incluir un miembro IsSubsystemProcess que indica un subsistema distinto de Win32. Otros miembros, como FileObject, ImageFileName, CommandLine indican información adicional sobre el proceso del subsistema. Para obtener información sobre el comportamiento de esos miembros, vea SUBSYSTEM_INFORMATION_TYPE.