Ini bisa menjadi kisah Natal dengan akhir yang bahagia, tetapi tidak seperti itu.
Pada Malam Natal 2018, saya melihat installer .NET 4.0 dalam daftar aplikasi yang diuji untuk ReactOS dan terkejut bahwa itu berhasil diinstal dan aplikasi dimulai. Tetapi karena 4.0 tidak relevan untuk waktu yang lama, saya dikunjungi oleh ide gila - apa yang akan terjadi jika saya mencoba menginstal versi 4.5?
Pemasang segera menyatakan bahwa versi OS tidak cocok. Peluncuran dalam mode kompatibilitas juga ditentukan olehnya dan menolak untuk diinstal. Hal-hal, semuanya berakhir sebelum dimulai ...

Ya, sekarang saya akan mengubah versinya dan itu akan berhasil!
ReactOS sedang dikembangkan sebagai analog Windows 2003 dan melaporkan versi sebagai 5.2. Instalasi memerlukan setidaknya 6.0, tetapi kemudian saya memutuskan bahwa lebih baik langsung membidik Windows 7 dan mulai mencari cara mengubah versi menjadi 6.1. Dalam kode, menurut versi / MajorVersion / MinorVersion, ada beberapa tempat di seluruh sistem, bahkan di mana Anda tidak berharap. Mengganti semua pasangan 5,2 ke 6,1, hasilnya adalah nol - bahkan penginstal OS tidak memulai. Pencarian lebih lanjut dibawa ke freeldr dan ntldr di boot - di 4 tempat itu perlu untuk menggantikan _WIN32_WINNT_WS03 dengan _WIN32_WINNT_WIN7. OS diinstal dan memberi tahu kami bahwa ini 6.1. Baiklah ?! Tidak. Untuk beberapa alasan, tidak ada yang benar-benar diinstal dengan penggantian seperti itu - baik VirtualBox Guest Additions, atau Firefox, atau .NET 4.0, dan bahkan Explorer gagal sekali. Oke, jadi Anda perlu membuat ISO dengan semua yang Anda butuhkan dan sambungkan ke mesin virtual. Glory ke byte, drive masih berfungsi dan penginstal mulai dari itu lagi. Hore! Itu bahkan dimulai, tetapi mengeluh tentang kurangnya beberapa komponen OS:

Yang pertama adalah layanan pembaruan otomatis, yang kedua adalah Pemasang Tepercaya. Kami tidak memiliki hal seperti itu - sungguh, mengapa di ReactOS ada pembaruan Windows, dan Pemasang Tepercaya tidak dapat secara definisi karena muncul bersama-sama dengan Windows 7. Ada juga baris dalam log yang beberapa wusa.exe hilang. Oke, buat stubs untuk wusa.exe dan wuauserv.dll untuk layanan pembaruan
PR 355 . Installer Tepercaya hanya menyalin 32bit dari Windows 7 bersama dengan kunci registri. Sekarang installer menentukan ketersediaan semua yang diperlukan dan tetap hanya untuk mengikat kontrak dengan setetes darah.
Proses verifikasi file berhasil dan instalasi dimulai. Segera kami mendapatkan pesan bahwa fungsi LCMapStringEx dalam modul kernel32 hilang.

