Форум программистов, компьютерный форум, киберфорум
C++: WinAPI
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.62/81: Рейтинг темы: голосов - 81, средняя оценка - 4.62
18 / 2 / 1
Регистрация: 31.08.2011
Сообщений: 132
1

Как узнать Handle или PID процесса, зная его имя и класс?

06.08.2012, 20:00. Показов 15557. Ответов 21
Метки нет (Все метки)

Как узнать Handle или PID процесса, зная его имя и класс?
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.08.2012, 20:00
Ответы с готовыми решениями:

Определить заголовок(имя) окна, зная PID его процесса
Сабж! Уже 2ой день не могу найти - как? У меня известе PID и hwnd процесса, как узнать имя окна(то...

Как узнать ID процесса (PID) по дескриптору окна (Handle)?
АП. Интересует как узнать PID по Handle.

Закрытие процесса по его PID и заморозка процесса по его имени или PID
Нужны две вот такие функции закрытие процесса по его PID и заморозка процесса по его имени или PID....

Получить имя процесса зная handle
кому-то да понадобиться вот код : private static extern Int32...

21
5 / 8 / 2
Регистрация: 30.07.2012
Сообщений: 235
06.08.2012, 21:59 2
Цитата Сообщение от MaxxximyM Посмотреть сообщение
Как узнать Handle процесса, зная его имя и класс?
Описание:
function FindWindow(ClassName, WindowName: PChar): HWnd;

Находит pодительское окно веpхнего уpовня с совпадающими ClassName и WindowName. Не осуществляет поиск дочеpних окон.

Паpаметpы:
ClassName: Имя класса окна (заканчивающееся пустым символом, nil - если все классы).
WindowName: Текстовый заголовок окна или 0, если все окна.

Возвpащаемое значение:
Описатель окна; 0 - если такого окна нет.
Материал взят из:
Русская спpавка по Windows API
0
18 / 2 / 1
Регистрация: 31.08.2011
Сообщений: 132
07.08.2012, 09:32  [ТС] 3
Может я что-то путаю, но по-мойму FindWindow возвращает дескриптор окна(HWND), а не HANDLE.
0
555 / 509 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
07.08.2012, 10:33 4
Цитата Сообщение от MaxxximyM Посмотреть сообщение
Может я что-то путаю
окно с процессом? или что такое "класс процесса"?
0
18 / 2 / 1
Регистрация: 31.08.2011
Сообщений: 132
07.08.2012, 10:35  [ТС] 5
В spy++ из Visual Studio можно посмотреть класс........окна наверно.
Значит надо найти PID или HANDLE окна. Как?
0
Эксперт С++
2921 / 1270 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
07.08.2012, 14:40 6
Стоп.
HANDLE окна - это не то же самое, что HANDLE процесса. Что именно ты ищешь?
Ну и PID - имеет смысл только для процесса.
0
18 / 2 / 1
Регистрация: 31.08.2011
Сообщений: 132
07.08.2012, 15:05  [ТС] 7
Запутался.
Так, нужно найти handle или PID ПРОЦЕССА.
0
быдлокодер
1721 / 908 / 106
Регистрация: 04.06.2008
Сообщений: 5,635
07.08.2012, 15:23 8
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
#include <stdio.h> 
#include <Windows.h> 
#include <Winnt.h> 
//Здесь определена структура PROCESSENTRY32 и функция CreateToolhelp32Snapshot
#include <tlhelp32.h>
 FILE *f;
bool SpisokProcessov ()  {
 
 HANDLE hProcessSnap;
 PROCESSENTRY32 pe32;
 
 //Это мы находим дескриптор снимка процессов
 hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 
 if (hProcessSnap == INVALID_HANDLE_VALUE)
 return false;
 pe32.dwSize = sizeof(PROCESSENTRY32);
 
 
 int i= 0;
 
 //
 
 Process32First(hProcessSnap, &pe32);
 printf ("%d  PID= %x  %s\n",++i, pe32.th32ProcessID, pe32.szExeFile);
 fprintf(f,"%d  PID= %x   %s \n",i, pe32.th32ProcessID, pe32.szExeFile);
 while (Process32Next(hProcessSnap, &pe32)) {
  printf ("%d  PID= %x  %s\n",++i, pe32.th32ProcessID, pe32.szExeFile);
  fprintf(f,"%d  PID= %x   %s \n",i, pe32.th32ProcessID, pe32.szExeFile);
 } 
 
 
 CloseHandle(hProcessSnap);
 return true;
}
 
 
 
 int main () {
 f = fopen("rezultat.txt","wb");
 
 //Если циклом не хочешь, надо закомментить эту херь
 //while (1) 
  SpisokProcessov ();
 fclose (f);
  getchar ();
  return 0;
 }
ЭТо вот PID-ы всех процессов. Сравнивай имена с нужными и будет тебе счастье


А вот хэндл процесса по имени
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include <stdio.h> 
#include <Windows.h> 
#include <tlhelp32.h>
 
HANDLE HandleProcessa (char* );
 
int main () {
 int i= 0;
 char ima_processa [1024]; 
 printf ("vvodi ima processa \n");
 for (;        (ima_processa [i]= getchar ())!= 10; i++) { }
  ima_processa [i]= 0;
 
 HANDLE hProcess= HandleProcessa (ima_processa);
 
 printf ("Handle processa %s raven %x\n",ima_processa, hProcess);
 
 CloseHandle (hProcess);
 system ("PAUSE");
 return 0;
}
 
 
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
 
 
HANDLE HandleProcessa (char* szFilename) {
 
 HANDLE hProcessSnap;
 PROCESSENTRY32 pe32;
 
 //Это мы находим дескриптор снимка процессов
 hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 
 if (hProcessSnap == INVALID_HANDLE_VALUE)
 return false;
 pe32.dwSize = sizeof(PROCESSENTRY32);
 
 
 Process32First(hProcessSnap, &pe32);
 while (lstrcmpi(pe32.szExeFile, szFilename)) // ищем нужный процесс. Его PID будет в поле pe32.th32ProcessID              
 {
  if (!Process32Next(hProcessSnap, &pe32)) { // перечисляем процессы
   CloseHandle(hProcessSnap);
   return FALSE;
  } 
 };
 
 
 CloseHandle(hProcessSnap);
 
 //Тот самый хэрдл, который ищем
 HANDLE hProcess;
 
 
 //Функция OpenProcess возвращает дескриптор процесса, а третий принимаемый ею параметр- идентификатор процесса
 // (PID)
 
//Внимание! Не для всех процессов возвращается хэндл, если права доступа PROCESS_ALL_ACCESS
//Приходится использовать только для чтения
 hProcess = OpenProcess(PROCESS_VM_READ, 0, pe32.th32ProcessID);
 
 return hProcess;
};
писал давно, поэтому код коряв даже на мой взгляд. Но рабоч.
0
555 / 509 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
07.08.2012, 15:28 9
Цитата Сообщение от MaxxximyM Посмотреть сообщение
Запутался.
Так, нужно найти handle или PID ПРОЦЕССА.
ну, тогда не "зная его имя и класс", а что-нибудь другое. имя и класс его главного окна? тогда юзай GetWindowThreadProcessID() (как найти окно тебе уже рассказали)
0
быдлокодер
1721 / 908 / 106
Регистрация: 04.06.2008
Сообщений: 5,635
07.08.2012, 16:10 10
А вот кому хэндл процесса через окно!
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
#include <stdio.h> 
#include <Windows.h> 
 
HANDLE HProcessa_cherez_ima_okna ();
 
 
int main () {
 SetConsoleCP(1251);
 SetConsoleOutputCP(1251);
 
 HANDLE temp; 
 temp= HProcessa_cherez_ima_okna();
 
 printf ("хэндл процесса равен %x\n", (unsigned int)temp);
 system ("PAUSE");
 return 0;
}
 
 
HANDLE HProcessa_cherez_ima_okna () {
 
  HWND hokna;
  
  //Тут будет храниться PID процесса
  DWORD ProcessId;
 
  hokna= FindWindow (0, "заголовок");
  if (!(hokna)) {
   printf ("не удалось найти дескриптор окна\n");
   system ("pause");
   return 0;
  }
   
  if (!(GetWindowThreadProcessId(hokna, &ProcessId))) {
   printf ("PID не найден\n");
   system ("pause");
   return 0;
  }  
 
 //Тот самый хэрдл, который ищем
 HANDLE hProcess;
 hProcess = OpenProcess(PROCESS_VM_READ, 0, ProcessId);
 return hProcess;
};
0
135 / 20 / 2
Регистрация: 06.05.2019
Сообщений: 1,372
Записей в блоге: 3
02.05.2021, 21:44 11
Цитата Сообщение от CheshireCat Посмотреть сообщение
HANDLE процесса. Что именно ты ищешь?
Мне нужен HANDLE процесса
пишу код так
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
52
53
54
55
56
#define ret return
#define en endl
char*put="C:\\Program Files\\BraveSoftware\\Brave-Browser\\Application\\brave.exe";
 
STARTUPINFOA start_info={sizeof start_info};//
PROCESS_INFORMATION proc_info={0};//
CreateProcessA(put,0,0,0,0,0,0,0,&start_info,&proc_info);//proc_info.dwProcessId/
Sleep(20000);
 
HANDLE Process_[4]={CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0)};///TH32CS_SNAPALL
PROCESSENTRY32 pe32pr={};pe32pr.dwSize=sizeof(pe32pr);
if(Process32FirstW(Process_[0],&pe32pr)){
if(!_tcscmp(pe32pr.szExeFile,TEXT("brave.exe"))){
cout<<"процесс "<<pe32pr.th32ProcessID<<en;}
else
for(;Process32NextW(Process_[0],&pe32pr);){
if(!_tcscmp(pe32pr.szExeFile,TEXT("brave.exe"))){
cout<<"процесс "<<pe32pr.th32ProcessID<<en;break;}
}
}
 
