GetProcessImageFileName for Windows2000

Windows2000で、GetProcessImageFileNameWが見つからないというエラーで起動できないアプリがたまにある。ATIToolとか。
そんなときはXPのpsapi.dllをアプリのディレクトリにコピーすると動くのだが、ライセンス的には微妙。


んでこれ読んでたら

LoadLibraryEx等を使い、データとしてプロセスにマッピングされたファイルのフルパスを得るコード。Process Explorerが[Type = Data]なモジュールのフルパスを表示していることに今更ながら気づいたのでやってみた。実際はGetMappedFileNameの実行と、その戻り値の加工のみだったりするんだけどね。

LOAD_LIBRARY_AS_DATAFILEなハンドルからフルパスを得る - やや温め納豆

GetProcessImageFileNameは

  1. EnumProcessModulesでプロセスのモジュールハンドルリストの先頭のモジュールハンドルを得る
  2. GetModuleInformationでそのモジュールのマップアドレスを得る
  3. GetMappedFileNameでNTパス名を得る

ってやれば代替できることに気がついた。


というわけでpsapi.dllという名前でサイドバイサイドDLL書いてみたところうまくいった。→アーカイブ
蛇足だけど、XPのpsapi.dllをコピーしてくるかわりに、これをアプリのディレクトリにコピーすればよいという話です。
参考にしたのはNyaRuRuさんのところ


ちなみにNT4.0用のPSAPIがダウンロードできるんだけど、エクスポートされている関数はWindows2000と一緒だった。