Задача: есть 32-битное приложение. Оно знает PID другого приложения. По этому PID'у нужно узнать путь к исполняемому файлу. Приложение обладает отладочными привилегиями. Пробовал так: Код (Text): hProcess = OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ, true, CurrentPID); if(!GetModuleFileNameEx(hProcess, 0, &szTextBuffer, MAX_PATH)) err = GetLastError(); ... И так: Код (Text): hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, CurrentPID); if(hModuleSnap == INVALID_HANDLE_VALUE) err = GetLastError(); ... Результат один. Если второе приложение 32-битное, то отрабатывает нормально, а если 64-битное - возвращает ошибку 299: Есть ли способ без извратов получить путь к исполняемому файлу 64-битного процесса из 32-битного?
dinoweb Код (Text): NTSYSCALLAPI NTSTATUS NTAPI NtWow64ReadVirtualMemory64( __in HANDLE ProcessHandle, __in_opt PVOID64 BaseAddress, __out_bcount(BufferSize) PVOID Buffer, __in ULONGLONG BufferSize, __out_opt PULONGLONG NumberOfBytesRead );
ziral2088 Верно, проблема вероятно в этом. Похоже, что путь к файлу хранится за пределами видимости 32-битных функций чтения памяти... Читать его напрямую из памяти - не универсально... (Можно решить задачу, прочитав буфер с CommandLine, указатель на который хранится в локальной переменной kernel, которая возращается функцией GetCommandLine). Но может быть есть другой способ? Где можно посмотреть полный список Wow64 функций? В msdn.microsoft.com я их не нашёл.
dinoweb Открой файлик \SysWOW64\ntdll.dll и посмотри на список функций. Описание можешь в гугле найти или в PDB.