Process_[1]=CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD,pe32pr.th32ProcessID);
THREADENTRY32 pe32pt={};pe32pt.dwSize=sizeof(pe32pt);
if(Thread32First(Process_[1],&pe32pt)){
if(pe32pt.th32OwnerProcessID==pe32pr.th32ProcessID){
cout<<"поток "<<pe32pt.th32ThreadID<<en;}
else
for(;Thread32Next(Process_[1],&pe32pt);){
if(pe32pt.th32OwnerProcessID==pe32pr.th32ProcessID){
cout<<"поток "<<pe32pt.th32ThreadID<<en;break;}
}
}
 
Process_[2]=CreateToolhelp32Snapshot(TH32CS_SNAPHEAPLIST,0);//pe32pr.th32ProcessID
HEAPLIST32 he32k={};he32k.dwSize=sizeof(he32k);
if(Heap32ListFirst(Process_[2],&he32k)){if(he32k.th32ProcessID==pe32pr.th32ParentProcessID){
cout<<"номер блока/кучи "<<he32k.th32HeapID<<en;}
else
for(;Heap32ListNext(Process_[2],&he32k);){
if(he32k.th32ProcessID==pe32pr.th32ParentProcessID){//he32k
cout<<"номер блока/кучи "<<he32k.th32HeapID<<en;break;
}}
}
 
HEAPENTRY32 he32h={};he32h.dwSize=sizeof(he32h);
if(Heap32First(&he32h,pe32pr.th32ParentProcessID,he32k.th32HeapID)){//pe32pr.th32ParentProcessID/
if(he32h.th32ProcessID==pe32pr.th32ParentProcessID){
cout<<"Дескриптор "<<he32h.hHandle<<en;}
else
for(;Heap32Next(&he32h);){
if(he32h.th32ProcessID==pe32pr.th32ParentProcessID){
cout<<"Дескриптор "<<he32h.hHandle<<en;break;
}}
}
 
Process_[3]=OpenProcess(0,1,pe32pr.th32ProcessID);//выдаёт 0
Никаких супер бупер прав доступа я не требую от него просто дескриптор. Может нужно по другому вызвать CreateProcessA. Последние 2 блока находят кучу и Хэндл но он там какой-то левый либо нашёл не правильно. Читал что есть функция которая может менять привелегии доступа, а также про какой-то токен процесса но я ничего не понял.
0
nmcf
02.05.2021, 21:55
  #12

Не по теме:

В разделе WinAPI надо о таком спрашивать.

0
135 / 20 / 2
Регистрация: 06.05.2019
Сообщений: 1,372
Записей в блоге: 3
02.05.2021, 23:42 13
Цитата Сообщение от nmcf Посмотреть сообщение
В разделе WinAPI надо о таком спрашивать.
Тему тоже там нужно было открывать её открыли здесь, а раз есть тема то в ней можно писать
0
Эксперт С++
2421 / 2029 / 303
Регистрация: 03.05.2011
Сообщений: 4,523
Записей в блоге: 15
05.05.2021, 18:06 14
Цитата Сообщение от Nexi99 Посмотреть сообщение
Последние 2 блока находят кучу и Хэндл но он там какой-то левый либо нашёл не правильно.
у меня чуть кровь из глаз не пошла от этого кода..
что за бред вы пишите?
и вообще, учитесь писать читабельный код, с соответствующими отступами, пробелами, скобками и переносами строк после точки с запятой.
такую ахинею и нагромождение всего подряд разбирать никто не будет.
я по-моему вам уже 100500 раз говорил - либо многобайтовая, либо юникод.
обе кодировки использовать нельзя.