Oke, saya mencari fungsi dalam kode dan, Anda akan terkejut, ada tetapi karena beberapa alasan tidak ditambahkan ke daftar ekspor (file-spec di sebelah CMakeLists.txt di root dari masing-masing DLL). Build / Install / Run dan sekali lagi kesalahan yang sama. Nah, skripnya sudah diketahui. Setelah mengulangi prosedur ini 5-10 kali agar tidak diklik oleh penginstal, penginstal Googled bahwa OS memiliki mode instalasi tanpa pengawasan. Untuk melakukan ini, aktifkan UnattendSetupEnabled = yes di file boot \ bootdata \ bootcd \ unattend.inf. Naik kereta luncur super! Mereka berjalan sangat cepat sehingga Anda tidak punya waktu untuk minum teh - selama dua menit seluruh instalasi.
Pengaturan di unattend.infDi sana Anda dapat mengubah folder instalasi dari ReactOS ke Windows atau Bolgenos (atau mungkin GreenteaOS? :)), resolusi mode grafis, memungkinkan instalasi tema dan beberapa poin lagi
Karena ReactOS ditulis sebagai 2003, tidak ada yang secara khusus mendukung kode untuk 6.0+. Tempat-tempat seperti itu dicakup oleh ketentuan #jika _WIN32_WINNT> = 0x600, atau bahkan #jika 0 dan mereka harus dioperasikan. Tambahkan fungsi yang hilang (meskipun kodenya adalah @ $ & ^%!) Untuk mengekspor (SleepConditionVariableCS memerlukan RtlSleepConditionVariableCS) atau membuka kunci struktur / bidang di suatu tempat di header SDK. Kruk bahkan lebih aneh dengan ntdll, kernel32 dan advapi32 - untuk beberapa alasan, add-on untuk mereka dibuat dalam bentuk ntdll_vista, kernel32_vista dan advapi32_vista yang masing-masing memiliki maksimal 10-15 prosedur, sedangkan kernel32 memiliki dua file vista.c keseluruhan. Angsa, kanker dan tombak, bukan sebaliknya, membuat keputusan seperti itu. Sekarang juga tidak ada kepastian - ketika meletakkan PR pada github, seseorang meminta untuk mentransfer kode ke lib * _vista, yang kedua menulis bahwa itu cukup untuk menutup ekspor dengan kondisi -version = 0x600 + dalam file spesifikasi. Apa yang paling mengejutkan di sini adalah bahwa semua fungsi tersebut adalah API baru dan mungkin berdampingan secara damai dengan kode utama, tidak jelas mengapa harus memagari taman semacam itu.
Upaya-upaya ini berlanjut selama beberapa bulan, tetapi pada akhirnya semuanya diselesaikan pada kenyataan bahwa installer akan menggantung di tengah proses, tidak mengutuk atau jatuh.
Menjadi, tidak kelihatan
Di musim panas saya memutuskan untuk kembali ke shell. Namun, begitu banyak waktu telah dihabiskan, dan hasilnya nol. Kali ini saya memutuskan untuk melakukan semuanya secara berbeda - karena ketika mengubah versi yang dilaporkan dari 5.2 ke 6.1 semuanya bekerja secara acak, maka Anda perlu mengubah versi dari arah yang sama sekali berbeda - cobalah untuk membangun ReactOS sepenuhnya dalam mode NT6.
Untuk melakukan ini, di root CMakeLists.txt, ganti kondisi berikut 0x502 dengan 0x600. Ya, tidak ada waktu untuk lemak, setidaknya 6,0 untuk mendapatkan hasil.
Harapan keberhasilan dari usaha ini awalnya begitu-begitu, meskipun gagasan secara keseluruhan adalah benar.
Inti dari masalah adalah bahwa di kernel NT6 banyak fungsi mengubah tanda tangan, struktur data berbeda dalam komposisi dan urutan bidang.
#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
Kesalahan membangun yang dihujani seperti tumpah ruah, yang paling sederhana adalah bahwa dalam file CMake dari beberapa dll, WINVER dan _WIN32_WINNT secara eksplisit dipindahkan ke nilai-nilai lain, misalnya, 0x602. Pada saat yang sama, ReactOS penuh dengan dll, di mana WINVER sekarang didefinisikan ulang dari 0x502 menjadi 0x600. Ada beberapa bug nyata
# 356 # 359 # 747 # 814 # 815 .
Itu berlangsung bulan atau dua yang sama dan sebagai hasilnya, gambar berkumpul dengan semua kruk, tetapi installer tidak menunjukkan tanda-tanda kehidupan sama sekali. Siksaan sekering lebih sedikit hilang
Logika bukan Besi
Natal baru akan datang, dan .NET 4.5 menghantui. Sekali lagi, saya kembali ke opsi pertama, semua suntingan diulangi, tetapi dengan beberapa perubahan. Jika sebelumnya, alih-alih fungsi yang hilang (yang tidak ada kode dalam OS), saya hanya berhenti bertopik, sekarang saya memutuskan untuk mencari mereka dalam kode Wine dan, lihatlah, mereka ada di sana. Transfer, adaptasi untuk ReactOS, ke
# 1045 berikutnya. Di suatu tempat, alih-alih sebuah rintisan, Anda dapat menulis kode asli :)
# 1046 . Penginstal bekerja lebih keras dengan pengeditan tersebut dan bahkan berakhir "berhasil", tetapi tidak seperti penginstalnya, .NET 4.0 tidak menawarkan untuk mem-boot ulang setelah penginstalan - saya menulis bahwa semua perangkat lunak yang sama untuk generasi baru OS dan tidak perlu mem-boot ulang setiap saat ( ha ha, kenaifan suci). Ketika saya mencoba memulai aplikasi helloWorld, tidak ada yang terjadi di layar, di task manager juga, saya tidak punya waktu untuk memperhatikan aktivitas apa pun.
Penyimpangan kecil pada installerdi awal jalan, agar tidak menunggu installer untuk memulai setiap kali, saya membongkar ke folder dan mengklik setup.exe secara manual. Anda perlu menjalankan dengan argumen / x86 yang dibuat pintasannya
Beberapa saat kemudian saya memutuskan untuk menyelidiki sumber-sumber pemasang, di mana saya menemukan teks pesan kesalahan dan DI SINI PERJALANAN - semua pembatasan ditunjukkan dalam file ParameterInfo.xml! Sudah cukup untuk mengomentari IsInOSCompatibilityMode StopBlockers-condition dan semuanya dimulai tanpa masalah. Saya menghapus pengeditan yang mengubah versi OS dari 5.2 ke 6.0, aktifkan mode kompatibilitas Vista di pintasan ke pengaturan (sehingga tidak mengharapkan Penginstal Tepercaya ada) dan menambahkan beberapa fungsi lagi yang diakhiri penginstal hanya sebagai "berhasil". Namun, jika Anda pertama kali menginstal 4.0 dan kemudian menjalankan installer 4.5, maka proses telah selesai dengan permintaan untuk reboot! Kemenangan!? Tidak. Saya mengatakan bahwa ini adalah kisah tanpa akhir yang bahagia. Ketika Anda mencoba memulai HelloWorld, hasilnya sedikit berbeda, tetapi tidak banyak - prosesnya memakan 11-12MB memori dan, setelah menggantung 20 detik, berakhir. Memulai dalam mode kompatibilitas tidak membantu (lagipula, CLR-runtime diluncurkan di setiap proses secara terpisah, dan tidak satu lingkungan sistem-lebar yang dimulai dengan OS dengan OS versi 5.2).
Dalam log, kita melihat panggilan untuk menentukan versi:

Menambahkan peretasan ke RtlVerifyVersionInfo bahwa jika versi 6. * diminta, maka ganti versi OS dengan 6.0. Garis yang ditandai oleh panah hilang, tetapi hasilnya sama.
Bukan akhir yang bahagia.
Kesimpulan
Mungkin hanya ada sedikit yang tersisa untuk sukses dan Anda, terinspirasi oleh cerita ini, siap untuk menangkap bendera dan menyelesaikan apa yang Anda mulai dengan mengunduh kode ReactOS dan mengompilasinya? Tidak secepat itu. Di hampir semua PR, perubahan yang dilakukan ketika ditata pertama kali dibahas, tetapi kemudian mereka menggantung tanpa perhatian dari pengembang OS utama.
Untuk mengulangi apa yang dijelaskan, perlu untuk menggulung PR pada cabang master menggunakan tautan dalam teks, membuka kunci banyak fungsi dalam file spesifikasi (ganti versi dalam kondisi -versi dengan 0x500 +) dan beberapa kondisi 0x600 di header.
Changelog untuk .NET 4.5Selain PRov, Anda perlu memperbaiki winbase.h wincon.h kecil dan buka fungsi dari daftar di bawah ini
advapi32- EventWrite (rintisan)
- EventRegister (stub)
- EventUnister (rintisan)
- RegLoadMUIStringA
- RegLoadMUIStringW
msvcrtkernel32- AcquireSRWLockExclusive
- AcquireSRWLockShared
- Tutup Kolam renang
- TutupThreadpoolCleanupGroup
- TutupThreadpoolCleanupGroupMembers
- TutupThreadpoolIo
- TutupThreadpoolTimer
- TutupThreadpoolWait
- TutupThreadpoolWork
- SetThreadpoolTimer
- SetThreadpoolWait
- CompareStringEx
- CreateSemaphoreExA (rintisan)
- CreateSemaphoreExW (rintisan)
- Createthreadpool
- BuatThreadpoolCleanupGroup
- BuatThreadpoolIo
- BuatThreadpoolTimer
- BuatThreadpoolWait
- BuatThreadpoolWork
- EnumCalendarInfoExEx
- EnumDateFormatsExEx
- EnumSystemLocalesEx
- EnumTimeFormatsExEx
- FlushProcessWriteBuffers (rintisan)
- GetCalendarInfoEx
- GetDateFormatEx
- GetLocaleInfoEx
- IsValidLocaleName (stub)
- GetNLSVersionEx (stub)
- GetNumberFormatEx
- GetTickCount64
- GetTimeFormatEx
- GetUserDefaultLocaleName
- LCMapStringEx
- InitOnceExecuteOnce
- InitializeCriticalSectionEx
- InisialisasiSRWLock
- ReleaseSRWLockExclusive
- ReleaseSRWLockShared
- WerSetFlags (stub)
Tidak ada waktu untuk berkumpul, datang ke sini untuk membangun!
Jika Anda mengikuti pengembangan ReactOS dan mencoba untuk menginstal aplikasi baru, maka Anda mungkin menemukan fakta bahwa beberapa fungsi hilang atau PR yang menarik / berguna tidak dapat dihentikan selamanya. Saya juga terbiasa dengan ini dan karena itu memutuskan untuk secara teratur mengkompilasi perakitan OS dengan bagian-bagian yang hilang dan PR (saya ingin menjaga jadwal setiap minggu atau setiap dua minggu). Coba majelis ini, mungkin ini akan berguna! Tulis jika Anda menemukan fungsi lain yang hilang - kemungkinan besar sudah ada dalam kode ReactOS atau dalam Wine. Belum ada driver USB di dalamnya.
Unduh di
siniSelamat Tahun Baru dan ReactOS yang stabil!
PS
Pembaruan penting! Aplikasi konsol sederhana yang dibuat di bawah 4.0 atau 4.5 daftar folder / file pada disk berfungsi dengan baik. Jadi cant adalah suatu tempat dengan WinForms dan WPF (menggantung seperti contoh WinForms), dan tidak semua CLR.
Selama instalasi 4.5, saya perhatikan proses ngen.exe dengan argumen hapus System.Windows.Forms atau System.Dynamic, dll. Tampaknya menghapus dihapus, tetapi tidak mendaftar majelis baru secara normal
Pembaruan penting PPS
SUPER! Installer 4.5 dalam proses menghapus beberapa rakitan dari GAC, tetapi di suatu tempat ia crash dan tidak punya waktu untuk menyalin yang baru (\ Microsoft.NET \ assembly \ GAC_MSIL). Akibatnya, dari 115 majelis, sisa 73. Jika Anda menyalin System, System.Drawing, System.Windows.Form dan Accessibility assemblies di sana, maka aplikasi WinForms sederhana dimulai!
PPPS Ternyata momen yang hebat - jika Anda menyalin mscoree.dll dari 4.0 di system32, maka installer 4.5 tidak bekerja sepenuhnya, tetapi setelah me-reboot konsol dan aplikasi win-form mulai.