Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Handle всех процессов и их имена 
:(
    Опции темы
Elfix
Дата 24.9.2005, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 167
Регистрация: 13.7.2005

Репутация: нет
Всего: нет



Привет. Хочу чтобы в список попадали Handle и имя файла процесса. Возникли трудности.
Код
procedure TForm1.Button1Click(Sender: TObject);
var
 hSnapshoot, hProcess: THandle;
 pe32: TProcessEntry32;
begin
 ListBox1.Clear;
 hSnapshoot:=CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0);
 if hSnapshoot = INVALID_HANDLE_VALUE then
  Exit;
 pe32.dwSize:=SizeOf(pe32);
 if Process32First(hSnapshoot, pe32) then
  repeat
   hProcess:=OpenProcess(PROCESS_QUERY_INFORMATION, False, pe32.th32ProcessID);
   ListBox1.Items.Add(IntToStr(hProcess)+' '+pe32.szExeFile);
   CloseHandle(hProcess);
  until not Process32Next(hSnapshoot, pe32);
 CloseHandle(hSnapshoot);
end;

Имя файла корректно для всех процессов, но Handle, возвращенный OpenProcess всегда равен либо 0, либо 1976. Не знаю в чем загвоздка.
PM MAIL   Вверх
rsm
Дата 25.9.2005, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 999
Регистрация: 16.3.2005

Репутация: 1
Всего: 62



Главное для процесса - PID, уникальный идентификатор. А хендл для одной и той же проги вполне возможно будет одинаковый. Написал на скорую руку аналогичную программу - тоже пару нулей для системных процессов показывает.


Присоединённый файл ( Кол-во скачиваний: 24 )
Присоединённый файл  proclist.zip 3,78 Kb
PM MAIL   Вверх
Elfix
Дата 25.9.2005, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 167
Регистрация: 13.7.2005

Репутация: нет
Всего: нет



Сишный код, я увы не понимаю. Может есть код на Delphi?
А в чем ошибка у меня? Догадываюсь, что нужно привилегии повышать, я пробовал вставить код для повышения, в результате получил практически тоже самое - почти все нули и одинаковые дескрипторы.
Код
function EnableDebugPrivilege():Boolean;
var
 hToken: dword;
 SeDebugNameValue: Int64;
 tkp: TOKEN_PRIVILEGES;
 ReturnLength: dword;
begin
 Result:=false;
 OpenProcessToken(INVALID_HANDLE_VALUE, TOKEN_ADJUST_PRIVILEGES
                  or TOKEN_QUERY, hToken);
 if not LookupPrivilegeValue(nil, 'SeDebugPrivilege', SeDebugNameValue) then
  begin
   CloseHandle(hToken);
   exit;
  end;
 tkp.PrivilegeCount := 1;
 tkp.Privileges[0].Luid := SeDebugNameValue;
 tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
 AdjustTokenPrivileges(hToken, false, tkp, SizeOf(TOKEN_PRIVILEGES), tkp, ReturnLength);
 if GetLastError() <> ERROR_SUCCESS then
  Exit;
 Result:=True;
end;

PM MAIL   Вверх
rsm
Дата 25.9.2005, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 999
Регистрация: 16.3.2005

Репутация: 1
Всего: 62



Цитата(Elfix @ 25.9.2005, 21:39)
Может есть код на Delphi?

К сожалению нету, Delphi не установлен. Да и писать заново не имеет смысла - мой код полностью аналогичен твоему и служит единственной цели - показать, что все написано правильно и это реакция самой системы.

Цитата(Elfix @ 25.9.2005, 21:39)
Догадываюсь, что нужно привилегии повышать

Попробуй прибить юзерский процесс, установив в OpenProcess флаг PROCESS_TERMINATE - он прекрасно прибивается => хэндл вполне даже рабочий. А нулевые хэндлы имеют лишь криически важные системные процессы чтобы их нельзя было случайно прибить.

Это сообщение отредактировал(а) rsm - 25.9.2005, 21:01
PM MAIL   Вверх
p0s0l
Дата 25.9.2005, 21:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 14
Всего: 112



Цитата(Elfix @ 24.9.2005, 19:40)
Имя файла корректно для всех процессов, но Handle, возвращенный OpenProcess всегда равен либо 0, либо 1976. Не знаю в чем загвоздка.
Всё правильно происходит. Если бы ты не закрывал каждый раз открытый хэндл (не делал CloseHandle), то у тебя были бы разные хэндлы.
А так система назначает при открытии процесса первый свободный хэндл. При этом ты тут же хэндл закрываешь и этот номер (в твоём случае 1976) освобождается. Следующий вызов OpenProcess опять возвратит 1976, т.к. этот номер свободен...
Нули возвращаются из-за того, что нет прав на открытие процесса. Для системных процессов это решается привилегией отладки, странно что она у тебя не помогает...

И вопрос: зачем выводить хэндлы ? Хэндлов для одного и того же процесса можно наоткрывать целую кучу, и каждый будет иметь свой уникальный номер... Поэтому не вижу смысла в выводе хэндла... Обычно выводят PID...



--------------------
С уважением, г-н Посол.
PM   Вверх
Elfix
Дата 26.9.2005, 03:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 167
Регистрация: 13.7.2005

Репутация: нет
Всего: нет



Переписал свой код:
Код
{...}
uses TlHelp32
{...}
function EnableDebugPrivilege(): Boolean;
var
 hToken: dword;
 SeDebugNameValue: Int64;
 tkp: TOKEN_PRIVILEGES;
 ReturnLength: dword;
begin
 Result:=False;
 OpenProcessToken(INVALID_HANDLE_VALUE, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken);
 if not LookupPrivilegeValue(nil, 'SeDebugPrivilege', SeDebugNameValue) then
  begin
   CloseHandle(hToken);
   Exit;
  end;
 tkp.PrivilegeCount:=1;
 tkp.Privileges[0].Luid:=SeDebugNameValue;
 tkp.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED;
 AdjustTokenPrivileges(hToken, False, tkp, SizeOf(TOKEN_PRIVILEGES), tkp, ReturnLength);
 if GetLastError() <> ERROR_SUCCESS then
  Exit;
 Result:=True;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 hSnapshoot: THandle;
 pe32: TProcessEntry32;
begin
 ListBox1.Clear;
 EnableDebugPrivilege();
 hSnapshoot:=CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0);
 if hSnapshoot = INVALID_HANDLE_VALUE then
  Exit;
 pe32.dwSize:=SizeOf(pe32);
 if Process32First(hSnapshoot, pe32) then
  repeat
   ListBox1.Items.Add(IntToStr(OpenProcess(PROCESS_QUERY_INFORMATION, False, pe32.th32ProcessID))+' '+pe32.szExeFile);
  until not Process32Next(hSnapshoot, pe32);
 CloseHandle(hSnapshoot);
end;
Теперь дескрипторы возвращаются разные.
Цитата(p0s0l @ 25.9.2005, 21:32)
Нули возвращаются из-за того, что нет прав на открытие процесса. Для системных процессов это решается привилегией отладки, странно что она у тебя не помогает...
С нулями все таже проблема. В общем то, мне важно получить дескриптор svchost и еще некоторых других системных процессов.
Я знаю, что выводить handle бессмысленно, просто в дальнейшем я хочу работать с этими хэндлами, убивать их и т. д. А вывожу я их пока только для того, чтобы проверить действительно ли у меня все работает. Как оказалось нет. В общем мне надо в некоторых системных процессах также получить дескриптор, в частности svchost.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0454 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.