Tana Gone
Tana Gone
2 min read

Categories

Z68チップセットのマシンのCR2032電池を交換して久方ぶりに起動してみた。おそらく2019年ぶり。Windows10のバージョンが1709だった。すっかり浦島太郎なのでGrokに色々尋ねてみた。

Z68マシンにはVisual Basic6のコードが配置されてる。SQLite3のDBへ接続できると嬉しい。VB6のInstall Diskも見つけた。😃

Q

UEFI BIOSを搭載したIntel CPU搭載のパソコンのブートプロセスについて教えて下さい。UEFI BIOSはDiskの先頭にあるEFI System Partitionの中から、どのような順番でブートセレクタを見つけるのですか? Windows10がInstallされたDiskの場合、EFI/Microsoft/Bootフォルダの中に配置されているbootmgfw.efiがブートセレクタの様です。

A

UEFI BIOSを搭載したIntel CPUのパソコンのブートプロセスと、EFI System Partition(ESP)からのブートセレクタの検索順序について、以下に詳細に説明します。UEFIブートプロセスの概要UEFI(Unified Extensible Firmware Interface)は、従来のレガシーBIOSに代わるファームウェア規格で、モダンなPCで広く採用されています。UEFIブートプロセスは以下のステップで進行します:

  1. 電源投入と初期化(SECフェーズ)
    • システム電源が投入されると、UEFIファームウェアが起動し、CPU、メモリ、基本的なハードウェアを初期化します。
    • セキュリティ(SEC: Security)フェーズでは、ファームウェアの信頼性を検証します。
  2. Pre-EFI初期化(PEIフェーズ)
    • メモリや主要なハードウェアの初期化をさらに進め、システムをブート可能な状態に準備します。
  3. ドライバ実行環境(DXEフェーズ)
    • デバイスドライバやUEFIアプリケーションがロードされ、ストレージデバイスやファイルシステムにアクセス可能になります。
    • ここで、ブートローダーの検索が始まります。
  4. ブートデバイス選択(BDSフェーズ)
    • UEFIファームウェアは、ブート可能なデバイスやパーティションをスキャンし、ブートローダーを特定します。
    • ユーザーが設定したブート順序や、UEFIのNVRAMに保存されたブートエントリを参照します。
  5. トランスジェントシステムロード(TSLフェーズ)
    • 選択されたブートローダーが実行され、オペレーティングシステム(OS)のカーネルがロードされます。
  6. ランタイム(RTフェーズ)
    • OSが制御を引き継ぎ、UEFIはバックグラウンドでランタイムサービスを提供します。

EFI System Partition(ESP)とブートセレクタの検索順序UEFIは、ディスクの先頭にあるEFI System Partition(ESP)からブートセレクタ(ブートローダーやOSローダー)を探します。ESPは通常、FAT32ファイルシステムでフォーマットされており、UEFIアプリケーション(例: .efiファイル)を格納しています。以下は、UEFIがブートセレクタを見つける際の具体的なプロセスです:1. ブートエントリの参照(NVRAM)

  • UEFIファームウェアは、まずNVRAM(非揮発性メモリ)に保存されたブートエントリをチェックします。

  • ブートエントリには、ブートローダーの正確なパス(例: \EFI\Microsoft\Boot\bootmgfw.efi)や、ブートするデバイスの情報が含まれています。

  • Windows 10の場合、通常は以下のエントリが登録されています:

    \EFI\Microsoft\Boot\bootmgfw.efi
    
  • ユーザーがUEFI設定画面でブート順序を変更した場合、NVRAMの優先順位に従ってブートローダーが選択されます。

\2. デフォルトフォールバックパス

  • NVRAMに有効なブートエントリがない場合、UEFIは標準的なフォールバックパスを検索します。

  • UEFI仕様では、以下のデフォルトパスが優先的にチェックされます:

    \EFI\BOOT\BOOTX64.EFI
    

    (64ビットシステムの場合。32ビットシステムではBOOTIA32.EFI)

  • このファイルは、ESPのルート直下の\EFI\BOOTディレクトリに配置されます。リムーバブルメディアや新規インストール時に使用されることが多いです。

\3. ESPのスキャンとブートローダーの検索

  • UEFIは、接続されているすべてのストレージデバイス(HDD、SSD、USBなど)のESPをスキャンします。

  • ESP内のディレクトリ構造を探索し、.efi拡張子を持つ実行可能なファイルを検索します。

  • Windows 10の場合、以下のディレクトリにブートローダーが配置されています:

    \EFI\Microsoft\Boot\bootmgfw.efi
    
  • このbootmgfw.efiは、Windows Boot Managerであり、Windowsカーネルのロードを担当します。

