Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Как получить Processid вызвав ShellExecuteEx?


Автор: leniviy 8.10.2004, 14:03
Ну никак не могу найти

Автор: Step 8.10.2004, 15:49
ИМХО GetSecurityInfo

Автор: p0s0l 8.10.2004, 17:11
idProcess = GetProcessId ( hProcess ); - эта функция только в WinXP/2k3!

Способ для всех NT-вындов: как сказал Step, только я честно говоря не знаю как это делается... Было бы познавательно узнать...

Способ для всех 9x/NT виндов:
делаешь CreateToolhelp32Snapshot, циклом Process32First / Process32Next, тем самым получая PID всех процессов, открываешь их, и смотришь, тот ли это процесс. Например, через GetProcessTimes можно узнать время создания (два процесса не могут иметь в точности одинаковое время создания...)...

В Си не прогаю, но примерно будет так:
Код

 ShellExecuteEx ( &sei );

 FILETIME time1, time2, tmp;
 GetProcessTimes( sei.hProcess, time1, tmp, tmp, tmp );
 HANDLE hSnapshot = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
 PROCESSENTRY32 pe32.dwSize = sizeof( pe32 );
 if Process32First( hSnapshot, &pe32 )
 {
    do
    {
     HANDLE hProcess1 = OpenProcess( PROCESS_QUERY_INFORMATION, FALSE, pe32.th32ProcessID );
     GetProcessTimes( hProcess1, time2, tmp, tmp, tmp );
     CloseHandle( hProcess1 );
     if( (time1.dwLowDateTime == time2.dwLowDateTime)&&( time1.dwHighDateTime == time2.dwHighDateTime ) ) then Break;
     } while( Process32Next( hSnapshot, pe32 ) );
 }
 CloseHandle( hSnapshot );

// в pe32.th32ProcessID содержится ID процесса
С циклами, наверное, фигню спорол, но главное - смысл...

Автор: Step 8.10.2004, 17:23
Цитата(p0s0l @ 8.10.2004, 17:11)
Способ для всех 9x/NT виндов: делаешь CreateToolhelp32Snapshot, циклом Process32First / Process32Next, тем самым получая PID всех процессов, открываешь их, и смотришь, тот ли это процесс. Например, через GetProcessTimes можно узнать время создания (два процесса не могут иметь в точности одинаковое время создания...)...

все правильно можно и так
Цитата(p0s0l @ 8.10.2004, 17:11)
HANDLE hProcess1 = OpenProcess( PROCESS_QUERY_INFORMATION, FALSE, pe32.th32ProcessID );

тут просто нужно сравнить с хендлом который получил и выйти когад совподет
Цитата(p0s0l @ 8.10.2004, 17:11)
Было бы познавательно узнать...

я этого не делал, но порядок примерно такой
в ShellExecuteEx передаеться указатель на структуру после выполнения поля структуры меняються
получаем хендл и вызываем GetSecurityInfo
в которую передаюеться хендл настрока запрашываемого объекта и указатели

и по выполнению получаем сид
Добавлено @ 17:24
Цитата(p0s0l @ 8.10.2004, 17:11)
dProcess = GetProcessId ( hProcess ); - эта функция только в WinXP/2k3!

а вот это для меня было новостью... к сожелению доки не нашел в МСДН

Автор: p0s0l 8.10.2004, 18:47
Цитата
тут просто нужно сравнить с хендлом который получил и выйти когад совподет
Хм... у меня не совпадают... С какими параметрами надо вызывать OpenProcess, чтобы получить такой же хэндл ?
Я в цикле перебрал все возможные права доступа в OpenProcess, начиная от 0 до 0xFFFF (аж с запасом), с TRUE и FALSE в качестве параметра bInheritHandle, - и всё равно не получается такого же точно хэндла...

Цитата
и по выполнению получаем сид
А дальше ? Что делать с SID'ом ? Извини, если торможу... Как перевести SID -> PID ?

Цитата
а вот это для меня было новостью... к сожелению доки не нашел в МСДН

Вот из MSDN:
Цитата
The GetProcessId function retrieves the process identifier of the specified process.

void GetProcessId(
  HANDLE Process
);

Parameters
Process
[in] Handle to the process. The handle must have the PROCESS_QUERY_INFORMATION access right. For more information, see Process Security and Access Rights.
Return Values
If the function succeeds, the return value is the process identifier of the specified process.

If the function fails, the return value is zero. To get extended error information, call GetLastError.

Remarks
Until a process terminates, its process identifier uniquely identifies it on the system.

Requirements
Client: Included in Windows XP SP1.
Server: Included in Windows .NET Server 2003.
Header: Declared in Winbase.h; include Windows.h.
Library: Use Kernel32.lib.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)