Visual StudioでUEFI BIOSを作成します。 パート3-Russifyフロントページ

はじめに



この記事では、ロシア語のフォントを作成し、それを使用してedk2の例からメイン設定ページをロシア語化します。







興味のある方-猫の下で歓迎してください。



免責事項
KDPVのロシア語フォントの高さは、作者が半日かけて8x19フォントビットマップを探し、そこからグリフを取得できましたが、Win7ターミナルコンソールから8x16を見つけられなかったためです。 誰かがこのトピックに深く没頭している場合-理想的には8x19ビットマップで固定フォントの名前を付けて-無料で、写真と記事を修正します。



メインページにロシア語を表示するには、使用するファームウェアのソースにアクセスできる必要があります。 すなわち 記事を読んだ後、仮想マシンまたは実マシン上でロシア語ロケールをUEFI BIOSアセンブリに追加できますが、元のファームウェアコードにアクセスできないため、記載されている方法で任意のブランドの既存のハードウェアシステムにロシア語を追加することはできません。 つまり、理論的には可能ですが、この記事で説明するよりもはるかに多くの労力と知識が必要になります。



まず、少しの理論。 そもそも、UEFIにはTrue Typeフォントはありません。 少なくとも今、 UEFI仕様2.6の実装では。 固定のみ。 フォントは、いわゆるグリフで構成されます-既定では幅と高さが固定された小さなビットマップ-8x19ですが、もちろん他のサイズ、たとえば象形文字の2倍の幅もあります。 大文字の「A」グリフは次のとおりです。







このビットマップは、 EFI_NARROW_GLYPH構造の形式でテキスト形式で保存されます。



typedef struct { CHAR16 UnicodeWeight; UINT8 Attributes; UINT8 GlyphCol1[EFI_GLYPH_HEIGHT]; } EFI_NARROW_GLYPH;
      
      





この構造のフィールドをより詳細に検討してください。



UnicodeWeight - UCS-2の文字コード。 これについては、たとえばここで 、またはGoogle UCS2を入力して読むことができます



属性 -フォントの高さと幅をピクセル単位で示し、文字の後にスペースが必要か、シングル幅かダブル幅かを示します。 現時点では、このフィールドはe dk2で分析されていません。代わりに、システムフォントの実装にゼロ値があります。 UEFI 2.6仕様の 31.3.2.2節EFI_NARROW_GLYPHの属性の説明を見ることができます。



ロシア文字のコードは04xxで、 04はロシア語のエンコード、xxは「A」(0410)から「I」(044F)までの対応するロシア文字のコードです。これらのコードはUnicodeWeightフィールドに含まれます。



