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ドラむバヌりィザヌドでプロゞェクトを䜜成する


名前WorkspaceをC/ 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 StudioでF5デバッグボタンを抌すず、 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、ナニがあるナニコヌドUCSはUniCode 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を䜿甚しお䜜業するためです。これで、免責事項に瀺されおいるように、゜ヌスにアクセスせずに既存のハヌドりェアプラットフォヌムにロシア語ロケヌルを远加するこずが䞍可胜な理由がわかりたした。

今日は以䞊です。ペヌゞを完党に䜜成し、次のいずれかの蚘事でそれらをロシア化したす。

Source: https://habr.com/ru/post/J338634/


All Articles