![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Дерево процессов. [D7, Win95/98, WinXP]
Leaner © (2004-09-30 15:26:00)Пытаюсь построить дерево процессов
при помощи CreateToolHelp32Snapshot.
Но иногда, правда очень редко, возникает такая ситуация:
1. Process1 создал Process2.
2. Process1 терминировался.
3. Process2 создает Process3 и ID третьего процесса совпадает с ID первого
В этом случае при создании дерева мы попадаем в бесконечный цикл.
Как можно этого избежать ?
P.S. Новый Snapshot не помагает: в ParentID второго указан ID третьего.
Внук (2004-10-02 13:59:00) [1]Leaner © (01.10.04 14:18) [10]
Угу, тормознул, читал одно, а думал про другое. Такой эффект имеет место.
Leaner (2004-10-01 16:41:00) [2]>Игорь Шевченко © (01.10.04 16:21) [17]
SeDebugPrivilege - помогло !
После стольких мучений все открылось.
Огромное всемспасибо ! Теперь буду эксперементировать.
Игорь Шевченко (2004-10-01 16:21:00) [3]Leaner © (01.10.04 16:18) [16]
А GetLastError сообщил "Отказано в доступе" ?
Смирись, не судьба тебе их открыть. Если только не поробовать выставить привилегию отладки SeDebugPrivilege
Leaner (2004-10-01 16:18:00) [4]>Игорь Шевченко © (01.10.04 14:44) [15]
Попробовал: процессы, не отркывшиеся с
PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,
не открылись и без PROCESS_VM_READ
Игорь Шевченко (2004-10-01 14:44:00) [5]Leaner © (01.10.04 14:41) [14]
Попробуй убрать PROCESS_VM_READ - для ряда процессов такой доступ запрещен.
Leaner (2004-10-01 14:41:00) [6]>kaZaNoVa
WinLogon.exe откривается
А, например, SVCHOST.EXE у меня четыре.
Два открываются, а два - нет.
kaZaNoVa (2004-10-01 14:33:00) [7]Leaner © (01.10.04 14:31) [12]
тогда не знаю .. должно работать ..
- раз уж WinLogon.exe открывается ....
Leaner (2004-10-01 14:31:00) [8]>kaZaNoVa
>- права админа есть ?
Да.
kaZaNoVa (2004-10-01 14:28:00) [9]Leaner © (01.10.04 14:18) [10]
>не открываются при помощи
> OpenProcess
- права админа есть ?
Leaner (2004-10-01 14:18:00) [10]Всем огромное спасибо ! Попробую разобраться.
Но что делать с процессами, которые не открываются при помощи
OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,False,PID) ?
У меня таких четыре ( кроме System ID=4, и Idle ID=0 )
ALG.EXE, CSRSS.EXE и два SVCHOST.EXE
Я получал время старта через GetProcessTimes.
>Внук
>у меня все работает корректно. Snapshot обновляется
Запусти из какой нибудь программы другую и терминируй первую.
Сделай Snapshot и посмотри, что записано в ParentID второй.
Игорь Шевченко (2004-10-01 11:08:00) [11]Leaner © (30.09.04 15:26)
Для NT/Win2K/WinXP могу порекомендовать
http://www.schevchenko.net.ru/SRC/QuerySystemInformation_60.zip
Внук (2004-10-01 09:25:00) [12]И все-таки см. Digitman © (30.09.04 15:37) [1].
По-крайней мере, у меня все работает корректно. Snapshot обновляется.
Digitman (2004-10-01 08:36:00) [13]для win9x не подскажу
для NT-based систем следует открыть процесс (OpenProcess) и запросить инф-цию о нем (NtQueryInformationProcess в составе ntdll.dll), а еще лучше - перечислить процессы не средствами tlhelp32, а вызовом NtQuerySystemInformation с кодом класса инф-ции 5 (ф-ция возвращает блок структур TSystemProcessInformation, каждая структура содержит инф-цию о процессе, включая время создания)
пример :
type
TUnicodeString = packed record
Length, MaximumLength: Word;
Buffer: PWideChar;
end;
PSystemProcessInformation = ^TSystemProcessInformation;
TSystemProcessInformation = packed record
dNext: DWord; //смещение начала следующей инф.структуре в блоке, последняя структура содержит в этом поле 0
dThreadCount: DWord; //число активных трэдов процесса
dReserved01, dReserved02, dReserved03, dReserved04, dReserved05, dReserved06: DWord;
qCreateTime, qUserTime, qKernelTime: Int64;
usName: TUnicodeString; //полное имя процесса (включая путь к исп.файлу)
BasePriority: DWord; //приоритет
dUniqueProcessId: DWord; // ID процесса
dInheritedFromUniqueProcessId: DWord; //ID создателя
dHandleCount: DWord; //число открытых описателей
dReserved07: DWord;
dReserved08: DWord;
VmCounters: array[0..10] of DWord; //инф-ция о вирт.памяти
dCommitCharge: DWord;
end;
function NtQuerySystemInformation(sic: DWord; Buffer: Pointer; BufSize: DWord; var BytesReturned: DWord): DWord; stdcall; external 'ntdll.dll';
function GetProcessCreationTime(ProcessId: DWord): Int64;
var
p, Buf: PSystemProcessInformation;
BufSize: DWord;
TableSize: DWord;
begin
Result := 0;
BufSize := $10000;
GetMem(Buf, BufSize);
while NtQuerySystemInformation(5, Buf, BufSize, TableSize) <> 0 do
begin
Inc(BufSize, $10000);
ReallocMem(Buf, BufSize);
end;
p := Buf;
while True do
begin
if Buf.dUniqueProcessId = ProcessId then
begin
Result := Buf.qCreateTime;
break;
end;
if Buf.dNext = 0 then Break;
Inc(Integer(Buf), Buf.dNext);
end;
FreeMem(p);
end;
Leaner (2004-09-30 18:11:00) [14]>Digitman
А Вы не подскажите, как определить время старта просесса
Digitman (2004-09-30 17:15:00) [15]
> Learner
можно попробовать сделать так
определяем время старта Process2 и Process3
если Время2 < Process3, то это означает, что Process3 никак не может быть родителем Process2 - узел дерева добавляется в корень, а ссылка на "мертвого родителя" соответственно обнуляется
Learner (2004-09-30 15:47:00) [16]Ошибся
не пока существуют Process1 и Process2,
а пока существуют Process2 и Process3
Leaner (2004-09-30 15:45:00) [17]То, что это возникает - проверено на практике.
>идентификаторы процессов уникальны,
с этим никто не спорит, но
в ParentIDвторого указан ID третьего и он не меняется
при новом Snapshot
Эта ситуация сохраняется до тех пор, пока
существуют Process1 и Process2
Leaner (2004-09-30 15:44:00) [18]То, что это возникает - проверено на практике.
>идентификаторы процессов уникальны,
с этим никто не спорит, но
в ParentIDвторого указан ID третьего и он не меняется
при новом Snapshot
Эта ситуация сохраняется до тех пор, пока
существуют Process1 и Process2
Digitman (2004-09-30 15:37:00) [19]что-то ты не то говоришь
CreateToolHelp32Snapshot делает мгновенный "снимок" списка работающих в этот момент процессов
идентификаторы процессов уникальны, поэтому изобразить дерево на основе ДАННОГО снимка не представляет никакого труда
после отображения дерева через время N ты вновь делаешь "снимок", который точно так же корректен как и первый снимок, но отражает уже иное состояние процессов .. и неважно что некий ID, фигурировавший ранее, был вновь задействован другим теперь процессом - дерево строится точно так же, но выглядеть оно будет уже по иному