借り初めのひみつきち

仮ブログです。

ACPI BGRT

昔同じタイトルの記事を書いたところ結構googleしてる人がいるみたいなので、ちゃんとした記事のせときますね:;(∩´﹏`∩);:

win8くらいの時からPCが起動する時にメーカーロゴが表示された状態のままwindowsが起動してることにお気づきでしょうか?

この仕組みは ACPI にある BGRT (Boot Graphics Resource Table) というテーブルで実現されています。

このテーブルは以下のような構造になっています。

typedef struct {
    acpi_header_t   Header;
    uint16_t    Version;
    uint8_t     Status, Image_Type;
    uint64_t    Image_Address;
    uint32_t    Image_Offset_X, Image_Offset_Y;
} __attribute__((packed)) acpi_bgrt_t;

この中で重要なのは Image_Address, Image_Offset_X, Image_Offset_Y の3つです。
Image_Address の指しているアドレスには BMP ファイルがそのまま格納されています。
Image_Offset_X/Y は実際にイメージを表示する左上の座標になります。解像度を変更した場合は不正な座標になります。
残りの項目は ACPI 共通のお作法だったり、将来拡張があった時のためだったりします。(たぶん使われないでしょう)

実際にこれを使う場合、 EFI_SYSTEM_TABLE の ConfigurationTable から ACPI テーブル(RSD Ptr)を検索し、 XSDT から BGRT を探し、 BGRT から画像を取り出すという手順になります。
ということで表示するプログラムを作ってみました。

github.com

f:id:neriring16:20181220212425p:plain

最小のEXEファイル?

EXEファイルにはいろいろ形式がありますが、現在主流なのはPEという形式です。

これはもともとUN*X方面で使われていたCOFFという実行ファイルの形式にWindowsのために必要な機能を拡張したもので、PE-COFFなどの名称で呼ばれることもあります。
本家UN*X系OSではCOFFでは機能が不十分になったために現在ではELF形式が主流となっていますが、Windowsの世界ではCOFFを独自拡張したPE形式をそのまま使い続けています。
そもそもEXE形式はMS-DOS用の実行ファイル形式だったMZ形式から始まり、いくつかの追加ヘッダをつけた亜種があり、最終的に追加でPEヘッダを付けたPE形式が現在の主流となっています。

そういう経緯で生まれた形式のため、MZからPEに辿るまでの互換性のための項目があったり、元々のCOFFにあった今では使われていない機能があったり、PEで拡張された項目にもあまり使われていない機能があったり・・・よく見るとけっこうスカスカです。

そして、スカスカのヘッダーの使われていない部分を切り詰めて小さい EXE ファイルを作る遊びが一時期流行りました。
世界レコードが何バイトかは知らないですが、ハローワールドが256バイト切れた時代もありました。

Windows XP SP2 がでたとき、実は密かにヘッダーのチェックが厳しくなっていて、それまで使えたテクニックのいくつかは修正が必要でした。その後、遊びも下火になってぼく自身もほとんど忘れたまま何年も経ちました。

EXE ファイルはどこまで小さくできるか限界を探すという懐かしい話題を見かけ、昔を懐かしんで古い最小バイナリたちを見てみると Windows 10 ではどれも動かなくなっていました。

そこで現在の最小らしいバイナリを改良していったところ、ある程度小さくすることには成功しました。
しかし、いじっていくと突然バイナリを生成した瞬間マルウェアに感染しましたと出てきてバイナリが消滅しました。

どうもマルウェアの中にはヘッダの値がでたらめなものがあるため、最近はチェックが厳しくなっているのだそうな・・・

ぼくはただゴルフを遊んでいただけなのに、突然警察が来てこの場所は違法になったってボールを没収して行くのです。
ぼくの目にはこないだまで普通に遊べたただの空き地にしか見えないのに。

世界一有名な人。

世界で最も有名な人は誰だろう?

候補をあげるなら一人目は Phil Katz だと思う。
彼は PKZIP を開発し、彼のイニシャルはたくさんの ZIP ファイルの先頭に刻まれている。
また、 ZIP ファイルはしばしば名前を隠して至る所に存在している。
何億台だかの PC で走るのに客先の PC ではさっぱり走らないあのソフトウェアとかね。

もう一人候補を挙げるなら Mark Zbikowski かな。
MS-DOS version 2 に数々の革新的機能を実装した彼のイニシャルはたくさんの EXE ファイルの先頭に刻まれている。
アンチ M$ 教徒のあなたも安心してほしい。
ROM-BIOS やブートパーティションにある EFI ファイルには確かに彼のイニシャルが刻まれている。

他に有名な人は誰がいるだろう。

フォントのお話

さいきん進行中のUEFIプロジェクトをはじめるにあたってちょうど良いフォントがなくてフリーで使えるフォントを探していたのですが、FONTX2フォントってだいぶ配布してるところが減ってきて、ライセンスも不明瞭だったり作者も行方不明で配布元も閉鎖したり・・・

全盛期に比べるとだいぶ廃れてしまった感じのあるビットマップフォントですが、

そういえばmegosのフォントも現在は入手不可能だったなと気付きました。

megosは当時の他の自作OSに比べてフォントにも拘っていましたが、現在となってはサンプルも見れないし、どんなフォントがあるかすら明らかになっていない。
手元には全てあるんですけどね。

これらについて近日正式に公開する予定です。