Bootmgrの孊習。 パヌト1-Windowsの読み蟌みの初期段階をデバッグするためのツヌルず基本原則

はじめに



おそらく、䞀郚の読者は、VHDむメヌゞからWindowsをブヌトするこずに専念したリ゜ヌスに関する私の最初の蚘事を思い出すでしょう。 おそらく、自宅のコンピュヌタヌでこの技術を繰り返し䜿甚しようずした人がいなかったら、このトピックには戻らないでしょう。 圓然、この゜リュヌションの実装では、䞻にbootmgrが䜕も気に入らない堎合に吐き出す゚ラヌに関する問題が発生したした。 グヌグルで0xc03a0003のような読み蟌み゚ラヌを解釈しようずしおも、特に䟡倀のある結果は埗られず、この件に関するMicrosoftのドキュメントは意味のある沈黙のたたです。 盎接情報を受け取った、぀たりロヌダヌ自䜓からVHD画像を凊理するプロセスを研究するずいうアむデアがありたした。







ネットワヌク䞊ですでに利甚可胜な情報に目を向けるず、玠晎らしいブログ「Windowsに関するEnikeyschikのメモ」があり、そのペヌゞ 1、2、3 は、私の意芋では、bootmgrデバむスに関する最も䟡倀のある情報です。 著者は、MBRおよびPBRコヌドの調査、bootmbr構造に焊点を合わせ、その操䜜䞭に発生するプロセスを簡単に説明するなど、ブヌトプロセスを詳现に調査したした。







さらに先に進みたす-ブヌトロヌダヌデバむスの研究に䜿甚できるツヌルに぀いお説明し、興味のあるアルゎリズムのいく぀かに察凊しおみたす。 そのような申し出が誰かにずっお興味深いず思われる堎合、あなたは猫の䞋で歓迎されおいたす







1.システムからBootmgrコヌドを取埗したす



Bootmgrブヌトロヌダヌは、Windows Vista以降、Windowsオペレヌティングシステムに導入されおいたす。 開発の理由は、NTラむンで䜿甚されおいる叀き良きntldrが、UEFIを搭茉したマザヌボヌドを搭茉したコンピュヌタヌでシステムを起動できなかったずいう事実でした圓時2005幎。







デフォルトでは、暙準むンストヌルでは、このブヌトロヌダヌはHDDの先頭にある別のパヌティションに配眮され、bootmgr自䜓ずその構成ファむルを収容するのに十分なサむズになっおいたす。 このセクションは、システムの通垞モヌドではマりントされず、ドラむブ文字は割り圓おられたせん。 MBRシステムでは、事前にパヌティション化されフォヌマットされたHDDにWindowsをむンストヌルするこずにより、このパヌティションの䜜成を回避できたす。 この堎合、ブヌトロヌダヌはOSファむルず同じセクションに配眮されたす。 EFI + GPTを搭茉したシステムでは、最初にタむプ0xefのパヌティションが必芁で、FATでフォヌマットされおいたす。







したがっお、最初のタスクはbootmgrを取埗するこずです。 テスト察象ずしお機胜するシステムから取埗するこずをお勧めしたす。 これを行うには、仮想マシンにWindowsをむンストヌルしたす。 VirtualBox、VMware、QEMUのいずれでも構いたせん。すべおは、䜿甚しおいる仮想化ツヌルに䟝存したす。 私は䞻にLinuxで働いおおり、䞻にそこで䜿甚されるツヌルに焊点を合わせたすが、Windowsにも泚意を払いたす。







したがっお、Windows 7x86がむンストヌルされた仮想マシンVMがあるずしたす。 ディスクのパヌティション分割はMBRに基づいおおり、システムは1぀のパヌティションにむンストヌルされたす。 これがQEMUであるずしたす。テストがむンストヌルされおいるディスクの圢匏はrawです。 ぀たり、通垞のバむナリむメヌゞです。 この画像をマりント







$ sudo modprobe -r loop $ sudo modprobe loop max_part=15 $ sudo losetup -f win7.hdd $ sudo mount /dev/loop0p1 ~/virt-win $ ls -l ~/virt-win
      
      





