Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Закрытие процесса [D7, WinXP]


Страницы:   1 2 3 4 5

Alex870 ©   (2005-06-21 13:46:00) 

Подскажите пожалуйста, можно ли перехватить закрытие процесса моего приложения, выполнить какие-либо действия, а потом завершить процесс. Приложение у меня без формы:
program MyProg;
uses
Windows, messages;

var
M : tagMSG;

begin
while GetMessage( M, HInstance, 0, 0) do
   begin
    TranslateMessage(M);
    DispatchMessage(M);
   end;
end.

Если нет, подскажите, может создание формы поможет? Спасибо


alpet   (2005-06-22 15:40:00) [41]

Игорь Шевченко ©   (22.06.05 15:20) [49]

Почему повторный запуск? Если у процессов общая секция данных с структурой в которой сформированны некоторые данные, то непредвиденное завершение одно процесса, приведет к тому что второй записав в лог данные также завершится самостоятельно. Другое дело, что это решение не самое лучшее для таких случаев по сравнению с службами.


Alex870   (2005-06-22 15:32:00) [42]


> [35] тебе не поможет, в твоем случае, так как все, что гарантирует
> этот способ - это повторный запуск, а вовсе не перехват
> завершения и выполнение некоторых действий перед завершением

Я же писал, что мне нужно оставить запись в логе при закрытии процесса (время, кем, инфа о трафике). Как ведет логи Kerio Winroute я не знаю, но там это реализовано (хотя winroute это служба).


Игорь Шевченко   (2005-06-22 15:20:00) [43]


> Наверно [35] это единственный правильный подход к решению
> проблемы


[35] тебе не поможет, в твоем случае, так как все, что гарантирует этот способ - это повторный запуск, а вовсе не перехват завершения и выполнение некоторых действий перед завершением.


Alex870   (2005-06-22 15:14:00) [44]

Спасибо всем!
Наверно [35] это единственный правильный подход к решению проблемы. Я думаю что на этом обсуждение можно закрыть, а то это скоро перейдет в категорию "потрепаться". Еще раз всем спасибо!


BiN   (2005-06-22 14:07:00) [45]

Alex870   (21.06.05 13:46)

Единственно верный ответ тебе уже дали в [33]. Остальное - от лукавого.


kaZaNoVa   (2005-06-22 14:01:00) [46]

Игорь Шевченко ©   (22.06.05 10:50) [39]

> Например, Process Explorer, показывающий много всего
> увлекательного без драйверов.

я когда-то запускал Process Explorer без прав админа, он намного меньше информации показывал:(
(например вкладка Perfomance процесса - вообще нет инфы), имхо вывод - Process Explorer может нормально работать и выдавать всю информацию только с правами админа..


alpet   (2005-06-22 13:57:00) [47]

А чем вариант в [35] не устраивает? Или мульти-процессный подход сложным кажется? Помоему там единственная сложность - правильная отработка после завершения убитого процесса, которую к тому-же можно упростить, расшарив между процессами регион памяти. Во всяком случае второй процесс в этом случае сможет скинуть в файл данные которые не успел обработать второй процесс и записать в лог о не нормальном завершении.


Игорь Шевченко   (2005-06-22 13:50:00) [48]

MS-MEN ©   (22.06.05 11:32) [42]


> Я ещё раз говорю применение драйверов это означает что
> Что над программой работали профессионалы.


Пальцы не гни, ладно ?
А то пишешь слова с ошибками, а пальцы гнешь.

KosilkA ©   (22.06.05 11:10) [40]

А ты не от администратора запусти. Удивись.


MS-MEN   (2005-06-22 11:39:00) [49]

> Alex870
> Дело в том, что я бы все-таки хотел отлавливать завершение
> процесса и позволять его завершать, т.е. не делать явную защиту,
> а просто контролировать закрытие программы для ведения лога.

Извини, наверное, не так понял :(  Я думал ты собираешься
защитить от завершение.

Тогда можно просто создать маленьки на ASM или API
монитор вот и все.

:) Мозги Игорь Шевченко заморочил тоже мой извинение.


MS-MEN   (2005-06-22 11:32:00) [50]

> Игорь Шевченко

Это можно и без системных вызовов решить просто надо знать ф-ций.

Например NativeAPI в них 80%  ф-ций которые можно использовать
как в третям кольце, так и в нулевом это  лишь для WinNT платформ.

А что ты хочешь предложить вместо перехвата? Как ты собираешься
узнать, что процесс завершается методом Terminate Process? А если
на уровне нулевого кольца грохну? То даже перехват Win / Native –API
не помогут.

В - общем, другим способом решить это не возможно.

Я ещё раз говорю применение драйверов это означает что
Что над программой работали профессионалы. (Если это
касается системы) А применение WinAPI или коротко API
это только для третьего кольца.

> kaZaNoVa ©   (22.06.05 01:22) [28]
> DEBUG не помогла:(

Во-общем последние, что я могу предложить это включить
системною привилигию DEBUFG вот  маленький код
который завершает любой процесс с помощью сис. Debug.

{ убивание процесса отладочным методом }
Function DebugKillProcess(ProcessId: dword): boolean;
var
pHandle: dword;
myPID: dword;
HandlesInfo: PSYSTEM_HANDLE_INFORMATION_EX;
r: dword;
begin
Result := false;
myPID := GetCurrentProcessId();
if not EnableDebugPrivilege() then Exit;
//подключаемся к системе отладки и получаем DebugObject
if DbgUiConnectToDbg() <> STATUS_SUCCESS then Exit;
pHandle := OpenProcessEx(ProcessId);
//включаем отладку процесса
if DbgUiDebugActiveProcess(pHandle) <> STATUS_SUCCESS then Exit;
//надо найти полученный DebugObject
HandlesInfo := GetInfoTable(SystemHandleInformation);
if HandlesInfo = nil then Exit;
for r := 0 to HandlesInfo^.NumberOfHandles do
 if (HandlesInfo^.Information[r].ProcessId = myPID) and
    (HandlesInfo^.Information[r].ObjectTypeNumber = $8)  //DebugObject
    then begin
      //закрываем DebugObject, что приводит к уничтожению отлаживаемого процесса
      CloseHandle(HandlesInfo^.Information[r].Handle);
      Result := true;
      break;
    end;
VirtualFree(HandlesInfo, 0, MEM_RELEASE);
end;


Alex870   (2005-06-22 11:29:00) [51]


> Перехватывай ф-ций ядра, таким образом, не кто (ламер) не
> сможет
> снять процесс, а также если есть опыт по защите то и профилю
>
> будет лень :)

Дело в том, что я бы все-таки хотел отлавливать завершение процесса и позволять его завершать, т.е. не делать явную защиту, а просто контролировать закрытие программы для ведения лога.


KosilkA   (2005-06-22 11:10:00) [52]


> Например, Process Explorer, показывающий много всего увлекательного
> без драйверов.

Это от SysInternals который? Если зайти в диспетчер устройств>Вид>Показывать скрытые устройства то можно увидеть "PROCEXP", интересно что это? И с regmon'ом такая-же история=)


Игорь Шевченко   (2005-06-22 10:50:00) [53]

MS-MEN ©   (22.06.05 10:30) [36]


> Например, что именно?


Например, Process Explorer, показывающий много всего увлекательного без драйверов.

Еще раз - для решения большинства нужных задач ни драйверы, не перехват описанный тобой, нафиг не сдались. Все эти горе-драйверописатели неснимаемых/невидимых процессов занимаются либо полной ерундой для гнутия пальцев, либо откровенным вредительством.
Ни то, ни другое на этом форуме не приветствуется, равно как и рекомендации вырезать гланды через неподходящее для этого процесса отверстие.


MS-MEN   (2005-06-22 10:42:00) [54]

Alex870
Лучший способ это перехватить ф-ций иначе ты даже не сможешь
узнать, что за узер хотел завершить твой процесс.

Перехватывай ф-ций ядра, таким образом, не кто (ламер) не сможет
снять процесс, а также если есть опыт по защите то и профилю
будет лень :)

Это лучший совет (Другого не найдешь)


Alex870   (2005-06-22 10:35:00) [55]


> тогда простой смертный юзер не сможет его остановить

А как же перезагрузка? Мне нужно чтобы данные о подсчете трафика сохранялись всегда, а при перезагрузке они обнуляются. Пример - Kerio Winroute он пишет в лог время остановки своей службы и кем она была остановлена.


alpet   (2005-06-22 10:30:00) [56]

Вообще перевод процесса в отряд системных с помощью кода ориентированного на 0-кольцо, мало чего даст - его все равно можно будет уничтожить (в самом крайнем случае через Reset). Имхо для отслеживания вызовов TerminateProcess и других способов срочной терминации процесса, лучше использовать дополнительный сторожевой процесс, который ничем другим и не будет заниматься только ждать завершение первого:

WaitForSingleObject (hFirstProcess, INFINITE);
OnFirstProcessKilled;

В свою очередь из первого надо будет проверять целостность сторожевого процесса.


MS-MEN   (2005-06-22 10:30:00) [57]

> А вот Руссинович с Когсуэллом без них обходятся как-то :)
> С чего бы ?

Например, что именно?
Хотя можно если внедрить в системный процесс свой процесс
Но опять также надо иметь привилиги Debug.

Есть много способов, но во всех способах есть минусы.


Игорь Шевченко   (2005-06-22 10:18:00) [58]

MS-MEN ©   (21.06.05 19:52) [18]

Может эта...прежде чем глючные поделки выкладывать, русский язык подучить ? Слегка так...А то читать не очень удобно.


> Ну, во-первых, все, что относится к системе, если считать
> низкокого уровня программирование то везде надо иметь
> Админовские привилигие иначе не как.


А вот Руссинович с Когсуэллом без них обходятся как-то :)
С чего бы ?


Digitman   (2005-06-22 10:12:00) [59]


> написал свою программу


сист.сервис надо было писать
и стартовать его с правами системы, а не конкр.юзера
тогда простой смертный юзер не сможет его остановить


Alex870   (2005-06-22 10:00:00) [60]


> а не проще ли написать свою собственную программу (сервис)
> для мониторинга траффика и ведения статистики ? не такое
> уж и сложное это дело

Именно об этом я и говорю, может выразился не корректно. Я написал свою программу для подсчета трафика, но мне нужно чтобы она записывала событие в файл, когда её пытаются остановить, кто это делает и в какое время, а так же лог по перезагрузкам и сменам аккаунта, т.е. когда программу останавливает система.


Страницы:   1 2 3 4 5

Наверх

Титульная страница Поиск, карта сайта Написать письмо