Узнать путь к исп.файлу 64-битного процесса из 32-битного, по PID

Тема в разделе "WASM.X64", создана пользователем dinoweb, 4 июл 2011.

  1. dinoweb

    dinoweb Дмитрий

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    129
    Адрес:
    Россия. Красноярск
    Задача: есть 32-битное приложение. Оно знает PID другого приложения. По этому PID'у нужно узнать путь к исполняемому файлу. Приложение обладает отладочными привилегиями.

    Пробовал так:
    Код (Text):
    1.   hProcess = OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ, true, CurrentPID);
    2.   if(!GetModuleFileNameEx(hProcess, 0, &szTextBuffer, MAX_PATH))
    3.       err = GetLastError();
    4.   ...
    И так:
    Код (Text):
    1.   hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, CurrentPID);
    2.   if(hModuleSnap == INVALID_HANDLE_VALUE)
    3.       err = GetLastError();
    4.   ...
    Результат один. Если второе приложение 32-битное, то отрабатывает нормально, а если 64-битное - возвращает ошибку 299:
    Есть ли способ без извратов получить путь к исполняемому файлу 64-битного процесса из 32-битного?
     
  2. ziral2088

    ziral2088 New Member

    Публикаций:
    0
    Регистрация:
    16 авг 2009
    Сообщения:
    283
    dinoweb
    Код (Text):
    1. NTSYSCALLAPI
    2. NTSTATUS
    3. NTAPI
    4. NtWow64ReadVirtualMemory64(
    5.     __in HANDLE ProcessHandle,
    6.     __in_opt PVOID64 BaseAddress,
    7.     __out_bcount(BufferSize) PVOID Buffer,
    8.     __in ULONGLONG BufferSize,
    9.     __out_opt PULONGLONG NumberOfBytesRead
    10.     );
     
  3. dinoweb

    dinoweb Дмитрий

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    129
    Адрес:
    Россия. Красноярск
    ziral2088
    Верно, проблема вероятно в этом. Похоже, что путь к файлу хранится за пределами видимости 32-битных функций чтения памяти...

    Читать его напрямую из памяти - не универсально... (Можно решить задачу, прочитав буфер с CommandLine, указатель на который хранится в локальной переменной kernel, которая возращается функцией GetCommandLine). Но может быть есть другой способ?

    Где можно посмотреть полный список Wow64 функций? В msdn.microsoft.com я их не нашёл.
     
  4. T800

    T800 Member

    Публикаций:
    0
    Регистрация:
    7 дек 2006
    Сообщения:
    293
    Адрес:
    Moscow
    dinoweb
    Открой файлик \SysWOW64\ntdll.dll и посмотри на список функций.
    Описание можешь в гугле найти или в PDB.
     
  5. dinoweb

    dinoweb Дмитрий

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    129
    Адрес:
    Россия. Красноярск
    Проблему решил функцией GetProcessImageFileName, она не обламывается на 64-битных приложениях.