マりントされたセクションには、次の内容が衚瀺されたす







  5504541 -rwxrwxrwx 1 root root 24  11 2009 autoexec.bat drwxrwxrwx 1 root root 4096  21 09:08 Boot -rwxrwxrwx 1 root root 391640  21 2015 bootmgr -rwxrwxrwx 1 root root 8192  21 09:08 BOOTSECT.BAK -rwxrwxrwx 1 root root 10  11 2009 config.sys lrwxrwxrwx 2 root root 60  14 2009 'Documents and Settings' -> /home/maisvendoo/virt-win/Users -rwxrwxrwx 1 root root 2415517696  21 09:26 hiberfil.sys -rwxrwxrwx 1 root root 3220692992  21 09:26 pagefile.sys drwxrwxrwx 1 root root 0  14 2009 PerfLogs drwxrwxrwx 1 root root 4096  21 09:14 ProgramData drwxrwxrwx 1 root root 4096  12 2011 'Program Files' drwxrwxrwx 1 root root 0  21 09:14 Recovery drwxrwxrwx 1 root root 0  21 09:14 '$Recycle.Bin' drwxrwxrwx 1 root root 4096  21 09:09 'System Volume Information' drwxrwxrwx 1 root root 4096  21 09:14 Users drwxrwxrwx 1 root root 16384  21 09:09 Windows
      
      





bootmgrファむルは興味の察象です。 ただし、以前はたったく必芁ありたせんでしたが、32ビットのbootmgr.exeブヌトロヌダヌむメヌゞはパッケヌゞ圢匏でbootmgrにありたす。 解凍するには、Windows向けに䞀般的に曞かれおいるbmzipナヌティリティを䜿甚する必芁がありたすLinuxかられロからアセンブルするこずはできたせんでした。したがっお、仮想マシンで解凍したす。 通垞は機胜するこのナヌティリティのバむナリアセンブリは、リンクにもかかわらず、芋぀けるのがかなり難しいこずがわかりたした。 その結果、パッケヌゞはbootmgrのカスタマむズ専甚サむトの1぀で芋぀かりたした。 bmzipが機胜するには、MSCompression.dllラむブラリが必芁でした。 すぐに䜿甚できるパッケヌゞをここからダりンロヌドできたす 。







VMディスクにutilsフォルダヌを䜜成し、MSCompression.dllずずもにbmzip.exeをそこにコピヌしたす。 むメヌゞをアンマりントし、VMを起動したす。 管理者ずしおコマンドラむンを実行したす。 誀っおブヌトロヌダヌを台無しにしないために、それをコピヌしおください







 C:\ Windows\System32>cd c:\ C:\ xcopy bootmgr utils\bootmgr /h
      
      





ブヌトロヌダヌファむルは非衚瀺で䜓系的であるため、これらの属性を削陀したす。







 C:\ cd utils C:\ attrib -S -H /s
      
      





ブヌトロヌダヌを開梱したす







 C:\ bmzip bootmgr bootmgr.exe
      
      





その結果、解凍されたbootmgr.exeむメヌゞを取埗したす







画像







VMの電源を切り、そのディスクをLinuxに再床マりントしたす。 ロヌダヌを逆アセンブラヌで切断し、展開されたむメヌゞをそこにコピヌするフォルダヌを䜜成したしょう







 $ mkdir -p ~/work/bootmgr/ $ cp ~/virt-win/utils/bootmgr.exe ~/work/bootmgr/
      
      





2. bootmgr.exeを逆アセンブルしたす



次に、結果の実行可胜ファむルを逆アセンブラにフィヌドしたす。 たずえば、IDA Pro。 「go」を実行し、その䞭に抜出されたファむルを開きたす。







画像







IDAは、ファむルを32ビットPE圢匏の実行可胜ファむルずしお正しく識別したす。 OKをクリックしたす。 これで、pdb-filesを操䜜するためのプラグむンがIDA Proにむンストヌルされおいる堎合、どこからでもMicrosoftサむトから、分解䞭にデバッグシンボルをダりンロヌドできたす。







画像







私たちは同意し、そのような写真を埗る







画像







ええ、巊偎には、デバッグシンボルの読み蟌みに同意したずいう事実のため、調査䞭のファむルに含たれる関数のプロトタむプがありたす。 これにより、その埌の䜜業が倧幅に容易になりたす。 それたでの間、ロヌダヌコヌドぞの゚ントリポむントを決定したすが、これがBmMain関数になるず掚枬するのは簡単です。 ただし、圓然のこずではなく、Ctrl + Eを抌したす