на кой фиг вам потребовался массив дескрипторов?
я вообще без понятия чего вы хотите сделать?

Цитата Сообщение от Nexi99 Посмотреть сообщение
Читал что есть функция которая может менять привелегии доступа, а также про какой-то токен процесса но я ничего не понял.
и не поймёте.
как любит говорить Клерк (ака Инде) - это уровень не для нуби
1
135 / 20 / 2
Регистрация: 06.05.2019
Сообщений: 1,372
Записей в блоге: 3
05.05.2021, 18:37 15
Цитата Сообщение от _lunar_ Посмотреть сообщение
я вообще без понятия чего вы хотите сделать?
Я думал оно находит Хэндл процесса но ошибся, это Хэндл кучи, мне в голову не пришло что там тонна блокировок и никуда нету доступа.
Один из пользователей писал что есть массивы данных где хранятся все Хэндлы, все HWD, имена всех процессов и т.д. было бы классно получить туда нормальный прямой доступ а не использовать что-то вроде Heap32ListFirst и Heap32ListNext
Цитата Сообщение от _lunar_ Посмотреть сообщение
и не поймёте.
Вы сами не знаете как настроить привилегию доступа, знали бы показали бы если это конечно не нарушает ваши авторские права потому что не каждый выложит код.
0
nmcf
05.05.2021, 18:45
  #16

Не по теме:

Цитата Сообщение от _lunar_ Посмотреть сообщение
как любит говорить Клерк
А кто это?

0
804 / 307 / 58
Регистрация: 20.11.2012
Сообщений: 695
05.05.2021, 21:33 17

Не по теме:

Цитата Сообщение от nmcf Посмотреть сообщение
А кто это?
Интересная личность с wasm/exelab. Одними обожаемая, другими гонимая.:D



Цитата Сообщение от Nexi99 Посмотреть сообщение
Вы сами не знаете как настроить привилегию доступа, знали бы показали бы если это конечно не нарушает ваши авторские права потому что не каждый выложит код.
Уже как минимум 2 раза я давал ссылки на MSDN на ГОТОВУЮ функцию получения привилегий. И на функцию получения токена тоже. Серьезно, у тебя такой интересный способ программирования - чужими руками?
0
135 / 20 / 2
Регистрация: 06.05.2019
Сообщений: 1,372
Записей в блоге: 3
05.05.2021, 21:42 18
Цитата Сообщение от WhiteP Посмотреть сообщение
Уже как минимум 2 раза я давал ссылки на MSDN на ГОТОВУЮ функцию получения привилегий. И на функцию получения токена тоже. Серьезно, у тебя такой интересный способ программирования - чужими руками?
Я тут функцию, вернее некий предложенный код разработчиками выложил и спросил что здесь имеется в виду ответа не последовало.
C++
1
2
3
4
5
6
7
8
9
10
11
BOOL EnablePrivilege()
{
    LUID PrivilegeRequired ;
    BOOL bRes = FALSE;
  
    bRes = LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &PrivilegeRequired);
 
    // ...
 
    return bRes;
}
вот пост https://www.cyberforum.ru/post15468010.html, на самом же сайте описаны флаги и никаких функций и синтаксиса нет https://docs.microsoft.com/en-... -constants
что имеют в виду разработчики не понятно. там также есть куча ссылок с которыми тоже не понятно что делать например https://docs.microsoft.com/en-... loss/a-gly
0
804 / 307 / 58
Регистрация: 20.11.2012
Сообщений: 695
05.05.2021, 21:52 19
Вот тут я давал ссылки.
Окай, вот тебе код с той страницы:
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
52
#include <windows.h>
#include <stdio.h>
#pragma comment(lib, "cmcfg32.lib")
 
