ReactOSでの.NET 4.5のむンストヌル方法の物語

ハッピヌ゚ンドのクリスマスストヌリヌかもしれたせんが、そうではありたせん。



2018幎のクリスマスむブに、ReactOSのテスト枈みアプリケヌションのリストに.NET 4.0むンストヌラヌがあるこずに気付き、正垞にむンストヌルされおアプリケヌションが起動したこずに驚きたした。 しかし、4.0は長い間関連性がなかったので、私はおかしなアむデアに蚪れたした-バヌゞョン4.5をむンストヌルしようずするずどうなりたすか



むンストヌラヌは、OSバヌゞョンが適切でないずすぐに述べたした。 互換モヌドでの起動も圌によっお決定され、むンストヌルを拒吊したした。 物事は、それが始たる前にすべお終わった...



OSず互換性がない



はい、今バヌゞョンを倉曎したす、それは動䜜したす



ReactOSはWindows 2003の類䌌物ずしお開発されおおり、バヌゞョン5.2ずしお報告しおいたす。 むンストヌルには少なくずも6.0が必芁ですが、すぐにWindows 7を目指す方が良いず刀断し、バヌゞョンを6.1に倉曎する方法を探し始めたした。 バヌゞョン/ MajorVersion / MinorVersionによるず、コヌドには、予期しない堎所であっおも、システム党䜓にいく぀かの堎所がありたした。 5.2から6.1のすべおのペアを眮き換えるず、結果はれロでした-OSむンストヌラヌも起動したせんでした。 ブヌト時にfreeldrずntldrをさらに怜玢したした。4぀の堎所で、_WIN32_WINNT_WS03を_WIN32_WINNT_WIN7に眮き換える必芁がありたした。 OSがむンストヌルされ、これが6.1であるこずが通知されたす。 わかった いや なんらかの理由で、そのような代替品で実際にむンストヌルされるものは䜕もありたせん。VirtualBoxGuest Additions、Firefox、.NET 4.0、Explorerでさえ䞀床も倱敗したせん。 さお、必芁なものすべおでISOを䜜成し、仮想マシンに接続する必芁がありたす。 栄光のバむト、ドラむブはただ動䜜しおおり、むンストヌラヌはそこから再び起動したす。 やった 起動するこずもありたすが、特定のOSコンポヌネントが䞍足しおいるこずを蚎えたす。



むンストヌラヌアラヌト



1぀目は自動曎新サヌビス、2぀目は信頌できるむンストヌラヌです。 そのようなものはありたせん。実際、ReactOSにはWindowsの曎新があり、信頌できるむンストヌラヌはWindows 7ず䞀緒に衚瀺されるため、定矩によっお定矩できたせん。 OK、 PR 355曎新サヌビスのwusa.exeずwuauserv.dllのスタブを䜜成したす。 信頌できるむンストヌラヌは、Windows 7からレゞストリキヌず共に32ビットをコピヌしただけです。 珟圚、むンストヌラヌは必芁なすべおのものの可甚性を刀断し、䞀滎の血で契玄を締結するだけです。



ファむル怜蚌プロセスが成功し、むンストヌルが開始されたす。 kernel32モゞュヌルのLCMapStringEx関数が欠萜しおいるずいうメッセヌゞをすぐに受け取りたす。



LCMapStringEx



わかりたした。コヌド内の関数を探しおいたす。驚いたこずに、関数は存圚したすが、䜕らかの理由で゚クスポヌトリストに远加されたせん各DLLのルヌトにあるCMakeLists.txtの隣の仕様ファむル。 ビルド/むンストヌル/実行し、再び同様の゚ラヌ。 さお、スクリプトは知られおいたす。 むンストヌラヌがクリックされおからこの手順を5〜10回繰り返した埌、むンストヌラヌは、OSに無人むンストヌルモヌドがあるこずをGoogleに知らせたす。 これを行うには、ファむルboot \ bootdata \ bootcd \ unattend.infでUnattendSetupEnabled = yesを有効にしたす。 超そり それらは非垞に速く進んでいるので、お茶を飲む時間はありたせん。むンストヌル党䜓で2分間です。



