偽 DLL for 開発

PC をサスペンドするアプリケーション開発において、動作確認する際、めんどうなことが起きる。実際にサスペンドしてくれるのは結構だが、デバッグの際にいちいちサスペンドされては、開発の効率が良くない。そこで、対策として、偽の powrprof.dll を作成することにした。

サスペンドする Windows API である SetSuspendState は、システムフォルダの中にある powrprof.dll の中にあり、サスペンドの際は、そのファイルを呼び出しているわけだが、これを置き換えてはならない。powrprof.dll は、その名の通り、電源系統の重要な役割を担っており、Windows が動いている間は、その役割をキープしつづけなければならないからだ。

まあ、仮に、置き換えようとしても、保護機能が動いて達成できない。いや、そもそも、使用中であるから、powrprof.dll の移動や削除はできない。

ではどうするかといえば、別の場所につくればいい。もっとも簡単なのは、サスペンドするアプリケーションと同じフォルダに置くことだ。アプリケーションが powrprof.dll を呼び出すとき、アプリケーションはまず、自分と同じフォルダに powrprof.dll という名前のファイルがないかを調べる。特別なプログラミングをせずとも、デフォルトでそういう挙動になっている。

というわけで、偽の powrprof.dll を置く場所は決まった。実際に生成してみよう。

以下のコードだ。

#define UNICODE
#include <windows.h>

DECLSPEC_EXPORT BOOL SetSuspendState() {
  MessageBox(NULL, TEXT("powrprof!!"), TEXT(""), MB_OK);
}

API こと関数を提供する DLL を作成するには、提供したい関数定義を DECLSPEC_EXPORT というコードから始める。それ以外は、ふつうの関数定義と同じように書く。

そして、これをビルドするには gcc powrprof.c -shared とコマンドを発行する。すると、関数提供機能を持った DLL が出来上がる。

これをサスペンドするアプリケーションと同じフォルダに置く。アプリケーションが SetSuspendState を行うと、サスペンドは行われず、メッセージボックスが表れる。

これで、開発効率が上がった。時々、本当にサスペンドを行いたいときは、偽の powrprof.dll を改名したり削除したりすればいい。