Podría ser una historia de Navidad con un final feliz, pero no es así.
En la víspera de Navidad de 2018, noté un instalador de .NET 4.0 en la lista de aplicaciones probadas para ReactOS y me sorprendió gratamente que se haya instalado con éxito y se hayan iniciado las aplicaciones. Pero dado que 4.0 no ha sido relevante durante mucho tiempo, recibí una idea loca: ¿qué sucederá si intento instalar la versión 4.5?
El instalador declaró inmediatamente que la versión del sistema operativo no es adecuada. El lanzamiento en modo de compatibilidad también fue determinado por él y se negó a instalar. Cosas, todo terminó antes de que comenzara ...

¡Sí, ahora cambiaré la versión y funcionará!
ReactOS se está desarrollando como un análogo de Windows 2003 e informa la versión como 5.2. La instalación requiere al menos 6.0, pero luego decidí que era mejor apuntar de inmediato en Windows 7 y comencé a buscar cómo cambiar la versión a 6.1. En el código, según la versión / MajorVersion / MinorVersion, había varios lugares en todo el sistema, incluso donde no lo esperaba. Reemplazando todos los pares de 5.2 a 6.1, el resultado fue cero, incluso el instalador del sistema operativo no se inició. Se realizaron búsquedas adicionales en freeldr y ntldr en el arranque: en 4 lugares fue necesario reemplazar _WIN32_WINNT_WS03 con _WIN32_WINNT_WIN7. El sistema operativo está instalado y nos dice que esto es 6.1. ¿De acuerdo? No Por alguna razón, nada se instala realmente con tal reemplazo: ni VirtualBox Guest Additions, ni Firefox, ni .NET 4.0, e incluso Explorer falla una vez. Bien, entonces necesitas crear un ISO con todo lo que necesitas y conectarlo a la máquina virtual. Gloria a los bytes, la unidad sigue funcionando y el instalador comienza de nuevo. ¡Hurra! Incluso comienza, pero se queja de la falta de algunos componentes del sistema operativo:

El primero es un servicio de actualización automática, el segundo es un instalador de confianza. No tenemos nada de eso, realmente, por qué en ReactOS hay actualizaciones de Windows, y el Instalador de confianza no puede ser, por definición, porque apareció junto con Windows 7. También había una línea en el registro de que faltaba algún wusa.exe. Ok, cree los talones para wusa.exe y wuauserv.dll para el servicio de actualización
PR 355 . Trusted Installer acaba de copiar 32 bits de Windows 7 junto con las claves de registro. Ahora el instalador determina la disponibilidad de todo lo necesario y solo queda cerrar el contrato con una gota de sangre.
El proceso de verificación de archivos es exitoso y comienza la instalación. Inmediatamente recibimos un mensaje de que falta la función LCMapStringEx en el módulo kernel32.

