DeltaEndでも使っているメッセージフック(WH_CALLWNDPROCRET、ウィンドウプロシージャ戻りフック)はDLLをプロセスに注入します。
開放されるタイミングは、UnhookWindowsHookExした後にウィンドウプロシージャが呼ばれた時だという話なのですが、開放されないプロセスがあるので調べてみました。
ehmsas.exeとjusched.exeの2つで、Spy++で見ると共にウィンドウがありません。前者はWindows Media Centerのモジュールで、ehtray.exeからCOMとして呼ばれています。後者はJavaのアップデート。
ログオン時タスクからでのみ発生し、起動後はタスクの手動起動でもDeltaEnd.exeの直接起動でも再現しません。
ログオン時タスクの起動はとても早いので、ひょっとして最初はウィンドウがあるんじゃなかろうか(少なくともjusched.exeはCreateWindowExAを使っている)、というわけで検証用のコンソールアプリを作ってみました。
WindowWithConsoleApp.zip
"w"入力でウィンドウを作り、"q"で終了します。ウィンドウを閉じるまでキー入力が利きません。
ProcessExplorerで監視してみると、最初は何をしても変化ありませんが、ウィンドウを作ると同時にDeltaEndDll.dllが入り、閉じてもそのままと見事に再現できました。
ウィンドウがなくなっても開放されるわけではなく、その場合はあくまでプロセス終了時の開放処理に任されているようです。ウィンドウ破棄後も動作するアプリは想定外なのでしょう。
DllMainでプロセス名を判別してFALSEを返し失敗させる、という方法は考えられます。しかし汎用的な方法はちょっと思いつきません。
他、Firefoxのplugin-container.exeでもたまに起きています。こちらもウィンドウがない場合ですが、このプロセスを除外するとIETabやFlash内に干渉できなくなるので、一度Firefoxを閉じて対応するしかななさそうです。
開放されるタイミングは、UnhookWindowsHookExした後にウィンドウプロシージャが呼ばれた時だという話なのですが、開放されないプロセスがあるので調べてみました。
ehmsas.exeとjusched.exeの2つで、Spy++で見ると共にウィンドウがありません。前者はWindows Media Centerのモジュールで、ehtray.exeからCOMとして呼ばれています。後者はJavaのアップデート。
ログオン時タスクからでのみ発生し、起動後はタスクの手動起動でもDeltaEnd.exeの直接起動でも再現しません。
ログオン時タスクの起動はとても早いので、ひょっとして最初はウィンドウがあるんじゃなかろうか(少なくともjusched.exeはCreateWindowExAを使っている)、というわけで検証用のコンソールアプリを作ってみました。
WindowWithConsoleApp.zip
"w"入力でウィンドウを作り、"q"で終了します。ウィンドウを閉じるまでキー入力が利きません。
ProcessExplorerで監視してみると、最初は何をしても変化ありませんが、ウィンドウを作ると同時にDeltaEndDll.dllが入り、閉じてもそのままと見事に再現できました。
ウィンドウがなくなっても開放されるわけではなく、その場合はあくまでプロセス終了時の開放処理に任されているようです。ウィンドウ破棄後も動作するアプリは想定外なのでしょう。
DllMainでプロセス名を判別してFALSEを返し失敗させる、という方法は考えられます。しかし汎用的な方法はちょっと思いつきません。
他、Firefoxのplugin-container.exeでもたまに起きています。こちらもウィンドウがない場合ですが、このプロセスを除外するとIETabやFlash内に干渉できなくなるので、一度Firefoxを閉じて対応するしかななさそうです。
コメントする