BOOL SetPrivilege(
    HANDLE hToken,          // access token handle
    LPCTSTR lpszPrivilege,  // name of privilege to enable/disable
    BOOL bEnablePrivilege   // to enable or disable privilege
    ) 
{
    TOKEN_PRIVILEGES tp;
    LUID luid;
 
    if ( !LookupPrivilegeValue( 
            NULL,            // lookup privilege on local system
            lpszPrivilege,   // privilege to lookup 
            &luid ) )        // receives LUID of privilege
    {
        printf("LookupPrivilegeValue error: %u\n", GetLastError() ); 
        return FALSE; 
    }
 
    tp.PrivilegeCount = 1;
    tp.Privileges[0].Luid = luid;
    if (bEnablePrivilege)
        tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    else
        tp.Privileges[0].Attributes = 0;
 
    // Enable the privilege or disable all privileges.
 
    if ( !AdjustTokenPrivileges(
           hToken, 
           FALSE, 
           &tp, 
           sizeof(TOKEN_PRIVILEGES), 
           (PTOKEN_PRIVILEGES) NULL, 
           (PDWORD) NULL) )
    { 
          printf("AdjustTokenPrivileges error: %u\n", GetLastError() ); 
          return FALSE; 
    } 
 
    if (GetLastError() == ERROR_NOT_ALL_ASSIGNED)
 
    {
          printf("The token does not have the specified privilege. \n");
          return FALSE;
    } 
 
    return TRUE;
}
Токен для передачи получай вызывая OpenProcessToken.
0
Эксперт С++
2421 / 2029 / 303
Регистрация: 03.05.2011
Сообщений: 4,523
Записей в блоге: 15
05.05.2021, 23:43 20
Цитата Сообщение от Nexi99 Посмотреть сообщение
Вы сами не знаете как настроить привилегию доступа
смешной ты
на посмотри как я "не умею" чего-то там настраивать https://www.cyberforum.ru/blog... g6994.html
ну и тулза с соответствующими функами, в т.ч. с построенной так привилегией, что увеличивает доступ до уровня выше системы Комплекс программных средств KernelExplorer GUI (с графическим интерфейсом пользователя)

Цитата Сообщение от nmcf Посмотреть сообщение
А кто это?
белорусский электрик.
интересная личность - одновременно может нести полную чушь, а может говорить достаточно умные вещи.
в 2000-х, когда ещё толком не было WRK и прочих слитых исходников, активно занимался реверсом ядро ХР, отсюда и неплохие знания в этой области.
придумал термин "визор" - типа автоматика, которая разбирает запротекченные семплы и находит OEP, вроде даже есть какая-то тулза от него, но пользоваться ею умеет только он (на экзклабе его много раз просили написать GUI для его визора).
обожает разбирать статику (в IDA), но в последнее время начал много говорить об отладчиках, мол зачем там писать GUI для его визора, когда уже всё готово.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.05.2021, 23:43

Как узнать имя процесса, зная имя программы?
Здравствуйте, подскажите пожалуйста, как узнать имя процесса выполняемой программы, зная имя этой...

Как узнать класс окна другого процесса? Желательно найти класс окна по PID процесса
Мне нужно узнать класс другого окна по PID процесса

Как определить PID процесса или имя по сети
Программа перехватывает с сетевого адаптера сетевые пакеты. Я возвращаю IP И порт . Как определить...

Как узнать полное имя файла зная его краткое имя?
например при запуске программы достаточно написать &quot;Excel&quot; или &quot;Calc&quot; при этом система уже в курсе...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.