彼らが言うように、説明を百回読むよりも一度見たほうがいい。 上記のEFI_NARROW_GLYPH構造体の要素として、英語のエンコード00xxのスペースグリフは次のようになります。



 { 0x0020, //0x20 -  ,  UCS-2  ASCII 0x00, //,  , {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}},//   ,  ,  
      
      





そして、これは大文字Aのグリフです:



 { 0x0041, // 0x41 -   “A” 0x00, // {0x00,0x00,0x00,0x10,0x38,0x6C,0xC6,0xC6,0xC6,0xFE,0xC6,0xC6,0xC6,0xC6,0xC6,0x00,0x00,0x00,0x00}},//  “A”,    
      
      





これまでのところ、理論により、私たちは実践と実験に目を向けています。 同時に、前に約束したように、 UEFIシェルウィンドウを開く前にF5を押すと、10秒の時間に到達する必要があります-これはすでに仕事に非常に快適です。



UEFIドライバーウィザードでプロジェクトを作成する



名前WorkspaceC:/ FW / edk2として指定します。 前の記事のように、最初と2番目の設定ページを作成し、[ 完了 ]をクリックします。 もちろん、プロジェクトの名前を変更する必要があります、 Matreshkaを入れてください -それはプロセスを通過する一見から隠された実装の微妙さを反映しています。

対応するスクリーンショットを提供することをお勧めします(もちろん、あなたの場合のGUIDは完全に異なって生成されます):











まだ最後までscられている場合は、おそらくワークスペースが誤って指定されています。 すべてがうまくいったと信じています。 UEFIドライバーウィザードを閉じます。



Visual Studioでプロジェクトを作成する



ソリューションNT32を開き、その中に新しいプロジェクトを作成し、[ ソリューション ]を右クリックして、[追加]- > [新しいプロジェクト]を選択し、 プロジェクトの種類Makefile Projectを選択します。 既に推測したプロジェクトの名前-Matreshka







最初の記事ではこれを詳細に説明すべきであり、3番目の記事では-すでに多すぎるため、スクリーンショットなしでさらに進んでいきます。 プロジェクトの設定プロセスで不明な点がある場合は、 最初の記事に戻って写真をご覧ください。



作成したプロジェクトのプロパティを開きます( Matreshkaプロジェクトを右クリックし、[ プロパティ ]を選択します



NMake設定



ビルドコマンドラインで



 set NASM_PREFIX=C:\FW\NASM\ call c:\FW\edk2\edksetup.bat --nt32 build –p Nt32Pkg/Nt32Pkg.dsc -m EducationPkg\Matreshka\Matreshka.inf
      
      





そしてもちろん、 ビルドの行は最初の記事の行とは異なるため 、説明が必要です。 この行を解析しましょう:



 –p Nt32Pkg/Nt32Pkg.dsc
      
      





これは、 Nt32Pkgパッケージのみを再コンパイルする必要があることをedk2に示しています。 残りを再コンパイルする必要はありません。厳密に言うと、彼女のためではなく、最初の近似値なので、edk2ツリー内のすべてのパッケージをチェックしてソースファイルの変更を確認する必要があります。 gitからダウンロードしたときに気づいた)。



 -m EducationPkg\Matreshka\Matreshka.inf
      
      





Matreshkaモジュールのみを再コンパイルし、残りの部分には触れないことの表示。



これらの2つの手順により、 edk2ツリー内の他のすべてのファイルの変更を表示するだけでなく、時間を節約できます。この場合、 NVRAMイメージは再作成されません。まず、時間がかかり、次に、そこに入れた情報が消去されます。最後の実行で。 これは必要ありませんが、次の記事では必要になります。



[ すべてのコマンドラインを再構築]行で

最初の記事からの変更はありません。 新しいNVRAMイメージを作成して、 edk2ツリー全体を調べます(必要に応じて再コンパイルします) 。 問題はMatreshkaプロジェクトのソースコードの編集に限定されないため、他のプロジェクトにクロールする必要があり、 PCDはこの目的には適していません。 ただし、ここでは時間を節約するためにツリー全体をクリーンに実行するのではなく、次のオプションに配置します。 だから:



 set NASM_PREFIX=C:\FW\NASM\ call c:\FW\edk2\edksetup.bat --nt32 build
      
      





Clean Command Line行で、 edk2ツリー全体クリアします。



 set NASM_PREFIX=C:\FW\NASM\ call c:\FW\edk2\edksetup.bat --nt32 build clean
      
      





すべてNMake設定で。



デバッグ設定



コマンドライン:



 C:\FW\edk2\Build\NT32IA32\DEBUG_VS2010x86\IA32\SecMain.exe
      
      





作業ディレクトリ行



 C:\FW\edk2\Build\NT32IA32\DEBUG_VS2010x86\IA32\
      
      





Visual Studioの設定で終了しました。



Nt32Pkgにプロジェクトを追加します



ファイルを開く



 C:\FW\edk2\Nt32Pkg\Nt32Pkg.dsc
      
      





そして、前回追加された行を探します:



 EducationPkg/MyFirstDriver/MyFirstDriver.inf
      
      





以前のMyFirstDriverプロジェクトでは、フレーズを入力せずに先に進むことができるように、毎回複数の文字を入力することにすぐに飽きるので、 記号でコメントします。 次に、ご想像のとおり、次の行を追加します。



 EducationPkg\Matreshka\Matreshka.inf
      
      





最後の記事で説明した番号2を実行しなかった場合は、 MyFirstDriverの行がなく 、コメントの後にMatreshkaの行を追加します



 # Add new modules here
      
      





startup.nshを編集してドライバーを自動実行する



今回は、 Visual Studioでディレクトリからstartup.nshファイルを直接開きます。



 C:\FW\edk2\Build\NT32IA32\DEBUG_VS2010x86\IA32
      
      





私たちはそれに一行コメントします



 # load MyFirstdriver.efi
      
      





そして、行を追加します



 load Matreshka.efi
      
      





すべて設定あり。 F5に従ってプロジェクトをコンパイルし、ドライバーの自動ロードを調べますが、まだ何も実行されていません。 それはコンパイルされてロードされます-さらに進む、いいえ-エラーを修正します。



まず、現在の状況を調べます。



Visual StudioでMatreshkaプロジェクトを右クリックし、[ 追加 ]- > [既存のアイテム ]を選択して、ディレクトリに移動します。



 C:\FW\edk2\EducationPkg\MyFirstDriver
      
      





マウスですべてのファイルを選択し、[ 追加 ]をクリックして、Visual StudioのMatreshkaプロジェクトに追加します。



Matreshka.cファイルを開き、一番下に作成します。すべての関数の後、関数MyTestString()



 EFI_STATUS EFIAPI MyTestString(void){ EFI_STATUS Status; EFI_HII_FONT_PROTOCOL *mHiiFontProtocol; EFI_FONT_DISPLAY_INFO *FontInfo; CHAR16 TestString[] = L" , Test String\n\r"; //  ,  ,     Status = gST->ConOut->OutputString(gST->ConOut, TestString); // ,      DEBUG((EFI_D_INFO, "OutputString status = %r\n\r", Status)); //,      //     EFI_HII_FONT_PROTOCOL Status = gBS->LocateProtocol ( // ,    ,    &gEfiHiiFontProtocolGuid, //    ,   NULL, //       (VOID **) &mHiiFontProtocol ); if (EFI_ERROR (Status)) { //     ,      return EFI_UNSUPPORTED; } //      Status = mHiiFontProtocol->GetFontInfo ( mHiiFontProtocol, NULL, NULL, //,        &FontInfo, NULL ); DEBUG((EFI_D_INFO, "GetFontInfo status = %r, current font has '%s' name\n\r", Status, FontInfo->FontInfo.FontName)); return EFI_SUCCESS; }
      
      





MatreshkaDriverEntryPoint()関数の最後で、この関数の最後のReturn Statusステートメントの前に、関数呼び出しを追加します。



  MyTestString(); return Status; }
      
      





そして、 #include <Protocol / HiiFont.h>と関数の説明をMatreshka.cファイルの先頭に追加します。



 #include "Matreshka.h"
      
      





次のようになります。



 #include "Matreshka.h" #include <Protocol/HiiFont.h> EFI_STATUS EFIAPI MyTestString(void);
      
      





F5をクリックします 。 ドライバーの起動速度- 待望の10秒に注意してください。 Nt32Pkg.dscの変更により、 Nt32Pkg全体再コンパイルされたため、コンパイルに長い時間がかかりましたが、ようやく正常な状態になりました。 Shellの出力を確認します。







スペースとカンマは国際的なものですが、ロシア語の文字が含まれているため、正しく表示されます。



OVMFの出力を確認します。







OutputString()の診断では、ポリッジを調理しません。「そうでなければ、美しいmar爵、すべてが良い、すべてが良い」、ステータスはSuccessです 。ただし、ロシア語の文字は表示されません。 何らかの方法で診断する必要があります(c)。



c DEBUG行をコメントアウトします 。これは、OutputString()からステータスを表示します。すべて同じですが、ヤギのミルクのように、そこから行くのは良いことです。



 //DEBUG((EFI_D_INFO, "OutputString() status = %r\n\r", Status));
      
      





次に、関数にいくつかの変数を追加します。



 UINTN Count = 0; EFI_IMAGE_OUTPUT *Blt = NULL;
      
      





そして、使用するフォントの文字列に表示されるグリフの検索ループ:



 //     \0 while (TestString[Count]) { //        Status = mHiiFontProtocol->GetGlyph ( //  mHiiFontProtocol, //  TestString[Count], //   NULL, &Blt, NULL ); if (Blt != NULL) { FreePool (Blt); Blt = NULL; } // UCS-2        DEBUG ((EFI_D_INFO,"Current symbol code is 0x%04x\t",TestString[Count++])); //  ,    DEBUG ((EFI_D_INFO,"Status: %r\r\n", Status)); }
      
      





このループは、最後の行の前に関数MyTestString()に挿入する必要があります



 return EFI_SUCCESS;
      
      





そして、 OVMFウィンドウでDEBUGの出力を確認します。







もう1つ、有用な診断が既にあります。 このDEBUGピンを解析します。



ロシアのコードページ04xxが立っているところはどこでも、 Warning Unknown Glyph 、つまり このコードを持つ文字には、対応するグリフはありません。 そして、英語の行とロシア文字の間を含むスペースの出力で-問題ありません、それらはUEFIシェル画面に表示されます。 最後に、同じエラーメッセージが表示されますが、ここにはすべての権利があります。改行とキャリッジリターン「\ n \ r」の特殊文字のビットマップは何ですか?



彼らは問題を認識しました-一般的なロシアのグリフはありません。 今、私たちはそれを解決する方法を考えます。 つまり、それを解決する方法はどこから取得してシステムに追加するのかが理解可能であり、問​​題はそれを取得する場所と追加する方法です。



問題は実際には非常に大きなものです。 ロシア語と英語の文字を隣り合わせに配置できるように、システムの英語のフォントと同じサイズの8x19のフォントが必要です。



インターネットには無料および非無料の8x19フォントのワゴンは明らかに存在しません(自分で検索してみてください)。通常の方法を使用します。利用可能なものを取り、ニーズに合わせて調整します。



Visual Studioの Win32コンソールのようなプロジェクトで最も単純なプログラムを記述します。このコンソールでは、 cmdコンソールのループに16番目のフォントのアルファベットのロシア語の文字をすべて表示します(19番目の修正はありませんが TTF コンソールのcmdにはフォントを表示できません)。 プログラムの実装はユーザーの裁量に任されており、結果はロシアの大文字と通常の文字の8x16ピクセルの文字列になります。 次に、出力行のスクリーンショットを撮り、 560x19ピクセルのサイズにトリミングして、下の位置に3つの空行を追加し、 bmp形式で書き込みます(準備は完了です)







このbmpファイルを1行ずつ1つの大きな配列に読み込み、 fprintf()を使用して結果のグリフを含む小さな2次元配列を、記事の冒頭で説明したEFI_NARROW_GLYPH構造体のインスタンスの形式のテキストファイルに順次出力する必要があります。 UCS-2のロシア語ページのロシア語文字のコードは、 0x0410 (文字「A」はロシア語)から0x0455 (ただし、 UCS-2のロシア語ページにはギリシャ文字がいくつかあります)です。



bmpファイルの解析はトピックから外れており、ボリュームが大幅に増加するため、ここではこのプログラムのコードを提供しません。したがって、出力の結果をファイルに書き込むだけです(インターネット上のbmpパーサーのソースを検索できます)。



結果
  { 0x0410, 0x00, {0x00,0x00,0x00,0x30,0x78,0xcc,0xcc,0xcc,0xfc,0xcc,0xcc,0xcc,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, { 0x0411, 0x00, {0x00,0x00,0x00,0xfe,0x62,0x60,0x7c,0x66,0x66,0x66,0x66,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, { 0x0412, 0x00, {0x00,0x00,0x00,0xfc,0x66,0x66,0x66,0x7c,0x66,0x66,0x66,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, { 0x0413, 0x00, {0x00,0x00,0x00,0xfe,0x62,0x62,0x60,0x60,0x60,0x60,0x60,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, { 0x0414, 0x00, {0x00,0x00,0x00,0x3e,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0xff,0xc3,0x00,0x00,0x00,0x00,0x00,0x00}}, { 0x0415, 0x00, {0x00,0x00,0x00,0xfe,0x62,0x60,0x64,0x7c,0x64,0x60,0x62,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, { 0x0416, 0x00, {0x00,0x00,0x00,0x99,0xdb,0x5a,0x7e,0x3c,0x7e,0x5a,0xdb,0x99,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, { 0x0417, 0x00, {0x00,0x00,0x00,0x3c,0x66,0x46,0x06,0x1c,0x06,0x46,0x66,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, { 0x0418, 0x00, {0x00,0x00,0x00,0xc6,0xc6,0xce,0xde,0xfe,0xf6,0xe6,0xc6,0xc6,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, { 0x0419, 0x00, {0x00,0x00,0x18,0xd6,0xf6,0xce,0xde,0xfe,0xf6,0xe6,0xc6,0xc6,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, { 0x041a, 0x00, {0x00,0x00,0x00,0xe6,0x66,0x6c,0x6c,0x78,0x6c,0x6c,0x66,0xe6,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, { 0x041b, 0x00, {0x00,0x00,0x00,0x1e,0x3e,0x66,0x66,0x66,0x66,0x66,0x66,0xc6,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, { 0x041c, 0x00, {0x00,0x00,0x00,0xc6,0xee,0xfe,0xfe,0xd6,0xc6,0xc6,0xc6,0xc6,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, { 0x041d, 0x00, {0x00,0x00,0x00,0xc6,0xc6,0xc6,0xc6,0xfe,0xc6,0xc6,0xc6,0xc6,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, { 0x041e, 0x00, {0x00,0x00,0x00,0x38,0x6c,0xc6,0xc6,0xc6,0xc6,0xc6,0x6c,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, { 0x041f, 0x00, {0x00,0x00,0x00,0xfe,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, { 0x0420, 0x00, {0x00,0x00,0x00,0xfc,0x66,0x66,0x66,0x7c,0x60,0x60,0x60,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, { 0x0421, 0x00, {0x00,0x00,0x00,0x3c,0x66,0xc6,0xc0,0xc0,0xc0,0xc6,0x66,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, { 0x0422, 0x00, {0x00,0x00,0x00,0x7e,0x5a,0x18,0x18,0x18,0x18,0x18,0x18,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, { 0x0423, 0x00, {0x00,0x00,0x00,0x66,0x66,0x66,0x66,0x66,0x3e,0x06,0x66,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, { 0x0424, 0x00, {0x00,0x00,0x00,0x18,0x7e,0xdb,0xdb,0xdb,0xdb,0x7e,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, { 0x0425, 0x00, {0x00,0x00,0x00,0xcc,0xcc,0xcc,0x78,0x30,0x78,0xcc,0xcc,0xcc,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, { 0x0426, 0x00, {0x00,0x00,0x00,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xfe,0x06,0x00,0x00,0x00,0x00,0x00,0x00}}, { 0x0427, 0x00, {0x00,0x00,0x00,0xc6,0xc6,0xc6,0xc6,0xc6,0x7e,0x06,0x06,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, { 0x0428, 0x00, {0x00,0x00,0x00,0xd6,0xd6,0xd6,0xd6,0xd6,0xd6,0xd6,0xd6,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, { 0x0429, 0x00, {0x00,0x00,0x00,0xd6,0xd6,0xd6,0xd6,0xd6,0xd6,0xd6,0xd6,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00}}, { 0x042a, 0x00, {0x00,0x00,0x00,0xe0,0xe0,0x60,0x60,0x7c,0x66,0x66,0x66,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, { 0x042b, 0x00, {0x00,0x00,0x00,0xc6,0xc6,0xc6,0xc6,0xf6,0xde,0xde,0xde,0xf6,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, { 0x042c, 0x00, {0x00,0x00,0x00,0x00,0xc0,0xc0,0xc0,0xfc,0xc6,0xc6,0xc6,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, { 0x042d, 0x00, {0x00,0x00,0x00,0x78,0xcc,0xc6,0x06,0x1e,0x06,0xc6,0xcc,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, { 0x042e, 0x00, {0x00,0x00,0x00,0xce,0xdb,0xdb,0xfb,0xfb,0xdb,0xdb,0xdb,0xce,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, { 0x042f, 0x00, {0x00,0x00,0x00,0x3f,0x66,0x66,0x66,0x3e,0x36,0x66,0x66,0xe7,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, { 0x0430, 0x00, {0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x06,0x3e,0x66,0x66,0x3b,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, { 0x0431, 0x00, {0x00,0x00,0x00,0x00,0x00,0x02,0x3e,0x60,0x7c,0x66,0x66,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, { 0x0432, 0x00, {0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x66,0x7c,0x66,0x66,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, { 0x0433, 0x00, {0x00,0x00,0x00,0x00,0x00,0x00,0x7e,0x60,0x60,0x60,0x60,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, { 0x0434, 0x00, {0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x36,0x36,0x36,0x36,0x7f,0x63,0x00,0x00,0x00,0x00,0x00,0x00}}, { 0x0435, 0x00, {0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x66,0x7e,0x60,0x66,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, { 0x0436, 0x00, {0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x6b,0x3e,0x3e,0x6b,0x49,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, { 0x0437, 0x00, {0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x46,0x1c,0x06,0x46,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, { 0x0438, 0x00, {0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x66,0x6e,0x7e,0x76,0x66,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, { 0x0439, 0x00, {0x00,0x00,0x00,0x04,0x0c,0x08,0x66,0x66,0x6e,0x7e,0x76,0x66,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, { 0x043a, 0x00, {0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x6c,0x78,0x6c,0x64,0x66,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, { 0x043b, 0x00, {0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x1e,0x16,0x36,0x26,0x66,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, { 0x043c, 0x00, {0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x77,0x6b,0x6b,0x63,0x63,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, { 0x043d, 0x00, {0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x66,0x7e,0x66,0x66,0x66,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, { 0x043e, 0x00, {0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x66,0x66,0x66,0x66,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, { 0x043f, 0x00, {0x00,0x00,0x00,0x00,0x00,0x00,0x7e,0x66,0x66,0x66,0x66,0x66,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, { 0x0440, 0x00, {0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x66,0x66,0x66,0x66,0x7c,0x60,0x60,0x00,0x00,0x00,0x00,0x00}}, { 0x0441, 0x00, {0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x66,0x60,0x60,0x66,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, { 0x0442, 0x00, {0x00,0x00,0x00,0x00,0x00,0x00,0x7e,0x18,0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, { 0x0443, 0x00, {0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x33,0x33,0x33,0x1f,0x03,0x33,0x1e,0x00,0x00,0x00,0x00,0x00}}, { 0x0444, 0x00, {0x00,0x00,0x00,0x00,0x00,0x08,0x3e,0x6b,0x6b,0x6b,0x3e,0x08,0x08,0x00,0x00,0x00,0x00,0x00,0x00}}, { 0x0445, 0x00, {0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x36,0x1c,0x1c,0x36,0x63,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, { 0x0446, 0x00, {0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x66,0x66,0x7f,0x03,0x00,0x00,0x00,0x00,0x00,0x00}}, { 0x0447, 0x00, {0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x3e,0x06,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, { 0x0448, 0x00, {0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x6b,0x6b,0x6b,0x6b,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, { 0x0449, 0x00, {0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x6b,0x6b,0x6b,0x6b,0x7f,0x01,0x00,0x00,0x00,0x00,0x00,0x00}}, { 0x044a, 0x00, {0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x70,0x3e,0x33,0x33,0xbe,0x80,0x00,0x00,0x00,0x00,0x00,0x00}}, { 0x044b, 0x00, {0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x63,0x7b,0x6f,0x6f,0x7b,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, { 0x044c, 0x00, {0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x7c,0x66,0x66,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, { 0x044d, 0x00, {0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x66,0x1e,0x06,0x66,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, { 0x044e, 0x00, {0x00,0x00,0x00,0x00,0x00,0x00,0x6e,0x7b,0x7b,0x7b,0x7b,0x6e,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, { 0x044f, 0x00, {0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x66,0x66,0x3e,0x36,0x66,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, { 0x0450, 0x00, {0x00,0x00,0x6c,0xfe,0x62,0x60,0x64,0x7c,0x64,0x60,0x62,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, { 0x0451, 0x00, {0x00,0x00,0x00,0x48,0x48,0x00,0x78,0xcc,0xfc,0xc0,0xcc,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, { 0x0452, 0x00, {0x00,0x00,0x00,0x3c,0x66,0xc6,0xc0,0xf0,0xc0,0xc6,0x66,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, { 0x0453, 0x00, {0x00,0x00,0x00,0x00,0x00,0x00,0x78,0xcc,0xf0,0xc0,0xcc,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, { 0x0454, 0x00, {0x00,0x00,0xcc,0xcc,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, { 0x0455, 0x00, {0x00,0x00,0x00,0x66,0x66,0x00,0x18,0x18,0x18,0x18,0x18,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x00}},
      
      







受け取ったフォントのグリフ。 UEFI BIOSにロシア語のフォントを追加するには、2つの方法があります。



1.風水ですべてを行う、すなわち フォントを作成し、このフォントのフォントパッケージを作成してから、ロシア語の出力を必要とする新しいモジュールで毎回このパッケージを接続します 。 見出し、テキスト、脚注などにさまざまなサイズのフォントが必要なUEFIでグラフィカルアプリケーションを作成する人に役立つ知識。 問題は、この知識がIBVを使用する場合にのみ必要であるということです。ほとんどの場合、必要なフォントはすべてそこにあります。 すなわち 99.9%の確率で、独自のフォントパッケージを作成し、将来的にシステムに追加する機能が不要になる可能性があります。



2.ロシア語のコードページが空であるため、ロシア語の文字、より正確にはグリフをsysdefaultフォントに追加します。ロシア語で出力する必要がある場合は、ロシア語で文章を書きます。 または、ウクライナ語のフォントに対して以下の操作を行うことにより、ウクライナ語で。



2つのアプローチのどちらが選択されるかを推測します。 そうだね。 受信したフォントのグリフを、英語フォントのグリフが保存されているファイルにコピーします。



 C:\FW\edk2\MdeModulePkg\Universal\Console\GraphicsConsoleDxe\LaffStd.c
      
      





私たちのフォーマットの配列に:



 EFI_NARROW_GLYPH gUsStdNarrowGlyphData[] = { // // Unicode glyphs from 0x20 to 0x7e are the same as ASCII characters 0x20 to 0x7e // { 0x0020, 0x00, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, { 0x0021, 0x00, {0x00,0x00,0x00,0x18,0x3C,0x3C,0x3C,0x18,0x18,0x18,0x18,0x18,0x00,0x18,0x18,0x00,0x00,0x00,0x00}}, ...
      
      





行の後に、生成されたグリフをこの配列に追加します



 { 0x00ff, 0x00, {0x00,0x00,0x00,0xC6,0xC6,0x00,0x00,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0x7E,0x06,0x0C,0x78,0x00}},
      
      





後で忘れないように、 //ロシア語記号で挿入の開始と終了をコメントで示します。 実際、これですべてです。もちろん、この配列のUnicodeWeightフィールドにあるロシア文字のコードは、 何とも交差せず、他の場所で何も変更する必要はありません。



追加し、 Rebuildを起動しました( Visual StudioF5デバッグボタンを押すと、 Matreshkaプロジェクトのみが再コンパイルされ、 グリフの取得元のGraphicsConsoleDxeが未コンパイルのままになります)。 コンパイルエラーがない場合は、デバッグのためにモジュールを実行し、結果を確認します。まったく別の問題です。







英語に比べて小さいロシア語のフォントは、コピーに19x8ではなく16x8フォントを使用したためです-これはそうではありませんでした。 18個のフォントでもサイズは18x9であるため、各辺で文字が重複します。



診断を見てみましょう:ここに素晴らしさがあります







最後の2つであるラインフィードとキャリッジリターンを除き、すべての文字には独自のグリフがあります。 つまり、すべてが正常に機能し、edk2にロシア語のフォントがあり、ロシア語で自由に文字列を表示できます。 これから使用するもの。



HIIの形式のロシア化



まず、理論、 HIIが何であるかについてのストーリー- ヒューマンインターフェイスインフラストラクチャ



HIIシステムのコンポーネントを説明する標準の写真から始めることをお勧めします







システムの各コンポーネントをより詳細に検討してください。



HIDデバイス - ヒューマンインターフェイスデバイス 、マウス、キーボード、タッチパッド、トラックボールなど。 目標は、システムを使用する人からシステム情報を入力することです。 UEFI BIOSで動作します。



ディスプレイデバイス -反対に、UEFI BIOSからの情報をユーザーに表示します。 このコンテキストでの「ディスプレイ」は「モニター」ではなく、「ディスプレイ」です。 日常の作業では必要ありません(最後にBIOSにアクセスしたのはいつですか?)。しかし、システムの再構成やデバッグの場合、これらのデバイスは不可欠になります。これは、ユーザーが構成/デバッグプロセスでのアクションに対するシステムの反応を確認する必要があるためです。したがって、情報は、実際のディスプレイ、COMポート、ネットワークリモート接続として機能するディスプレイデバイスオンラインで表示されます-たとえば、次のようになります:







EFI Global Variable Store-同じNVRAM、UEFI BIOSコードを格納するフラッシュドライブ、同時に変数など-ブート元のドライブとドライブのパーティションの番号。



Hiiデータベース-すべてのHII情報の単一リポジトリ。データベース-データベースです。 I / Oデバイスから直接やり取りするのではなく、プロトコルを介してこれらのデバイスの対応するドライバーを介してやり取りします(前の記事を思い出してください)。







ブラウザについては、類推に頼る方が良いです。実際、Forms Browserは、クライアントとサーバーシステムの類似物であり、クライアントはVFR(ユーザーが対話する視覚的なフォーム表現)であり、サーバー-IFR(内部フォーム表現)はマシンに便利なバイナリコンパクトコードです。



これで、一般教育の部分は終わりました。詳細に移ります。まだほとんど知識がない人は、HIIの説明を詳しく見ることができます。UEFI規格、第31-33章。UEFI規格は、わかりやすい言語で書かれており、大きな説明が挿入されています。問題は2つしかありません。1つ目は大きく(バージョン2.6では2525ページ)、2つ目は英語です。



ページにロシア語のサポートを追加します



したがって、私たちの目標は、ロシア語のサポートをフロントページに追加することです。ロシア語で情報の表示を確認できるコードとデータを追加します。以来フロントページは、我々がない作成し、我々は別のプロジェクトからファイルを調整する必要があります。



したがって、現在はStringsとして指定されている部分に関心があります。文字列の操作は、次のように文字列ID介して行われます。







つまり、1つの文字列IDが、異なる言語の異なる文字を持つ複数の行に対応します。



このプロジェクトのためにサポートされている言語のリストと同様に、出力文字列は、ファイルに格納されている* .uniユニがあるユニコードUCSUniCode Stringsの略語です)。次のようになります。



 #langdef en "English" #langdef es "Spanish" #langdef cn "Chinese" #string STR_HELLO_WORLD #language en "Hello World" #language es "Hola Mundo" #language cn "您好世界"
      
      





したがって、フロントページで言語を切り替えると、システムは文字列ID「STR_HELLO_WORLD」に必要な言語の文字列を割り当て、フォームに表示されます。 すべてがシンプルです。



明らかでない問題が1つあります。ロシア語、英語、中国語の文字を1つのドキュメントに入れることができるのMS WordまたはWebページです。英語に加えてVisual Studioでは、ロシア語などの単一のコードページを選択する必要があります。これを回避するには、* .uniファイルを作成して、UCS-2 Little Endianをサポートするエディターに文字列を保存する必要があります(例:Notepad ++)私たちにとっては、ロシア語を1つだけ追加するため、これは重要ではありません。フランス語のロケールが悪くなるかどうかは関係ありませんが、この問題を念頭に置いて、UCS-2* .uniファイルをサポートするエディターを使用する必要があります



理論を実践に適用する



それでは、始めましょう。ここでのタスクは、既存のフロントページにロシア語のローカライズを追加することです。



まず、今あるものを見てみましょう。UEFIシェルにロードした後exit入力して、フロントページに移動します







これですべてのローカライズ言語が利用可能になります。フランス語は必要ありません、ロシア語が必要です。フランス語を完全に捨てることは可能ですが、プロジェクトではなく、システム1では、変更が少ないほど良いので、そのままにしておきます。



最初にexitと入力する手間を減らし、最後の行にexit追加しstartup.nshファイルを変更しましょう



 fs0: load Matreshka.efi exit
      
      





表示されているフロントページを変更して、ロシア語化します。まず、ファイル内のUiAppアプリケーションによってこのページに表示される言語のタグを処理します

 C:\FW\edk2\MdePkg\MdePkg.dec
      
      





PcdUefiVariableDefaultPlatformLangCodes最後にru-RUの行にロシア語を追加します



 ## Default platform supported RFC 4646 languages: (American) English & French. # @Prompt Default Value of PlatformLangCodes Variable. gEfiMdePkgTokenSpaceGuid.PcdUefiVariableDefaultPlatformLangCodes|"en;fr;en-US;fr-FR;ru-RU"|VOID*|0x0000001e
      
      





OK



 C:\FW\edk2\MdeModulePkg\Application\UiApp\FrontPageStrings.uni
      
      





Notepad ++開いて、すぐにエンコードUCS-2 BEを設定し(メニューエンコード-> UCS-2 BEで)、ロシア語#langdef ru-RU "Russian"のサポートを追加する必要があります



 #langdef en-US "English" #langdef fr-FR "Français" #langdef en "Standard English" #langdef fr "Standard Français" #langdef ru-RU ""
      
      





それだけではありません碑文をロシア語化する言語の選択続行リセットが必要です。同じFrontPageStrings.uniファイル内のタグにロシア語の行を追加します



 #string STR_LANGUAGE_SELECT #language en-US "Select Language" #language fr-FR "Choisir la Langue" #language ru-RU " " #string STR_LANGUAGE_SELECT_HELP #language en-US "This is the option one adjusts to change the language for the current system" #language fr-FR "Ceci est l'option que celui ajuste changer la langue pour le système actuel" #language ru-RU "     " #string STR_CONTINUE_PROMPT #language en-US "Continue" #language fr-FR "Continuer" #language ru-RU "" #string STR_RESET_STRING #language en-US "Reset" #language fr-FR "Reset" #language ru-RU ""
      
      





我々は、彼らが英語とフランス語のロケールのための感嘆符を(表示されます。それ以外の場合は、3行を追加する必要があり、これらとSTRING_IDsはスペースを差し込む、我々は黙っNULL_STRINGのも、スペースとロシア語を、しかしためCPUのモデル、およびCPU速度のように消えていない、またを推論何か楽しいですフォームに配置)



 #string STR_NULL_STRING #language en-US " " #language fr-FR " " #language ru-RU " " #string STR_FRONT_PAGE_CPU_MODEL #language en-US "" #language fr-FR "" #language ru-RU "  Pentium" #string STR_FRONT_PAGE_CPU_SPEED #language en-US "" #language fr-FR "" #language ru-RU "  100 "
      
      





ここには、ロシア語を選択できるロシア語オプションがあります:







おそらく、マトリョーシカのドライバーはシステムの言語機能のみをテストし、それ以上はテストしていないことにすでに気付いているでしょう。彼は言語自体を追加しません。これはMdePkgパッケージの既存のUIAppプロジェクトMdeModulePkgパッケージのGraphicsConsoleDxeを使用して作業するためですこれで、免責事項に示されているように、ソースにアクセスせずに既存のハードウェアプラットフォームにロシア語ロケールを追加することが不可能な理由がわかりました。



今日は以上です。ページを完全に作成し、次のいずれかの記事でそれらをロシア化します。



All Articles