Пишем на Delphi.
Потребовалось найти PPID. Т.е. PID потомка процесса порождающего его.
//******************************************************************************
//функция получает ПИД дочернего процесса , передается ПИД процесса родителя
//******************************************************************************
function Get_PIDchild_process(PIDparent:Cardinal):Cardinal;
var
HandleSnapShot : THandle;
EntryParentProc : TProcessEntry32;
fnd: boolean;
begin
result := 0; //если процесс не существует
HandleSnapShot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);//делаем снапшот процессов или чего там (короче диспетчера задач)
EntryParentProc.dwSize := SizeOf(EntryParentProc); //я так понимаю создаем структуру , этакий шаблон , для получения данных
fnd := Process32First(HandleSnapShot, EntryParentProc); // Находим первый процесс. передавая снапшота в структуру данных
while fnd do // Цыкл перебора всех процессов в системе (снапшоте).
begin
if (EntryParentProc.th32ParentProcessID = PIDparent) then //если найден процеесс у которого родитель его то
begin
fnd := false; //заканчиваем цыкл
result := EntryParentProc.th32ProcessID; //возвращааем PID процесса потомка
ShowMessage(inttostr(PIDparent)+' '+inttostr(EntryParentProc.th32ProcessID)+' '+EntryParentProc.szExeFile);
end;
fnd := Process32Next(HandleSnapShot, EntryParentProc); // Схожий процесс не найден, продолжаем перебор
end;
CloseHandle(HandleSnapShot); // Закрываем наш снепшот.
end;
//функция получает ПИД дочернего процесса , передается ПИД процесса родителя
//******************************************************************************
function Get_PIDchild_process(PIDparent:Cardinal):Cardinal;
var
HandleSnapShot : THandle;
EntryParentProc : TProcessEntry32;
fnd: boolean;
begin
result := 0; //если процесс не существует
HandleSnapShot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);//делаем снапшот процессов или чего там (короче диспетчера задач)
EntryParentProc.dwSize := SizeOf(EntryParentProc); //я так понимаю создаем структуру , этакий шаблон , для получения данных
fnd := Process32First(HandleSnapShot, EntryParentProc); // Находим первый процесс. передавая снапшота в структуру данных
while fnd do // Цыкл перебора всех процессов в системе (снапшоте).
begin
if (EntryParentProc.th32ParentProcessID = PIDparent) then //если найден процеесс у которого родитель его то
begin
fnd := false; //заканчиваем цыкл
result := EntryParentProc.th32ProcessID; //возвращааем PID процесса потомка
ShowMessage(inttostr(PIDparent)+' '+inttostr(EntryParentProc.th32ProcessID)+' '+EntryParentProc.szExeFile);
end;
fnd := Process32Next(HandleSnapShot, EntryParentProc); // Схожий процесс не найден, продолжаем перебор
end;
CloseHandle(HandleSnapShot); // Закрываем наш снепшот.
end;
Прокомментирую, в кратце.
Делаем «снапшот» всех процессов в системе. Создаем структур (массив) — в которую будем передавать снапшот, а дальше просто цыклом перебираем. И тем самым находим по PID родителя PID потока.