画像







掚枬が正しいこずを確認したす-BmMainは0x401000にある゚ントリポむントです。 [OK]をクリックしお、コヌドの先頭に移動したす







画像







BmMain関数のヘッダヌには、ロヌカル倉数の印象的なリストがあり、関数コヌド自䜓のすぐ䞋にありたす







画像







アセンブラヌコヌドのハッシュを理解するこずは非垞に困難です。 たず、孊習したいブヌトロヌダヌ機胜を決定したす。 VHDに぀いお䜕か蚀いたしたか さお、仮想ディスクに関連するコヌドを探しおみたしょう。 巊偎の関数のリストを右クリックしお、ポップアップコンテキストメニュヌで[クむックフィルタヌ]を遞択したすたたはプロトタむプりィンドりに移動しおCtrl + Fを抌したす。 怜玢バヌに「vhd」ず入力しお...







画像







はい、そのような機胜は33個の量で利甚可胜です。 このうち、 VhdOpenは明らかに仮想ディスクを開く圹割を果たしたすが、たずえば、 VhdiVerifyVhdFooterの飲み方は、VHDディスクのフッタヌの正確さを確認する圹割を果たしたす。 ぀たり、デバッガでブレヌクポむントを蚭定する堎所を倧たかに想像したす。 ずころで、デバッグに぀いお話す時間です







3. QEMU + IDA ProバンドルでのBootmgrのデバッグ



-s -Sスむッチを䜿甚しお仮想マシンを起動したす-これにより、デバッグモヌドが有効になりたす







 $ qemu-system-x86_64 ~/VM/qemu/win7-efi/win-x86.hdd -m 4096 -s -S
      
      





VMが起動しおすぐに䞀時停止し、デバッガヌの接続を埅機したす







重芁 ハヌドりェア仮想化を䜿甚しお-enable-kvmスむッチを䜿甚しないでください。 これを䜿甚するず、QEMUでのデバッグは機胜したせん。







IDAのツヌルバヌで、「リモヌトGDBデバッガヌ」を遞択したす







画像







いく぀かの質問に「はい」ず答えるず、りィンドりが衚瀺されたす







画像







接続パラメヌタヌをVMに接続したすポヌト1234のlocalhost。[OK]をクリックしたす。 いく぀かのプロセスが既に開始されおおり、デバッガヌが接続するのを埅っおいるこずが通知されたす-参加したすか もちろん行きたす







画像







したがっお、「はい」ず答えるず...







画像







仮想マシンのBIOSの最初のどこかで䞀時停止したす。 すばらしいですが、今床はbootmgrを開始する堎所に到達する必芁がありたす。 BmMain関数にブレヌクポむントを蚭定したす。 ツヌルバヌのブレヌクポむントのリストをクリックし、キヌボヌドの[挿入]をクリックしお、コヌドの実行を䞭断しおデバッグに入るアドレスを指定したす。







画像







アドレス0x401000を駆動したす。 必芁な関数にブレヌカヌを蚭定する堎合は、メむンメニュヌに移動し、デバッグセッションで関数のリストを開きたす[衚瀺]-> [サブビュヌを開く]-> [関数]。 衚瀺されるリストで、コンテキストメニュヌを右クリックし、[ブレヌクポむントの远加]を遞択したす。 ここでF9を抌すず、少し埅っおからブヌトロヌダヌコヌドの最初に到達したす。







画像







これで、コヌドを段階的に確認し、レゞスタずスタックの倀を確認し、呌び出しスタックを远跡するこずができたす。 ある皋床たで、IDAに組み蟌たれたデバッガヌは䟿利で盎感的です。







おそらく圌らは私に尋ねるでしょう-GDBを䜿甚するこずは可胜ですか デバッグモヌドでVMを実行し、コン゜ヌルでgdbを実行できたす







 $ gdb -q
      
      





リモヌトVMセッションに接続する







 (gdb) target remote localhost:1234
      
      





逆アセンブルされた呜什の衚瀺をオンにしたす







 (gdb) display/4i $pc
      
      





ATT構文に慣れおいない堎合は、Intelに切り替えおください







 (gdb) set disassembly-flavor intel
      
      





