Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.95/21: Рейтинг темы: голосов - 21, средняя оценка - 4.95
Одессит
243 / 88 / 44
Регистрация: 30.12.2013
Сообщений: 316
Записей в блоге: 2
1

Узнать информацию из другого потока\процесса

03.12.2014, 18:28. Показов 4211. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Главная цель: узнать адрес процесса по PID используя только windows.h
Допустим я знаю pid процесса "notepad".
У меня идея такая: есть функция GetModuleFileName(), с помощью которой можно узнать адрес текущего процесса. Возможно ли так, чтоб поток процесса "notepad" стал родным для функции GetModuleFileName()?

Возможно мне нужна функция CreateRemoteThread, с помощь которой можно запустить код в другом процессе. Но процесс вылетает с ошибкой, да я и не уверен, что это то что мне нужно.
Есть какие-то идеи?

Добавлено через 43 минуты
Такой код не подходит, какую-то фигню выводит:
C++
1
2
3
4
5
6
7
char lp[1000];
 
        int pid = 4820;
    HANDLE  handle;
    handle = OpenProcess(PROCESS_ALL_ACCESS, true, pid);
    GetModuleFileName((HINSTANCE)handle, lp, 1000);
    cout << lp << endl;
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.12.2014, 18:28
Ответы с готовыми решениями:

Управление объектами потока из другого потока
Доброго времени. Есть два потока, один GUI, второй рабочий - делает снапшоты открытых окон,...

Как узнать id процесса по имени процесса?
Как узнать id процесса по имени процесса? Например ищем notepad.exe и возвращается id этого...

Кнопка из другого потока
В одном потоке создается окно, и его hwnd записывается в глобальную переменную, а потом из другого...

Доступ к семафору из другого процесса
Отправили меня в этот раздел с моим вопросом :P Есть процесс читатель и несколько писателей, в...

16
120 / 142 / 46
Регистрация: 31.10.2014
Сообщений: 721
Записей в блоге: 1
03.12.2014, 19:00 2
Цитата Сообщение от kylroma Посмотреть сообщение
чтоб поток процесса "notepad" стал родным для функции GetModuleFileName()?
Что значит родным ?

GetModuleFileName()
не выдает никаких адресов !
0
Одессит
243 / 88 / 44
Регистрация: 30.12.2013
Сообщений: 316
Записей в блоге: 2
03.12.2014, 19:04  [ТС] 3
demmax2004,
Если в моём коде поменять функцию вот так :
C++
1
GetModuleFileName(NULL lp, 1000);
то переменной lp присваивается текст с адрессом текущего процесса.
0
120 / 142 / 46
Регистрация: 31.10.2014
Сообщений: 721
Записей в блоге: 1
03.12.2014, 19:13 4
адрес выдает GetProcAddress(), VirtualAlloc, HeapAlloc
0
Одессит
243 / 88 / 44
Регистрация: 30.12.2013
Сообщений: 316
Записей в блоге: 2
03.12.2014, 19:36  [ТС] 5
demmax2004,
Я извиняюсь очень устал и натупил с терминами.
Не адрес, а путь к файлу.
пример С:/windows/notepad.exe
0
120 / 142 / 46
Регистрация: 31.10.2014
Сообщений: 721
Записей в блоге: 1
03.12.2014, 19:50 6
Тогда тебе заглянуть в эту тему я там давал код на привилегии и как открывать процесс
Условие к использованию памяти созданного процесса через CreateProcess()
0
Одессит
243 / 88 / 44
Регистрация: 30.12.2013
Сообщений: 316
Записей в блоге: 2
03.12.2014, 20:03  [ТС] 7
demmax2004,
да вот поэтому я и парюсь, что по условию я не могу подключать TlHelp32.h.
Только windows.h
0
120 / 142 / 46
Регистрация: 31.10.2014
Сообщений: 721
Записей в блоге: 1
04.12.2014, 04:44 8
Цитата Сообщение от kylroma Посмотреть сообщение
TlHelp32.h.
А причем тут вообще какой то TlHelp32.h ???? Не подключай его если тебе не надо.
0
286 / 192 / 56
Регистрация: 25.12.2012
Сообщений: 640
04.12.2014, 14:21 9
HMODULE это не HANDLE который возвращает OpenProcess. В вашем случае адрес можно узнать при помощи NtQueryInformationProcess.

Добавлено через 18 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <Windows.h>
#include "ntdll.h"
#pragma comment(lib,"ntdll.lib")
 
