¿Cuál es el proceso de arranque de Windows 7?


Este proceso de arranque es mayormente idéntico entre Windows Vista y Windows 10. Sin embargo, hay dos variantes que voy a explorar: El arranque Legacy (desde Vista) y el arranque UEFI (desde el 7, realmente soportado desde el 8).

En el arranque Legacy, la BIOS encuentra el disco donde está instalado Windows, lee el MBR, comprueba los 2 últimos bytes si coinciden con un determinado patrón (marca como arrancable), si es así los carga en memoria en una dirección fija y ejecuta el código del primer byte del sector cargado. El código de ese sector decodificará los datos de la partición (también dentro del sector; tiene 446 bytes de código y 4 particiones de 16 bytes cada una), averiguará cuál de ellas es la partición activa, comprobará que ella misma es bootable (misma firma en los dos últimos bytes) y, si es así, la cargará en cadena (en una dirección diferente, supongo). El primer sector del disco es el registro de arranque maestro (MBR), el primero de la partición es el registro de arranque de la partición (PBR).


El PBR puede funcionar con todos sus 510 bytes como código, aunque algunos pueden contener realmente una firma del sistema de archivos. El código intentará cargar un archivo sin comprimir del disco, concretamente "bootmgr". Ese archivo se carga continuamente y, de nuevo, en una dirección fija. Y puede ser tan grande como sea necesario, y de hecho es lo suficientemente grande. Legacy bootmgr loaded, salta a la sección después de cargar bootmgr más abajo.

En el arranque UEFI, el firmware hará:
1) Comprobar las entradas de arranque memorizadas en el hardware, y probarlas todas. Si la primera no se encuentra o ya no es válida, o simplemente sale de nuevo al firmware (porque sí, es fácil salir al firmware a diferencia del caso MBR donde técnicamente es posible), simplemente intenta la siguiente.
2) Si no se considera ninguna de esas entradas de arranque, ahora intenta encontrar una partición en cada disco (normalmente la Partición del Sistema EFI, aunque esto varía) y encontrar efibootbootx64.efi (creo que esta ruta es correcta; que alguien me diga si no lo es) e intenta arrancarlo.
3) Una vez que se encuentra la entrada de arranque adecuada (realmente un archivo .efi, que tiene un cierto formato de archivo muy similar a los ejecutables de Windows, pero no directamente ejecutable bajo Windows), se carga y se ejecuta. UEFI bootmgr cargado.

Después de cargar bootmgr, el gestor de arranque comprueba sus propias configuraciones (colmenas del registro, esencialmente un formato de base de datos idéntico al utilizado en las colmenas reales del registro de Windows; de hecho, estas configuraciones siempre se montan en el registro de Windows después del arranque) y encuentra la configuración del sistema Windows que necesita ser arrancado, O que necesita cargar un sistema Windows desde la hibernación. Si es lo segundo, busca el ejecutable winload.exe para ese sistema Windows y lo carga en cadena, sin más (ese carga los datos del archivo de hibernación y ya está). Pero si es el primero, busca ntoskrnl.exe (el kernel de Windows), no estoy seguro de si es el kernel o el gestor de arranque el que carga los drivers críticos (los otros los carga el kernel con toda seguridad). Después de cargar el kernel, el gestor de arranque lo pone en su ubicación de memoria casi final y le da el control.

Una vez cargado el kernel, se cargan los controladores adicionales, se montan los hives del registro del sistema, se inicializan los dispositivos (usando código en los controladores), luego se pone en marcha el espacio de usuario (se genera el proceso smss.exe, éste genera los procesos csrss.exe para todas las sesiones, el proceso wininit.exe para la sesión 0 y el proceso winlogon.exe para las otras sesiones). Luego, en la sesión 0, wininit.exe se adelanta y lanza services.exe, que a su vez lanza todos los servicios de Windows; lsass.exe que implementa varias acciones críticas relacionadas con la seguridad. Se lanzan los distintos servicios (son demasiados, y varían de un sistema a otro dependiendo del software instalado), los cuales pueden lanzar otros procesos, etc.

winlogon.exe puede lanzar logonui.exe (que muestra la pantalla de bloqueo/inicio de sesión), userinit.exe (un proceso temporal para lanzar el shell de usuario, normalmente explorer.exe que muestra los iconos del escritorio y la barra de tareas, y por lo demás realiza las configuraciones iniciales de las sesiones de usuario, es decir, las sesiones >0), dwm.exe (compositor de Aero, obligatorio desde Windows 8).

Y luego es un territorio inexplorado para mí. Porque todo son variaciones, dependiendo del software instalado. explorer.exe puede lanzar unos cuantos, los servicios pueden lanzar otros que a su vez lanzan otros programas de usuario, dependiendo de la configuración del usuario, y así sucesivamente.