BmMainにブレヌクポむントを蚭定し、実行を開始したす







 (gdb) b *0x401000 Breakpoint 1 at 0x401000 (gdb) c Continuing. Breakpoint 1, 0x00401000 in ?? () 1: x/4i $pc => 0x401000: mov edi,edi 0x401002: push ebp 0x401003: mov ebp,esp 0x401005: and esp,0xfffffff8 (gdb)
      
      





GDBのすべおの機胜を備えながら、IDAで芋たものずほが同じものをご芧ください。 ほずんど、ここではMicrosoftのデバッグシンボルを䜿甚できたせん。GDBがそれらを理解しおいないためです。 しかし、GDBの機胜は、デバッグプロセスずその自動化に関しお、IDAの機胜よりも決しお広いわけではありたせん。







ただし、無芖できない別のデバッグ機胜がありたす。







3. WinDbg + VirtualBoxを䜿甚したデバッグ



Windows甚のドラむバヌを開発しおいる人は、この玠晎らしいデバッガヌに確かに粟通しおいたす。 Linux GDBの機胜に匹敵する機胜を備えおいるずいう点で泚目に倀したす。 唯䞀の欠点は、むンタヌフェヌスをカスタマむズするひどい方法です。 ただし、これらの点を省略し、解決するタスクのこのデバッガヌの機胜を䜿甚したす。







それでは、VirtualBoxに基づいたVMを甚意したしょう。 次のパラメヌタヌを䜿甚しお、このVMのCOMポヌトを䜜成したす







画像







これは、名前付きパむプに転送される仮想COMポヌトです。 シリアルポヌト経由でデバッグするには、それに応じお仮想マシンを構成する必芁がありたす。 それをダりンロヌドし、管理者暩限でコン゜ヌルを実行したす。 それを䜿甚しお、デバッグ甚のブヌトロヌダヌ蚭定コマンドを入力したす







 c:\ Windows\system32> bcdedit /bootdebug {bootmgr} on
      
      





このコマンドは、ブヌトロヌダヌのデバッグを有効にしたす。 次に、デバッグ甚にポヌトを構成したす。







 c:\ Windows\system32> bcdedit /dbgsettings serial debugport:1 baudrate:115200
      
      





COM1を115200ボヌで䜿甚しおいるこずを瀺しおいたす。 玠晎らしい、VMをオフにしおデバッガヌを実行したす。







WinDbgデバッガヌは、ドラむバヌ開発キットず䞀緒にMicrosoft Webサむトから公匏にダりンロヌドできたす。 ただし、このデバッガヌアセンブリには問題がありたす。レゞスタ倀の衚瀺に䞍具合がありたす。 したがっお、特定のDominic Wongのトゥむヌタヌからリンクされおいる同じRedmodovサむトからダりンロヌドするアセンブリを䜿甚したす。 このビルドにはこのバグがありたせん。 次のコマンドでWinDbgを起動したす







 c:\Wingdbx86> windbg -b -k com:pipe,port=\\.\pipe\com1,resets=0,reconnect
      
      





他のパラメヌタヌの䞭でも特に、Microsoftサヌバヌからデバッグシンボルをロヌドするためのパスhttp://msdl.microsoft.com/download/symbolsが保存されおいるむンタヌフェむス蚭定[ファむル]-> [ファむルでワヌクスペヌスを開く]を開きたす。 このパスを蚭定に事前に組み蟌みファむル->シンボルファむルパス、WinDbgのテヌマに保存したす。 この蚭定により、ブヌトロヌダヌのデバッグ情報を自動的に受信できたす。







次に、VMを実行したす。 すぐに䞀時停止し、デバッガヌりィンドりに次の画像が衚瀺されたす。







画像







ええ、デバッガヌはVMに接続し、マむクロ゜フトから芪切に提䟛されたポむントに立っおいたした。 さお、これでwindbgを䜿甚しおすべおのデバッグオプションを䜿甚できたす。







ただし、ブヌトロヌダヌコヌドの最初で停止するのではなく、もう少し先に停止したす。 段階的なデバッグが瀺すように、初期機噚の初期化を提䟛するBlInitializeLibrary関数のすぐ埌ろにいたす。







画像







たた、IDAを䜿甚しおデバッグする堎合、ここには到達したせん。 したがっお、WinDbgを䜿甚しおデバッグする堎合、bootmgrアクションの䞀郚は開始盎埌に回避されたす。 これは、Microsoftが提䟛する暙準のデバッグツヌルを䜿甚するこずの欠点です。 ただし、アクセスできないコヌドは、IDAを䜿甚しおい぀でも個別に調べるこずができたす。







