Process32Nextとかで取得できるPROCESSENTRY32のszExeFileを頼る以外にイメージファイル名を得る方法はありますか?

大抵のプロセスは以下のような感じでOKなのですが
いくつかのプロセスはOpenProcessで失敗してしまいます (GetLastErrorはアクセスが拒否されたといってます

HANDLE ph = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, this->pid_ );

HMODULE mh=0; DWORD r=0;
EnumProcessModules( ph, &mh, sizeof(mh), &r );

char buf[MAX_PATH] = {0};
if( GetModuleBaseName(ph, mh, buf, sizeof(buf)) )
  result = std::string(buf);