Ok, estoy buscando una función en el código y, se sorprenderá, existe pero, por alguna razón, no se agrega a la lista de exportación (archivos de especificaciones junto a CMakeLists.txt en la raíz de cada DLL). Construir / Instalar / Ejecutar y nuevamente un error similar. Bueno, el guión es conocido. Después de repetir este procedimiento 5-10 veces después de que el instalador haya hecho clic en él, el instalador busca en Google que el sistema operativo tenga un modo de instalación desatendida. Para hacer esto, habilite UnattendSetupEnabled = yes en el archivo boot \ bootdata \ bootcd \ unattend.inf. Súper paseo en trineo! Van tan rápido que no tienes tiempo para ir a tomar el té, durante dos minutos toda la instalación.
Configuraciones en unattend.infAllí puede cambiar la carpeta de instalación de ReactOS a Windows o Bolgenos (o tal vez GreenteaOS? :)), la resolución del modo gráfico, permitir la instalación del tema y un par de puntos más
Como ReactOS está escrito como 2003, nadie admite particularmente el código para 6.0+. Dichos lugares están cubiertos por las condiciones #if _WIN32_WINNT> = 0x600, o incluso #if 0 y deben ponerse en funcionamiento. Agregue la función que falta (aunque su código es @ $ & ^%!) Para exportar (SleepConditionVariableCS requiere RtlSleepConditionVariableCS) o desbloquear estructuras / campos en algún lugar de los encabezados del SDK. Una muleta aún más extraña con ntdll, kernel32 y advapi32: por alguna razón, los complementos para ellos se crearon en forma de ntdll_vista, kernel32_vista y advapi32_vista, cada uno de los cuales tiene un máximo de 10-15 procedimientos, mientras que kernel32 tiene dos archivos completos de vista.c. Cisne, cáncer y lucio, de lo contrario, tomaron tales decisiones. Ahora tampoco hay certeza: al diseñar el PR en el github, uno solicita transferir el código a una libra * _vista, el segundo escribe que es suficiente para cerrar la exportación con la condición -version = 0x600 + en el archivo de especificaciones. Lo más sorprendente aquí es que todas estas funciones son una nueva API y pueden coexistir pacíficamente con el código principal, no está claro por qué cercar un jardín de este tipo.
Estos intentos continuaron durante un par de meses, pero al final todo se resolvió en el hecho de que el instalador se colgaría en el medio del proceso, sin maldecir ni caer.
Ser, no parecer
En el verano decidí volver al caparazón. Aún así, se ha pasado tanto tiempo y el resultado es cero. Esta vez decidí hacer todo de manera diferente, ya que al cambiar la versión informada de 5.2 a 6.1 todo funciona al azar, entonces debe cambiar la versión desde una dirección completamente diferente: intente construir ReactOS completamente en modo NT6.
Para hacer esto, en la raíz CMakeLists.txt, reemplace las siguientes condiciones 0x502 con 0x600. Sí, no hay tiempo para la grasa, al menos 6.0 para obtener salida.
Las expectativas de éxito de esta empresa eran inicialmente regulares, aunque la idea en su conjunto era cierta.
La esencia del problema es que en el núcleo NT6 muchas funciones cambiaron firmas, las estructuras de datos difieren en la composición y el orden de los campos.
#if (_WIN32_WINNT >= 0x600) NTSTATUS RxConstructSrvCall( _In_ PRX_CONTEXT RxContext, _In_ PIRP Irp, _In_ PSRV_CALL SrvCall, _Out_ PLOCK_HOLDING_STATE LockHoldingState); #else NTSTATUS RxConstructSrvCall( _In_ PRX_CONTEXT RxContext, _In_ PSRV_CALL SrvCall, _Out_ PLOCK_HOLDING_STATE LockHoldingState); #endif
Los errores de compilación llovieron como cuerno de la abundancia, el más simple de los cuales fue que en los archivos CMake de algunos dlls, WINVER y _WIN32_WINNT se reasignaron explícitamente a otros valores, por ejemplo, 0x602. Al mismo tiempo, ReactOS está lleno de dlls, en los que WINVER ahora se redefine de 0x502 a 0x600. Hubo algunos errores reales
# 356 # 359 # 747 # 814 # 815 .
Duró el mismo mes o dos y, como resultado, la imagen se reunió con todas las muletas, pero el instalador no mostró ningún signo de vida. Atormentado un poco más fusible se ha ido
La lógica no es hierro
Se acerca una nueva Navidad y .NET 4.5 es inquietante. Nuevamente, vuelvo a la primera opción, todas las ediciones se repiten, pero con algunos cambios. Si antes, en lugar de faltar funciones (para las cuales no hay código en el sistema operativo), acabo de hacer stubs, pero ahora decidí buscarlas en el código Wine y, he aquí, estaban allí. Transfiere, adapta para ReactOS, al siguiente
# 1045 . En algún lugar, en lugar de un trozo, puede escribir código real :)
# 1046 . Con tales ediciones, el instalador trabajó más vigorosamente e incluso terminó "exitosamente", pero a diferencia del instalador, .NET 4.0 no ofreció reiniciarse después de la instalación. ja ja, santa ingenuidad). Cuando intenté iniciar la aplicación helloWorld, no pasó nada en la pantalla; tampoco en el administrador de tareas tuve tiempo de notar ninguna actividad.
Una pequeña digresión sobre el instalador.Al comienzo de la ruta, para no esperar a que el instalador se inicie cada vez, lo descomprimí en una carpeta e hice clic en setup.exe manualmente. Debe ejecutar con el argumento / x86 para el que creó un acceso directo.
Un poco más tarde, decidí profundizar en los recursos del instalador, donde encontré el texto de los mensajes de error y AQUÍ SORPRESA: ¡todas las restricciones se indican en el archivo ParameterInfo.xml! Fue suficiente para comentar sobre la condición de StopBlockers IsInOSCompatibilityMode y todo comienza sin problemas. Elimino las ediciones que cambian la versión del sistema operativo de 5.2 a 6.0, activa el modo de compatibilidad de Vista en el acceso directo a la configuración (por lo que no espera que exista Trusted Installer) y agrego algunas funciones más que el instalador finalizó tan "exitosamente". Sin embargo, si primero instala 4.0 y luego ejecuta el instalador 4.5, ¡el proceso ya se ha completado con una solicitud de reinicio! Victoria! No Dije que esta es una historia sin un final feliz. Cuando intentas iniciar HelloWorld, el resultado es ligeramente diferente, pero no mucho: el proceso toma 11-12 MB de memoria y, después de colgar 20 segundos, finaliza. Comenzar en modo de compatibilidad no ayuda (después de todo, CLR-runtime se inicia en cada proceso por separado, y no un entorno de todo el sistema que comience con el SO con SO versión 5.2).
En el registro, vemos llamadas para determinar la versión:

Se agregó un truco a RtlVerifyVersionInfo que, si se solicita la versión 6. *, reemplace la versión del sistema operativo con 6.0. Las líneas marcadas por la flecha se han ido, pero el resultado es el mismo.
No es un final feliz.
Conclusión
¿Quizás queda muy poco para el éxito y usted, inspirado en esta historia, está listo para atrapar la bandera y terminar lo que comenzó descargando el código ReactOS y compilándolo? No tan rapido En casi todos los RP, los cambios realizados cuando se presentan se discuten primero, pero luego se cuelgan sin la atención de los principales desarrolladores del sistema operativo.
Para repetir lo que se describe, es necesario rodar PR en la rama maestra usando los enlaces en el texto, desbloquear un montón de funciones en archivos de especificaciones (reemplace la versión en la condición -version con 0x500 +) y varias condiciones 0x600 en los encabezados
Registro de cambios para .NET 4.5Además de PRov, debe corregir un poco winbase.h wincon.h y abrir las funciones de la lista a continuación
advapi32- EventWrite (código auxiliar)
- EventRegister (trozo)
- EventUnregister (trozo)
- RegLoadMUIStringA
- RegLoadMUIStringW
msvcrtkernel32- AdquirirSRWLockExclusive
- AdquirirSRWLockShared
- Cerrar Threadpool
- CloseThreadpoolCleanupGroup
- CloseThreadpoolCleanupGroupMembers
- CloseThreadpoolIo
- CloseThreadpoolTimer
- Cerrar ThreadpoolWait
- Cerrar ThreadpoolWork
- SetThreadpoolTimer
- SetThreadpoolWait
- CompareStringEx
- CreateSemaphoreExA (trozo)
- CreateSemaphoreExW (trozo)
- Crear grupo de hilos
- CreateThreadpoolCleanupGroup
- CreateThreadpoolIo
- CreateThreadpoolTimer
- CreateThreadpoolWait
- CreateThreadpoolWork
- EnumCalendarInfoExEx
- EnumDateFormatsExEx
- EnumSystemLocalesEx
- EnumTimeFormatsExEx
- FlushProcessWriteBuffers (trozo)
- GetCalendarInfoEx
- GetDateFormatEx
- GetLocaleInfoEx
- IsValidLocaleName (código auxiliar)
- GetNLSVersionEx (trozo)
- GetNumberFormatEx
- GetTickCount64
- GetTimeFormatEx
- GetUserDefaultLocaleName
- LCMapStringEx
- InitOnceExecuteOnce
- InitializeCriticalSectionEx
- InitializeSRWLock
- ReleaseSRWLockExclusive
- ReleaseSRWLockShared
- WerSetFlags (trozo)
No hay tiempo para armar, ¡ven aquí para construir!
Si sigues el desarrollo de ReactOS e intentas instalar una aplicación nueva, entonces probablemente te hayas dado cuenta de que faltan algunas funciones o que un RP interesante / útil se cuelga sin cesar. También estoy familiarizado con esto y, por lo tanto, decidí compilar regularmente el ensamblaje del sistema operativo con las piezas y las relaciones públicas que faltan (quiero mantener el horario semanalmente o cada dos semanas). Pruebe este ensamblaje, ¡tal vez sea útil! Escriba si encuentra otra función que falta: es muy probable que ya se encuentre en el código ReactOS o en Wine. Todavía no hay un controlador USB.
Descargar
aquíFeliz año nuevo y estable ReactOS!
PD
¡Actualización importante! Una aplicación de consola simple creada bajo 4.0 o 4.5 que enumera carpetas / archivos en un disco funciona bien. Entonces, el cant no está en algún lugar con WinForms y WPF (colgando como el ejemplo de WinForms), y no todos los CLR.
Durante la instalación 4.5, noté que los procesos ngen.exe con el argumento eliminan System.Windows.Forms o System.Dynamic, etc. Parece eliminar eliminado, pero normalmente no registró nuevos ensamblados
PPS
SUPER importante actualización! El instalador 4.5 en el proceso elimina algunos ensamblajes del GAC, pero en algún lugar se bloquea y no tiene tiempo para copiar otros nuevos (\ Microsoft.NET \ assembly \ GAC_MSIL). Como resultado, de 115 ensamblajes, quedan 73. ¡Si copia los ensamblajes System, System.Drawing, System.Windows.Forms y Accessibility allí, entonces se inicia una aplicación WinForms simple!
PPPS Resultó un gran momento: si copia mscoree.dll desde 4.0 en system32, entonces el instalador 4.5 no funciona por completo, pero después de reiniciar la consola y las aplicaciones win-form comienzan.