C でプロセス ハンドルに関連付けられたファイル名を取得しようとしています。私のコードは Windows XP で実行する必要があるため、 ( QueryFullProcessImageNameではなく) GetProcessImageFileNameを使用しています。
ただし、GetProcessImageFileNameはパスをデバイス形式 (例: \device\harddiskvolume0\) で返します。これをドライブ文字に変換するにはどうすればよいですか?
GetModuleFileNameEx
ルークがコメントで行ったように、私は提案するつもりでした。
QueryDosDevice()
すべてのドライブ文字で (すべてのドライブ文字を で見つけることができますGetLogicalDrives()
) 別の賭けになりますが、理論的には、ドライブ文字なしでパスを取得したり、シンボリック リンクが単純な文字列比較を台無しにしたりする可能性があります。
しかし..これはどうですか... NTパスの前に\??\GLOBALROOT
(これはメモリからのものであり、正確ではない可能性があります)を付けて、のような関数で使用できるはずですCreateFileW()
。(私の知る限り、ファイル API の Unicode バージョンである必要があります。)
代わりに、ドライブ文字形式をデバイス形式に変換してみてください。これが私がやったことです。
TCHAR szTemp[MAX_PATH] = {0};
_tcsncpy(szTemp, lpszImageFile, 2);
QueryDosDevice(szTemp, szImageFile, MAX_PATH);
_tcsncat(szImageFile, lpszImageFile+2, _tcslen(lpszImageFile) - 2);
このコードでは、lpszImageFile はプロセスのフル パス名です (例: c:\program files\test.exe)。