OpenProcess() でハンドルが取得できない場合の対処方法

ずっと気になっていた秀丸メール用メール着信通知マクロ(hidebiff)を修正した。

G‚܂邨‚̃z[ƒ€ƒy[ƒW(ƒTƒCƒg[Šé‰æ)|hidebiff - ƒ[ƒ‹’ M’Ê’mi1.2.7j

メインの PC が壊れて、環境を Windows 7 から Windows XP に移した再に、メール通知トーストをクリックしても対象のメールが表示されない、というのが修正した問題点。

hidebiff ではプロセスが多重起動しないようにセマフォを使ってチェックしていて、もし既に起動しているプロセスがいた場合、処理をそちらのプロセスに委譲して、後発起動されたプロセスは終了する、という設計になっている。

上記を行うために、EnumProcesses() で全プロセスを列挙、OpenProcess() でプロセスのハンドルを取得、取得したハンドルから EnumProcessModules() でモジュールを取得、モジュールから GetModuleFileNameEx() でファイルパスを取得、ファイルパスが現在のプロセスと一致した場合に同一実行ファイルである、という判断をしている。

その後、VirtualAllocEx() でメモリ確保、WriteProcessMemory() で確保したメモリに書き込み、CreateRemoteThread() で他のプロセスに処理を実行させる。

今回の問題点は、OpenProcess() でハンドルが取得で傷、原因として ERROR_ACCESS_DENIED となる点。まったく同じバイナリが Windows 7 で動いていたし、過去 Windows XP でも動いていたんだけど、今は動かなくなってしまった。

考えられる原因として、Windows Update によってセキュリティポリシーが変わってしまったことだろうか。

特権の調整 の内容を参考にし、特権の調整を行うことで、OpenProcess() でハンドルが取得できるようになった。

2 ヶ月ぐらい不便だったんだけど、デバッグすれば 2 時間で解決するなら、早めに着手すればよかった。

なお、通常は最低 1 ヶ月ぐらいは dogfooding を行うんだけど、1.2.6 は dogfooding 中であることをすっかり忘れて、欠番リリースになってしまったので、今回は早めにリリース。他にも改善したい課題(OS からのブロードキャストメッセージを受け取らない)はあるんだけど、次に不具合が見つかったときに修正することにしよう。