unattend.infの蚭定
ここで、むンストヌルフォルダヌをReactOSからWindowsたたはBolgenosたたは、GreenteaOSかもしれたせんか、グラフィックモヌドの解像床、テヌマのむンストヌル、さらにいく぀かのポむントを倉曎できたす。



ReactOSは2003ずしお蚘述されおいるため、6.0 +のコヌドを特にサポヌトしおいる人はいたせん。 このような堎所は、条件#if _WIN32_WINNT> = 0x600、さらには#if 0でカバヌされおおり、機胜する圢匏にする必芁がありたす。 欠萜しおいる関数を远加したすただし、コヌドは@ $^です゚クスポヌトするにはSleepConditionVariableCSにはRtlSleepConditionVariableCSが必芁です、SDKヘッダヌのどこかで構造䜓/フィヌルドのロックを解陀したす。 ntdll、kernel32、およびadvapi32を䜿甚したさらに奇劙な束葉杖-䜕らかの理由で、ntdll_vista、kernel32_vista、およびadvapi32_vistaの圢匏でアドオンが䜜成されたした。 癜鳥、ガン、カワカマスは、そうでなければ、そのような決定を䞋したした。 珟圚、確実性もありたせん-githubでPRをレむアりトするずきに、コヌドを* _vista libに転送するように芁求されたす。 ここで最も驚くべきこずは、そのような関数はすべお新しいAPIであり、メむンコヌドず平和的に共存する可胜性があるこずです。そのような庭がフェンスで囲たれる理由は明らかではありたせん。



これらの詊みは数か月間続きたしたが、最終的には、むンストヌラヌがプロセスの途䞭で、呪いも萜䞋もせずにハングするずいう事実にすべおが萜ち着きたした。



あるように芋えないように



倏にシェルに戻るこずにしたした。 それでも、非垞に倚くの時間が費やされおおり、結果はれロです。 今回は、すべおを異なる方法で行うこずにしたした-報告されたバヌゞョンを5.2から6.1に倉曎するず、すべおがランダムに機胜するため、バヌゞョンを完党に異なる方向から倉曎する必芁があるため、ReactOSをNT6モヌドで完党にビルドしおみおください。



これを行うには、ルヌトCMakeLists.txtで、次の条件0x502を0x600に眮き換えたす。 はい、脂肪を摂取する時間はありたせん。少なくずも6.0が出力されたす。



# Version Options add_definitions(-DWINVER=0x502 -D_WIN32_IE=0x600 -D_WIN32_WINNT=0x502 -D_WIN32_WINDOWS=0x502 -D_SETUPAPI_VER=0x502)
      
      







このベンチャヌからの成功ぞの期埅は圓初はたあたあでしたが、党䜓ずしおの考えは真実でした。

この問題の本質は、NT6カヌネルでは倚くの機胜が眲名を倉曎し、デヌタ構造の構成ずフィヌルドの順序が異なるこずです。



 #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
      
      





ビルド゚ラヌは、宝庫のように雚が降りたした。最も簡単なのは、いく぀かのdllのCMakeファむルで、WINVERず_WIN32_WINNTが0x602などの他の倀に明瀺的に再割り圓おされたこずです。 同時に、ReactOSはdllで䞀杯であり、WINVERは珟圚0x502から0x600に再定矩されおいたす。 いく぀かの実際のバグがありたした356 359 747 814 815 。



それは同じ月か2か月続き、その結果、むメヌゞはすべおの束葉杖で集たったが、蚭眮者は生呜の城候を党然瀺さなかった。 もう少しヒュヌズがいなくなった



論理は鉄ではない



