.
developing primaries

[ 0 | 1 | 2 | 3 | 4 | 5 | 6 ]

まえがき

Hack の書き方を説明する日本語のドキュメント、というのは、あまり出回っていないような気がします。禁断の知識、というほどでもないにせよ、慎重に作らないといろいろと困ったことになるのは確かなんですが、その辺を分かった上であれば、実はアプリケーションを一本書くよりよっぽど簡単で、かつ効果も大きい分だけ、楽しい、という面もあったりします。

もちろん、その「いろいろと困ったことになる話」というのもけっこう重要なテーマではあるのですが、とりあえず、ここでは Hack の作り方だけを解説しますので、作った後の話などは、各自でちゃんと考慮していただきたいと思います。:-)

必要な道具立て

Hack はもちろん、CodeWarrior でも作れますが、私自身は Hack は常に PRC-Tools で作っています。PRC-Tools だと Emacs から一歩も外に出ないで済ませることができるので話が早いんですよね(まぁ、POSE とか shell は使いますが)。小さいものをさっくり作るにはもってこい、ということで。

さて「必要なもの」ですが、結局 PRC-Tools(+ sdk) とそれが動く環境、あとはエディタだけ、ということになります。PRC-Tools については不十分なドキュメントではありますが、このサイトにも一応、about PRC-Tools というページがありますので、必要に応じてご参照いただきたいと思います。

それからもちろん、C 言語と PalmOS プログラミングに関する基本的な知識は必要です。この先を読み進めていってよく分からないところがある場合、Hack を書くのはもう少し待った方がよいかもしれません。:-)

なお、このドキュメントでサンプルとして用いる Hack について、ソース・パッケージを用意してあります。ドキュメント中でも必要なコードは随時掲載していますが、実際にビルドしてみる、それを土台に自分の Hack を作る等、パッケージの方もご自由にお使いください。個人利用については全く制限なしとしますが、ただし再配布、頒布については、いろいろあることもあるかと思いますので、事前にお問い合わせいただきたいと思います。特に何かを制限しようという意図はありませんので、お気軽にどうぞ。

予備知識

さて、私も完全に分かっているわけではありませんが、一応の予備知識として Hack のさわりだけ解説しておきます。

まず、Hack の前に PalmOS の Trap について説明します。PalmOS の API はすべて System Trap として発行され、システムが持っている Trap のテーブルからそのアドレスが参照され、そこから処理が動きます。たとえば、WinDrawChars で文字を書け、と言われた場合、sysTrapWinDrawChars という Trap の発行に対し、その Trap の識別子として 0xA220 という値を用いて OS がテーブルからアドレスを取得し、そこに処理を飛ばす、という感じです。

ここに割り込むのが Hack です。

(ちなみに 0xA220 などの値は SDK のヘッダ・ファイルの中で定義されています。)

Hack のベースは「Trap のテーブルを書き換える」ことです。先ほどの WinDrawChars であれば、本来 OS が返すはずのアドレスというのがあるのですが、この値を別に用意した Hack 内の関数のアドレスにすり替えてやります。すると、WinDrawChars が実行される度に OS は変更されたテーブルを参照し、Hack 内の関数が実行されるようになるわけです。これが OS の基本動作を書き換える仕組みであり、すり替え後に実行される関数こそが Hack の実体であるとも言えます。

ここでもう一つ重要な要素として、書き換える前の元々のアドレスがあります。この値は、たとえば Hack を停止する時にはテーブルの値を元のアドレスに戻す必要がありますので当然、保存しておく必要があります。また、それ以外にも、OS の動作を一部変更したり、ちょっとだけ動作を追加する、というような場合には、Hack 内の関数の中から元々の関数を呼ぶ、ということをしますので、Hack の実行時にも使われることがあります。先ほどの例で言えば、WinDrawChars が呼ばれた時、Hack で文字表示色を変えてやってから元々の WinDrawChars を呼び、文字表示色を元に戻して終わる、というような使い方です。

この基本が分かれば、以下のようなことも自然と分かると思います。

なぜ Hack を使用すると動作が不安定になることがあるのでしょうか? OS の動作が変更されることで、稼働中の OS が本来なら想定されていない状態に陥ったり、想定されていないロジックが動くことになる場合があるためです。注意深く作り込むことでこの手の危険は回避できますが、すべての問題の芽をつぶすことは困難です。OS の状態遷移を完全に把握することは、Palm 社自身にもできていないことですから。;-) まして複数の Hack が導入されてそれぞれ勝手に動いている実際のデバイスでの動作を、一介のディベロッパーがどこまで予測できるでしょう。

なぜ Hack でなければできないことがあるのでしょうか? Hack はある意味、 PalmOS そのものを書き換えるようなものです。ふつうにアプリケーションを作っている限りではその OS ではできないことはできませんが、Hack なら、OS が本来行わないような処理を、OS の元々の動作に代えて実行することができます。これが Hack の威力であり魅力である、というわけです。

HackMaster などの Hack Extension Manager は何をするものなのでしょうか? これらは本質的には、個々の Hack のために、Trap ごとのアドレス・テーブルの変更管理を行っているものです。ある Hack がある Trap に対するアドレスを書き換えて、それをまた別の Hack が書き換えた、という場合、書き換えるだけならいいのですが、Hack を停止する時に書き戻す順番が問題になります。たとえば WinDrawChars のアドレスが本来 0x00009999 だったとします。ここで A という Hack が元のアドレス 0x00009999 を 0xAAAA0000 に書き換え、Hack B がそれをさらに 0xBBBB0000 に書き換えたとします。それを停止する時、A がまず、自分が書き換えた時の元の値 0x00009999 に戻し、後から B が自分が書き換えた時の値 0xAAAA0000 に戻す、という順番になってしまったら、WinDrawChars が次に呼ばれた時には、おそらくその時点では不正なアドレスである 0xAAAA0000 にジャンプしてクラッシュしてしまうでしょう。これをしっかり管理して、書き換え、書き戻しの順番を整理しているのが Hack Extension Manager である、というわけです。

ちなみに逆に言えば、その順番管理を間違わないようにしてあれば、Hack Extension Manager などを使わずに、単独で Hack しても構わない、ということでもあります。Hack 自体は前述の原理さえ分かっていれば Manager なしでも全く問題なく行うことができるわけです。が、いろいろ面倒を見るのは大変ですから、基本的には Manager を使うのが無難です。どうしてもそうしたくない場合にはそれなりに苦労する必要があるでしょう。

--> next

[ 0 | 1 | 2 | 3 | 4 | 5 | 6 ]