\4. ブート優先順位の決定

  • UEFIは、NVRAMに登録されたブートエントリを優先しますが、複数のブート可能なデバイスやエントリが存在する場合、以下の順序で選択されます:
    1. UEFI設定で指定されたブート順序(例: 特定のディスクやパーティション)。
    2. NVRAMに登録されたブートエントリ(例: Windows Boot Manager)。
    3. フォールバックパス(例: \EFI\BOOT\BOOTX64.EFI)。
  • ユーザーがUEFIブートメニュー(例: F12キーやEscキー)で手動でデバイスを選択することも可能です。

Windows 10の具体例Windows 10がインストールされたディスクの場合、以下のように動作します:

  • ESP内に\EFI\Microsoft\Boot\bootmgfw.efiが存在。
  • このファイルは、Windows Boot Managerとして機能し、Windowsカーネル(winload.efi)をロードします。
  • UEFIはNVRAMのブートエントリ(例: Boot0001: Windows Boot Manager)を参照し、\EFI\Microsoft\Boot\bootmgfw.efiを直接実行。
  • もしNVRAMエントリが破損している場合や存在しない場合、UEFIはESPをスキャンし、フォールバックパス(\EFI\BOOT\BOOTX64.EFI)を試みますが、Windows環境では通常このパスは使用されません。

注意点

  • マルチブート環境:複数のOSがインストールされている場合、UEFIはNVRAMのブートエントリを優先しますが、GRUB(Linux用ブートローダー)など他のブートローダーがESPに存在する場合、UEFI設定で優先順位を変更する必要があります。
  • セキュアブート:セキュアブートが有効な場合、UEFIは署名されたブートローダーのみを実行します。Windowsのbootmgfw.efiはMicrosoftの署名付きで、セキュアブートに対応しています。
  • ESPの破損:ESPが破損したり、bootmgfw.efiが見つからない場合、ブートに失敗します。この場合、Windowsリカバリ環境やUEFI設定で修復が必要です。

まとめUEFI BIOSは、以下の順序でブートセレクタを見つけます:

  1. NVRAMに登録されたブートエントリ(例: \EFI\Microsoft\Boot\bootmgfw.efi)を優先。
  2. NVRAMエントリがない場合、ESP内のフォールバックパス(\EFI\BOOT\BOOTX64.EFI)を検索。
  3. 必要に応じて、ESP内の他の.efiファイルをスキャン。

Windows 10の場合、通常は\EFI\Microsoft\Boot\bootmgfw.efiがブートセレクタとして機能し、NVRAMのエントリを介して直接ロードされます。

Q

UEFIブートプロセスの概要について解説しているWebサイトを紹介して下さい。英語でも構いません。

A

UEFIブートプロセスについて詳しく解説している信頼性の高いWebサイトを以下に紹介します。英語と日本語のサイトをそれぞれピックアップしました。英語のWebサイト

  1. UEFI Forum - Official UEFI Specification
    • URL: https://uefi.org/specifications
    • 説明: UEFI Forumの公式サイトで、UEFI仕様の詳細なドキュメントが提供されています。ブートプロセスの技術的な詳細(SEC、PEI、DXE、BDSフェーズなど)が記載されており、開発者や技術者向けに詳細な情報が得られます。
    • 特徴: 公式仕様書(PDF形式)としてダウンロード可能。UEFIの標準化された動作を理解するのに最適。
  2. Microsoft Docs - Windows UEFI Firmware
    • URL: https://learn.microsoft.com/en-us/windows-hardware/drivers/bringup/uefi-firmware
    • 説明: Microsoftの公式ドキュメントで、Windows環境におけるUEFIブートプロセスの概要が解説されています。特に、Windows Boot Manager(bootmgfw.efi)やセキュアブートの動作に焦点を当てています。
    • 特徴: Windows特有のUEFI実装についての実践的な情報が豊富。
  3. OSDev Wiki - UEFI
    • URL: https://wiki.osdev.org/UEFI
    • 説明: OS開発者向けのコミュニティWikiで、UEFIブートプロセスの概要や実装の詳細が説明されています。初心者から上級者まで理解しやすい内容で、ブートローダーの作成方法などもカバー。
    • 特徴: 実際のコード例や実装のヒントが含まれ、技術的な深掘りが可能。