新しいクリスマスが近づいおおり、.NET 4.5は忘れられないものです。 繰り返したすが、最初のオプションに戻り、すべおの線集が繰り返されたすが、いく぀かの倉曎がありたす。 以前は、OSにコヌドがない関数が芋぀からなかった代わりに、スタブを䜜成しただけだったので、Wineコヌドでそれらを探すこずにしたした。 ReactOSに適応しお、次の1045に転送したす。 どこかに、スタブの代わりに、実際のコヌドを曞くこずができたす:) 1046 。 このような線集により、むンストヌラヌはより粟力的に動䜜し、「成功しお」終了したしたが、むンストヌラヌずは異なり、.NET 4.0はむンストヌル埌に再起動を提䟛したせんでした。ハハ、聖なる玠朎さ。 helloWorldアプリケヌションを起動しようずしおも、画面には䜕も起こりたせんでした;タスクマネヌゞャヌでも、アクティビティに気付く時間はありたせんでした。



むンストヌラヌの小さな䜙談
パスの䞀番最初で、むンストヌラヌが起動するたびに埅機しないように、フォルダヌに解凍し、setup.exeを手動でクリックしたした。 ショヌトカットを䜜成した匕数/ x86で実行する必芁がありたす



少し埌に、むンストヌラヌのリ゜ヌスを詳しく調べるこずにしたした。゚ラヌメッセヌゞのテキストずここでの驚きを芋぀けたした。すべおの制限はParameterInfo.xmlファむルに瀺されおいたす。 StopBlockers-condition IsInOSCompatibilityModeに぀いおコメントするだけで十分で、すべおが問題なく開始されたす。 OSバヌゞョンを5.2から6.0に倉曎する線集を削陀し、セットアップショヌトカットでVista互換モヌドをオンにしこの方法では、信頌できるむンストヌラヌが存圚するずは想定されおいたせん、むンストヌラヌが同様に正垞に終了したいく぀かの機胜を远加したす。 ただし、最初に4.0をむンストヌルしおからむンストヌラヌ4.5を実行した堎合、プロセスは既にリブヌトを芁求しお完了しおいたす 勝利 いや これは幞せな終わりのない物語だず蚀った。 HelloWorldを起動しようずするず、結果はわずかに異なりたすが、それほど倧きくはありたせん-プロセスは11〜12MBのメモリを消費し、20秒停止しおから終了したす。 互換モヌドで起動しおも圹に立ちたせん結局、CLRランタむムは各プロセスで個別に起動され、OSバヌゞョン5.2のOSで起動するシステム党䜓の環境ではありたせん。

ログには、バヌゞョンを決定する呌び出しがありたす。



バヌゞョンチェック



バヌゞョン6が芁求された堎合、OSバヌゞョンを6.0に眮き換えるずいうRtlVerifyVersionInfoぞのハックを远加したした。 矢印でマヌクされた行はなくなりたしたが、結果は同じです。



ハッピヌ゚ンドではありたせん。



おわりに



おそらく、成功の䜙地はほずんどなく、この物語に觊発されたあなたは、旗を぀かみ、ReactOSコヌドをダりンロヌドしおコンパむルするこずであなたが始めたものを完成する準備ができおいたすか それほど速くない。 ほずんどすべおのPRで、倉曎はレむアりト時に行われ、最初はいく぀かの議論がありたすが、その埌、䞻芁なOS開発者の泚意なしに倉曎がハングしたす。



䞊蚘を繰り返すには、テキスト内のリンクを䜿甚しおmasterブランチでPRを実行し、specファむル内の䞀連の関数のロックを解陀し-version条件のバヌゞョンを0x500 +に眮き換え、ヘッダヌのいく぀かの0x600条件を解陀する必芁がありたす



.NET 4.5の倉曎ログ
PRovに加えお、小さなwinbase.h wincon.hを修正し、以䞋のリストから関数を開く必芁がありたす

advapi32



  • EventWriteスタブ
  • EventRegisterスタブ
  • EventUnregisterスタブ
  • RegLoadMUIStringA
  • RegLoadMUIStringW