PWSTR GetNameByPID(DWORD PID);
 
int _tmain(int argc, _TCHAR* argv[])
{
    int pid = 2084;   
    wprintf(L"%s \n", GetNameByPID(pid));
    return 0; 
}
 
PWSTR GetNameByPID(DWORD PID){
    ULONG pInfo[6], dwReaded, pProcParams, pName;
    USHORT wNameLen;
    PWSTR ret = NULL;
    HANDLE hProc = 0;
 
    hProc = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, 0, PID);
    if (!hProc)
        goto exit;
    if (NtQueryInformationProcess(hProc, (PROCESSINFOCLASS)0, pInfo, 0x18, 0))
        goto exit;
    if ((!ReadProcessMemory(hProc, (PVOID)((__int64)pInfo[1] + 0x10), &pProcParams, 4, &dwReaded)) 
        || (dwReaded != 4))
            goto exit;
    if ((!ReadProcessMemory(hProc, (PVOID)((__int64)pProcParams + 0x38), &wNameLen, 2, &dwReaded)) 
        || (dwReaded != 2))
            goto exit;
    if ((!ReadProcessMemory(hProc, (PVOID)((__int64)pProcParams + 0x3C), &pName, 4, &dwReaded)) 
        || (dwReaded != 4))
            goto exit;
    if (!pName)
        goto exit;
    ret = (PWSTR)malloc(wNameLen + 2);
    if (!ret)
        goto exit;
    if ((!ReadProcessMemory(hProc, (PVOID)((__int64)pName), ret, wNameLen, &dwReaded)) 
        || (dwReaded != wNameLen)){
            free(ret);
            ret = NULL;
        }
exit:
    if (hProc)
        CloseHandle(hProc);
    return ret;
}
0
120 / 142 / 46
Регистрация: 31.10.2014
Сообщений: 721
Записей в блоге: 1
04.12.2014, 14:56 10
GetNameByPID(DWORD PID)
Зачем все так сложно в этой функции ?
0
Одессит
243 / 88 / 44
Регистрация: 30.12.2013
Сообщений: 316
Записей в блоге: 2
05.12.2014, 12:35  [ТС] 11
Цитата Сообщение от demmax2004 Посмотреть сообщение
А причем тут вообще какой то TlHelp32.h ???? Не подключай его если тебе не надо.
в приведённом примере вот так узнаётся имя процесса:
C++
1
2
3
4
PROCESSENTRY32 pe32={0}; //нужно подключить TlHelp32.h 
......
//Отображение информации о процессе в списке
    wsprintf(sz,TEXT("Имя: %s"),pe32.szExeFile);
0
120 / 142 / 46
Регистрация: 31.10.2014
Сообщений: 721
Записей в блоге: 1
05.12.2014, 14:07 12
Цитата Сообщение от kylroma Посмотреть сообщение
в приведённом примере вот так узнаётся имя процесса:
Этот пример не для тебя, все что для тебя это следующая функция
0
286 / 192 / 56
Регистрация: 25.12.2012
Сообщений: 640
05.12.2014, 16:06 13
Лучший ответ Сообщение было отмечено kylroma как решение

Решение

Цитата Сообщение от kylroma Посмотреть сообщение
используя только windows.h
Тогда воспользуйтесь LoadLibrary и GetProcAddress.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include "stdafx.h"
#include <Windows.h>
 
typedef int  (*__stdcall proc) (HANDLE  hProcess, int ProcessInformationClass, PVOID pProcessInformation, int uProcessInformationLength, int puReturnLength);
proc NtQueryInformationProcess;
 
PWSTR GetNameByPID(DWORD PID);
 
int _tmain(int argc, _TCHAR* argv[])
{
    int pid = 3840;  
    NtQueryInformationProcess = (proc)GetProcAddress(LoadLibraryA("ntdll.dll"),"NtQueryInformationProcess");    
    wprintf(L"%s \n", GetNameByPID(pid));   
    return 0;
}
 