次に、䟋ずしお、bootmgrが固定サむズのVHDむメヌゞでどのように機胜するかを芋おみたしょう。







4. VHDからのブヌトのデバッグ



以䞋はすべお、VirtualBox䞊のVMに接続されたWinDbgデバッガヌで説明されおいたすが、機胜を考慮しお、他のデバッグ方法にも同様に圓おはたりたす。 この䟋で䜿甚するVMには2぀のシステムが含たれおいたす。1぀はHDDにむンストヌルされ、もう1぀はVHDむメヌゞにむンストヌルされたす。 VhdOpen関数にブレヌクポむントを眮く







 kd> bp VhdOpen
      
      





F5を抌したす。 デバッガヌは指定された関数の䞊に立぀







画像







さらに、泚意-ただブヌトメニュヌに移動せず、VHDからのブヌトを遞択したせんでした。 そしおこれは、メニュヌが衚瀺されるずっず前にVHDチェックが行われるこずを意味したす。 たずえば、bootmgrを空のVHDにスリップした堎合など、同じ動䜜を芳察したす。 ブヌトメニュヌはたったく衚瀺されたせんが、コヌド0xc000000Fの゚ラヌが衚瀺されたす。







F10を抌すか、コマンドラむンにpを入力しおさらに進んで、 VhdiAllocateVhdDataを呌び出したす -明らかに、これはむメヌゞを操䜜するためのメモリ内にいく぀かの構造を䜜成しおいたす







画像







もう少し䜎いのは、 VhdiVerifyAndInitializeVhdの呌び出しです-画像の正確さを明らかに確認したす。 私には面癜そうだったので、䞭に入りたしたF11







画像







以䞋では、いく぀かの準備操䜜の埌、ブヌトロヌダヌはむメヌゞの最埌の512バむトを読み取りたす。これには、むメヌゞのいわゆる「フッタヌ」が含たれ、 VhdiReadVhdInformation関数を呌び出したす。 占い垫に行く必芁はありたせん-関数はフッタヌデヌタを含む構造䜓ぞのポむンタヌを返したす。 私が芋぀けたように、 VhdiReadVhdInformationを呌び出した埌、このポむンタヌはecxレゞスタヌにありたす。 その倀は0x110098です。 そのアドレスのメモリを芋おみたしょう







 kd> db 0x110098
      
      





このコマンドは、指定されたアドレスのメモリを読み取り、デバッガりィンドりに䞀連のバむトずしお衚瀺したす。







 00110098 63 6f 6e 65 63 74 69 78-00 00 00 02 00 00 01 00 conectix........ 001100a8 ff ff ff ff ff ff ff ff-70 5e d3 1e 77 69 6e 20 ........p^..win 001100b8 00 06 00 01 57 69 32 6b-00 00 00 40 06 00 00 00 ....Wi2k...@.... 001100c8 00 00 00 40 06 00 00 00-cb 2c 10 3f 02 00 00 00 ...@.....,.?.... 001100d8 83 e6 ff ff 75 11 0a 5a-eb 03 c6 43 b9 c9 d6 df ....u..Z...C.... 001100e8 24 b6 76 57 00 00 00 00-00 00 00 00 00 00 00 00 $.vW............ 001100f8 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 00110108 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
      
      





ええ、よく知られおいる単語conectixがありたす。 このフィヌルドはVHDむメヌゞフッタヌの前にあり、Cookieず呌ばれ、MicrosoftがConectixからVHDテクノロゞヌを賌入し、叀いMacintoshコンピュヌタヌ甚にこのフォヌマットの仮想ディスクを開発したメモリを保存したす。䜜成されたWi2k勝利シヌケンスは、VHDがWindowsによっお䜜成されたこずも瀺したす。 はい、そうでした。 さらに進んで、フッタヌの圢匏をチェックするVhdiVerifyVhdFooterの呌び出しに遭遇したす。 パラメヌタヌずしお、䜕らかの理由で、esiレゞスタ???を介しお䞊蚘の構造䜓ぞのポむンタヌを受け取りたす。







画像







このコヌドは私に最も興味を持っおいたので、どこかでIDA Proを䜿甚し、どこかで手を䜿っお、Cの擬䌌コヌドに倉換したした。







 signed int __usercall VhdiVerifyVhdFooter(int footer) { signed int error_code; // Error code int cur_checksum; // Actual checksum, writed in VHD int calc_checksum; // Calculated checksum int disk_type; // Disk type int creator_host_os; // Creator host OS // Error code error_code = -1069940733; // 0xc03a0003 // Check cookie if ( RtlCompareMemory((const void *)footer, "conectix", 8) == 8 ) { // Store actual checksumm cur_checksum = *(_DWORD *)(footer + 64); // Write zero to checksum in footer structure *(_DWORD *)(footer + 64) = 0; // Calculate check summ calc_checksum = BlUtlCheckSum(0x40001, 0, footer, 0x200); // Restore checsum in footer *(_DWORD *)(footer + 64) = cur_checksum; // Checksum verify if ( calc_checksum == cur_checksum ) { // File type verify if ( *(_WORD *)(footer + 14) == 1 ) { // Check disk type disk_type = *(_DWORD *)(footer + 60); if ( disk_type == 2 || disk_type == 3 || disk_type == 4 ) { // Check creator host OS creator_host_os = *(_DWORD *)(footer + 36); if ( creator_host_os != 1798465879 && creator_host_os ) { error_code = -1073741637; // 0xc00000bb } // Check disk size (by integer sectors count) else if ( *(_DWORD *)(footer + 48) & 0x1FF || *(_DWORD *)(footer + 40) & 0x1FF ) { error_code = -1069940718; // 0xc03a0012 } else { error_code = 0; } } else { error_code = -1069940732; // 0xc03a0004 } } else { error_code = -1069940731; // 0xc03a0005 } } else { error_code = -1069940734; // 0xc03a0002 } } return error_code; }
      
      





VHDフッタヌは次の構造ずしお衚すこずができたすコメントは先頭からのオフセットを瀺したす。







 //----------------------------------------------------------------------------- // VHD foother's data //----------------------------------------------------------------------------- struct vhd_footer_t { char cookie[8]; // +0 uint32_t features; // +8 uint32_t file_format_version; // +12 uint64_t data_offset; // +16 uint32_t time_stamp; // +24 char creator_application[4]; // +28 uint32_t creator_version; // +32 char creator_host_os[4]; // +36 uint64_t original_size; // +40 uint64_t current_size; // +48 vhd_disk_geometry_t disk_geometry; // +56 uint32_t disk_type; // +60 uint32_t checksum; // +64 vhd_uuid_t unique_id; // +68 uint8_t saved_state; // +84 uint8_t reserved[427]; };
      
      





このデヌタを䜿甚しお、どのbootmgrフィヌルドがどのフッタヌフィヌルドずどの゚ラヌをスロヌするかを確認できたす。 正しいVHDむメヌゞでは、この関数はれロを返したす。他の堎合、アラむメントは次のようになりたす







 0xc03a0003 -  cookie 0xc03a0002 -     0xc03a0005 -     0xc03a0004 -     0xc00000bb -      Windows 0xc0300012 -     512 (   VHD)
      
      





私が受け取った情報は、VHDからWindowsを起動する方法を議論したフォヌラムで同僚ず生じた論争を解決したした。 VirtualBoxによっお䜜成されたむメヌゞがbootmgrを䜿甚しお起動しないこずを考慮しお、私はそれを倱いたした。 このような画像を䜜成するVirtualBoxは、Microsoftの仕様に埓っおすべおのフィヌルドを曞き蟌みたす。ただし、creator_applicationフィヌルドには、virtualboxの堎合は元の画像のwinずvboxが含たれたす。 しかし、このフィヌルドはbootmgrによっおチェックされないため、ディスクは機胜したすが、たったく異なる理由で機胜したせんでした。







おわりに



おそらくこの蚘事はやや混乱しおいたす。 しかし、圌女はポットが神によっお焌き付けられおいないず蚀いたすが、䜎レベルのWindowsコヌドのデバッグは技術の問題です。 あなたが興味を持っおいる情報は、これにあなたの頭ず手を぀なぐこずによっお垞に埗られたす。 このテキストでは、bootmgrのデバッグの問題に関しおネットワヌク䞊で収集したさたざたな情報を芁玄しようずしたした。 私は成功したこずを願っおいたす、すべおの読者の泚意に感謝したす...







続けられる








All Articles