日本語のWebサイト

  1. ITmedia エンタープライズ - UEFIの基礎知識
    • URL: https://www.itmedia.co.jp/enterprise/articles/1408/25/news003.html
    • 説明: UEFIの基本的な仕組みやレガシーBIOSとの違い、ブートプロセスの概要を解説した記事。初心者にもわかりやすく、技術的な詳細も適度に含まれています。
    • 特徴: 日本企業向けの視点で、UEFIの導入背景やメリットも説明。
  2. 日経クロステック - UEFIブートとセキュアブートの解説
    • URL: https://xtech.nikkei.com/it/article/COLUMN/20120710/408305/
    • 説明: UEFIブートプロセスとセキュアブートの仕組みについて、Windows環境を中心に解説した記事。ESPやブートローダーの役割についても触れています。
    • 特徴: 実務者向けに簡潔にまとめられており、Windows 10との関連性がわかりやすい。

注意点

  • 英語サイトは技術的な詳細や最新の仕様にアクセスするのに適していますが、内容が専門的で読むのに時間がかかる場合があります。
  • 日本語サイトは初心者や実務者向けに簡潔にまとめられていますが、最新のUEFI仕様(例: UEFI 2.10以降)の詳細が不足している場合があります。
  • 必要に応じて、UEFI Forumの公式仕様書を参照すると、最新かつ正確な情報を得られます。

もし特定のトピック(例: セキュアブートやマルチブート環境)に絞ったサイトが必要な場合、教えてください!さらに絞り込んで紹介します。

Q

WindowsがUTF-8のサポートを開始した時期は?

A

\1. WindowsがUTF-8のサポートを開始した時期WindowsにおけるUTF-8のサポートは段階的に進化してきましたが、以下に主要なマイルストーンをまとめます:

  • 初期のサポート(Windows NT系、1990年代後半):
    • Windows NT 3.1(1993年)以降、Windowsは内部的にUnicode(UTF-16)を採用。UTF-8は直接的なシステムエンコーディングとしては使用されていませんでしたが、APIを通じて限定的にサポート。
    • Windows 98やWindows 2000(1999年~2000年)では、特定のAPI(例: MultiByteToWideCharやWideCharToMultiByte)でコードページCP_UTF8(65001)がサポートされ、UTF-8の文字列を処理可能に。これが実質的なUTF-8サポートの開始点。
    • 特に、MDAC(Microsoft Data Access Components)2.5以降(1999年、ADO 2.5と同時期)で、ADOのStreamオブジェクトがCharsetプロパティを通じてUTF-8を明示的にサポート。
  • 本格的な普及(Windows XP以降):
    • Windows XP(2001年)で、UTF-8のコードページがより広く利用可能になり、ファイルシステムやテキスト処理でのサポートが強化。
    • ただし、Windows全体のシステムコードページとしてUTF-8を標準設定可能にしたのは、Windows 10 May 2019 Update(バージョン1903、2019年5月)で、システムロケールをUTF-8に設定するオプション(Beta機能)が追加された。
  • 完全なUTF-8サポート(最近の進化):
    • Windows 11や最新のWindows 10では、UTF-8のサポートがさらに強化され、例えばコマンドプロンプトやPowerShellでのUTF-8入出力が標準的に扱えるように。
    • ただし、従来のアプリケーション(例: Visual Basic 6)では、依然としてコードページ変換や専用APIを介した処理が必要。

結論: WindowsでのUTF-8サポートは、Windows 2000(2000年)頃にAPIレベルで本格的に始まり、2019年にシステム全体のオプションとして利用可能になりました。

Q

Visual Basic6でADODB.Streamを使ってUTF-8文字列をShift_JIS文字列へ変換できますか?

A

\2. Visual Basic 6でADODB.Streamを使ってUTF-8文字列をShift_JIS文字列へ変換回答: はい、Visual Basic 6(VB6)でADODB.Streamを使用してUTF-8文字列をShift_JIS文字列に変換することは可能です。ADO 2.5以降のADODB.Streamオブジェクトは、Charsetプロパティを利用してエンコーディングを指定できるため、UTF-8とShift_JIS(コードページ932)の間で変換が実現できます。以下に、VB6でADODB.Streamを使ってUTF-8文字列をShift_JISに変換するサンプルコードを示します。 サンプルコード

Option Explicit

Sub ConvertUTF8ToShiftJIS()
    Dim streamIn As ADODB.Stream
    Dim streamOut As ADODB.Stream
    Dim utf8Text As String
    Dim shiftJisText As String
    
    ' サンプルUTF-8文字列(実際にはファイルやデータベースから取得する場合も)
    utf8Text = "こんにちは、UTF-8文字列!"
    
    ' 入力用Streamオブジェクト(UTF-8)
    Set streamIn = New ADODB.Stream
    With streamIn
        .Open
        .Type = adTypeText ' テキストモード
        .Charset = "utf-8" ' 入力はUTF-8
        .WriteText utf8Text ' UTF-8文字列を書き込み
        .Position = 0 ' ストリームの先頭に戻る
    End With
    
    ' 出力用Streamオブジェクト(Shift_JIS)
    Set streamOut = New ADODB.Stream
    With streamOut
        .Open
        .Type = adTypeText ' テキストモード
        .Charset = "shift_jis" ' 出力はShift_JIS
        ' 入力ストリームからデータをコピー
        streamIn.CopyTo streamOut
        .Position = 0 ' ストリームの先頭に戻る
        shiftJisText = .ReadText(adReadAll) ' Shift_JISとして読み出し
    End With
    
    ' 結果を表示
    Debug.Print "Shift_JIS Text: " & shiftJisText
    
    ' ストリームを閉じる
    streamIn.Close
    streamOut.Close
    Set streamIn = Nothing
    Set streamOut = Nothing
End Sub

コードの説明

  1. 参照設定:
    • VB6プロジェクトでADODBを使用するには、プロジェクトの参照に「Microsoft ActiveX Data Objects 2.5 Library」以降(2.5、2.6、2.8など)を追加してください。ADO 2.5以降でStreamオブジェクトが利用可能です(前述のADO 2.5新機能参照)。
  2. ストリームの設定:
    • streamInをUTF-8エンコーディングで開き、入力テキストを書き込み。
    • streamOutをShift_JISエンコーディングで開き、CopyToメソッドでstreamInの内容をコピー。これにより、内部でエンコーディング変換が行われる。
  3. Charsetの指定:
    • Charsetプロパティに”utf-8”や”shift_jis”を指定。Windowsのコードページ名(例: “windows-1252”、”shift_jis”)や標準名(”utf-8”)が使用可能。
    • サポートされるエンコーディングは、インストールされているMDACバージョンやOSのコードページサポートに依存。
  4. 注意点:
    • BOM(Byte Order Mark): UTF-8ストリームにBOMが含まれる場合、出力に影響する可能性があるため、必要に応じてPositionやReadTextで調整。
    • エラー処理: 実際のアプリケーションでは、On Error Resume Nextやエラーチェックを追加して、コードページ非対応やデータ破損をハンドル。
    • 環境依存: Windows 2000以降で動作確認が必要。Shift_JISは日本語環境でサポートされますが、非日本語環境ではコードページ932がインストールされていない場合にエラーとなる可能性。

ファイルからの変換例もしUTF-8で保存されたテキストファイルをShift_JISに変換したい場合、以下のようにLoadFromFileとSaveToFileを使用します:

Sub ConvertUTF8FileToShiftJISFile()
    Dim streamIn As ADODB.Stream
    Dim streamOut As ADODB.Stream
    
    Set streamIn = New ADODB.Stream
    With streamIn
        .Open
        .Type = adTypeText
        .Charset = "utf-8"
        .LoadFromFile "C:\input.txt" ' UTF-8ファイル
    End With
    
    Set streamOut = New ADODB.Stream
    With streamOut
        .Open
        .Type = adTypeText
        .Charset = "shift_jis"
        streamIn.CopyTo streamOut
        .SaveToFile "C:\output.txt", adSaveCreateOverWrite ' Shift_JISファイル
    End With
    
    streamIn.Close
    streamOut.Close
    Set streamIn = Nothing
    Set streamOut = Nothing
End Sub

補足

  • WindowsのUTF-8サポートとVB6の関係: VB6自体は内部的にUnicode(UTF-16)を使用しますが、文字列操作は主にシステムのデフォルトコードページ(例: 日本語環境ではShift_JIS)に依存。ADODB.Streamを使うことで、明示的にUTF-8や他のエンコーディングを扱えるため、VB6での多言語対応が容易。
  • ADOバージョン: ADO 2.5以降(2.6推奨)を使用。MDAC 2.6は2000年にリリース(前述のADO 2.6更新内容参照)で、Streamのエンコーディング処理が安定。
  • 制限: VB6は古い技術(最終リリース1998年)であり、最新のUTF-8処理(例: Windows 10のシステムUTF-8モード)には完全対応しない。複雑なUnicode処理では、API(MultiByteToWideCharなど)との併用を検討。

もし特定のシナリオ(例: ファイルサイズの制限、エラー処理の詳細)や追加のコード例が必要であれば、教えてください!