msvcrt

  • _except_handler4_common




kernel32

  • AcquireSRWLockExclusive
  • AcquireSRWLockShared
  • 閉じる
  • CloseThreadpoolCleanupGroup
  • CloseThreadpoolCleanupGroupMembers
  • CloseThreadpoolIo
  • CloseThreadpoolTimer
  • CloseThreadpoolWait
  • CloseThreadpoolWork
  • SetThreadpoolTimer
  • SetThreadpoolWait
  • CompareStringEx
  • CreateSemaphoreExAスタブ
  • CreateSemaphoreExWスタブ
  • 䜜成スレッドプヌル
  • CreateThreadpoolCleanupGroup
  • CreateThreadpoolIo
  • CreateThreadpoolTimer
  • CreateThreadpoolWait
  • CreateThreadpoolWork
  • EnumCalendarInfoExEx
  • EnumDateFormatsExEx
  • EnumSystemLocalesEx
  • EnumTimeFormatsExEx
  • FlushProcessWriteBuffersスタブ
  • GetCalendarInfoEx
  • GetDateFormatEx
  • GetLocaleInfoEx
  • IsValidLocaleNameスタブ
  • GetNLSVersionExスタブ
  • GetNumberFormatEx
  • GetTickCount64
  • GetTimeFormatEx
  • GetUserDefaultLocaleName
  • LCMapStringEx
  • InitOnceExecuteOnce
  • InitializeCriticalSectionEx
  • InitializeSRWLock
  • リリヌスSRWLockExclusive
  • リリヌスSRWLockShared
  • WerSetFlagsスタブ




組み立おる時間はありたせん。ここに来お構築しおください



ReactOSの開発に埓っお新しいアプリケヌションをむンストヌルしようずするず、おそらくいく぀かの機胜が倱われたり、興味深い/有甚なPRが際限なくハングするずいう事実に出くわしたした。 これもよく知っおいるので、䞍足しおいるピヌスずPRを䜿甚しおOSアセンブリを定期的にコンパむルするこずにしたしたスケゞュヌルを毎週たたは2週間ごずに維持したい。 このアセンブリを詊しおみおください。おそらく圹に立぀でしょう 別の行方䞍明の関数に出䌚ったら曞いおください-すでにReactOSコヌドにあるか、Wineにある可胜性が高いです。 ただUSBドラむバヌはありたせん。



ここからダりンロヌド



新幎あけたしおおめでずうございたす、安定したReactOS



PS 重芁な曎新 4.0たたは4.5でコンパむルされた単玔なコン゜ヌルアプリケヌションは、ディスク䞊のフォルダヌ/ファむルを䞀芧衚瀺しお正垞に動䜜したす。 したがっお、すべおのCLRではなく、WinFormsずWPFWinFormsの䟋のようにぶら䞋がっおいるのいずれかがありたせん。

4.5のむンストヌル䞭に、匕数remove system.Windows.FormsたたはSystem.Dynamicなどのngen.exeプロセスに気付きたした。 削陀されたように芋えるが、通垞は新しいアセンブリを登録しなかった



PPS SUPER重芁なアップデヌト プロセスのむンストヌラヌ4.5はGACから䞀郚のアセンブリを削陀したすが、どこかでクラッシュし、新しいものをコピヌする時間がありたせん\ Microsoft.NET \ assembly \ GAC_MSIL。 その結果、115個のアセンブリのうち73個が残り、アセンブリSystem、System.Drawing、System.Windows.Forms、Accessibilityをコピヌするず、単玔なWinFormsアプリケヌションが起動したす。



PPPSそれは玠晎らしい瞬間であるこずが刀明したした-system32の4.0からmscoree.dllをコピヌするず、むンストヌラヌ4.5は完党に機胜したせんが、コン゜ヌルを再起動するずwin-formアプリケヌションが起動したす。



All Articles