PWSTR GetNameByPID(DWORD PID){
    ULONG pInfo[6], dwReaded, pProcParams, pName;
    USHORT wNameLen;
    PWSTR ret = NULL;
    HANDLE hProc = 0;
 
    hProc = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, 0, PID);
    if (!hProc)
        goto exit;  
    if (NtQueryInformationProcess(hProc, 0, pInfo, 0x18, 0))
        goto exit;
    if ((!ReadProcessMemory(hProc, (PVOID)((__int64)pInfo[1] + 0x10), &pProcParams, 4, &dwReaded)) 
        || (dwReaded != 4))
            goto exit;
    if ((!ReadProcessMemory(hProc, (PVOID)((__int64)pProcParams + 0x38), &wNameLen, 2, &dwReaded)) 
        || (dwReaded != 2))
            goto exit;
    if ((!ReadProcessMemory(hProc, (PVOID)((__int64)pProcParams + 0x3C), &pName, 4, &dwReaded)) 
        || (dwReaded != 4))
            goto exit;
    if (!pName)
        goto exit;
    ret = (PWSTR)malloc(wNameLen + 2);
    if (!ret)
        goto exit;
    if ((!ReadProcessMemory(hProc, (PVOID)((__int64)pName), ret, wNameLen, &dwReaded)) 
        || (dwReaded != wNameLen)){
            free(ret);
            ret = NULL;
        }
exit:
    if (hProc)
        CloseHandle(hProc);
    return ret;
}
0
Одессит
243 / 88 / 44
Регистрация: 30.12.2013
Сообщений: 316
Записей в блоге: 2
05.12.2014, 16:19  [ТС] 14
demmax2004, а можно в двух словах объяснить, что мне делать с этой функцией? Сижу ковыряюсь с ней, а ничего путного не выходит.
0
120 / 142 / 46
Регистрация: 31.10.2014
Сообщений: 721
Записей в блоге: 1
05.12.2014, 16:25 15
Вызвать перед получением имени стороннего процесса.

Ну еще лучше воспользоваться этой функцией
http://vsokovikov.narod.ru/New... nameex.htm
1
286 / 192 / 56
Регистрация: 25.12.2012
Сообщений: 640
05.12.2014, 16:49 16
Я там чуть чуть ошибся, замените
C++
1
typedef int  (*__stdcall proc) (HANDLE  hProcess, int ProcessInformationClass, PVOID pProcessInformation, int uProcessInformationLength, int puReturnLength);
На
C++
1
typedef int  (__stdcall *proc) (HANDLE  hProcess, int ProcessInformationClass, PVOID pProcessInformation, int uProcessInformationLength, int puReturnLength);
Просто вставте как есть , измените pid на нужный и запустите, у меня всё работает.

Добавлено через 6 минут
Цитата Сообщение от demmax2004 Посмотреть сообщение
Ну еще лучше воспользоваться этой функцией
Ну не знаю будет ли лучше, там ещё нужно найти базовый адрес программы, а это тоже не просто.

Добавлено через 7 минут
Хотя если нужно конкретно для программы, а не для dll то конечно вариант с GetModuleFileNameEx будет проще, но там нужно подключать Psapi.h, а по условию нужно только windows.h.

Добавлено через 6 минут
Ещё можно так сделать
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "stdafx.h"
#include <Windows.h>
 
typedef int  (__stdcall *proc) (HANDLE  hProcess, int hModule, PVOID lpFilename, int size);
proc GetModuleFileNameExA;
 
int _tmain(int argc, _TCHAR* argv[])
{
    int pid = 3452;  
    char name[1000];
    GetModuleFileNameExA = (proc)GetProcAddress(LoadLibraryA("psapi.dll"),"GetModuleFileNameExA");    
    GetModuleFileNameExA(OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, 0, pid),0,name, 1000);   
    printf("%s \n", name); 
    return 0;
}
Добавлено через 2 минуты
проверял на калькуляторе всё работает.)
0
Одессит
243 / 88 / 44
Регистрация: 30.12.2013
Сообщений: 316
Записей в блоге: 2
05.12.2014, 16:59  [ТС] 17
Большое спасибо всем за участие! Очень сильно помогли.
0
05.12.2014, 16:59
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.12.2014, 16:59
Помогаю со студенческими работами здесь

Re: Перерисовка окна из другого процесса
Нужно вызвать перерисовку окна из другого процесса. #include ...... int _tmain(int argc,...

Определить позицию скролла другого процесса
Писал в соседнюю ветку (Visual C++) там никто не знает. Скорее всего веткой ошибся. пишу сюда, т.к....

Защита от завершения одного процесса без другого
Добрый вечер. Нужна помощь в следующем вопросе у меня есть приложение zzz.exe я его запускаю с...

Передать процессу значение переменной из другого процесса
Здравствуйте. У меня программа состоит из окна с кнопкой и двух процессов. При нажатии на кнопку...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru