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

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

Проблема с ExitProcess( ) [D6, NT4, Win2k, WinXP]


Alexis ©   (2004-09-15 18:55:00) 

Написал прогу для закрытия определенного процесса по имени(в примере это rundll32.exe), но при выполнении выделенных строк кода прога не закрывает rundll32, а закрывается сама!


program dll_changer;

{$APPTYPE CONSOLE}

uses
 Windows,
 psapi;

var
pidProcess : array[0..1024] of DWORD;
cProcesses, cbNeeded, lpcbNeeded : DWORD;
phModule : HMODULE;
I : Integer;
hProcess, hExitProcess, lpExitCode : Cardinal;
lpBaseName, lpMsgBuf : LPTSTR;

begin
if EnumProcesses(@pidProcess, SizeOf(pidProcess), cbNeeded) then
 begin
  cProcesses := cbNeeded div SizeOf(DWORD);
  for I := 0 to cProcesses - 1 do
  begin
   hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,
                           False,
                           pidProcess[I]);
   if hProcess <> 0 then
   begin
    if EnumProcessModules(hProcess, @phModule, SizeOf(HMODULE), lpcbNeeded) then
    begin

      GetMem(lpBaseName, MAX_PATH);
      GetModuleBaseName(hProcess, phModule, lpBaseName, MAX_PATH);

      if CharUpper(lpBaseName) = 'RUNDLL32.EXE' then
        begin

         MessageBox(0,  'rundll32.exe detected!', 'OK', MB_OK);
         GetMem(lpMsgBuf, MAX_PATH);
         hExitProcess := OpenProcess(PROCESS_QUERY_INFORMATION,
                                     True,//False,
                                     pidProcess[I]);
         if hExitProcess = 0 then
         MessageBox(0, 'OpenProcess failed', 'OK', MB_OK);
         if GetExitCodeProcess(hExitProcess, lpExitCode) then
          MessageBox(0, 'GetExitCodeProcess ok', 'OK', MB_OK)
         else
          MessageBox(0,  'GetExitCodeProcess failed', 'OK', MB_OK);

         ExitProcess(lpExitCode);
         CloseHandle(hExitProcess);

        end;
      FreeMem(lpBaseName);

    end; //end of EnumProcessModules
   end; //end of OpenProcess

   CloseHandle(hProcess);
  end;

 end; //end of EnumProcesses
 MessageBox(0, 'end', 'OK', MB_OK);
end.

В чем может быть причина никак понять не могу!


Alexis   (2004-09-16 19:05:00) [1]

2 VMcL-хорошо, допустим. Но ф-ция TerminateProcess не выгружает DLL'ки.

Вот цитата из MSDN :

If you terminate a process by calling TerminateProcess or TerminateJobObject, the DLLs of that process do not receive DLL_PROCESS_DETACH notifications. If you terminate a thread by calling TerminateThread, the DLLs of that thread do not receive DLL_THREAD_DETACH notifications.


И как быть в случае, если мне надо выгрузить библиотеку, используемую только процессом rundll32.exe?


VMcL   (2004-09-16 13:59:00) [2]

>> Alexis ©  (16.09.04 10:25) [10]

> ExitProcess'om nelzia zavershit' storonnee prilozenije, a tol'ko svoje?

Ты читать не умеешь? Тебе об этом написали еще в посте [2].


Alexis   (2004-09-16 10:25:00) [3]

2 DeadMeat-tak po-tvojemu ExitProcess'om nelzia zavershit' storonnee prilozenije, a tol'ko svoje?


DeadMeat   (2004-09-15 21:32:00) [4]

Значит ты уверен, что ExitCode характеризует (нет, лучше идентифицирует) каждый процесс в отдельности?
Ты знаешь, что есть ExitCode?
И чем он отличается от PID или hProcess?

---
...Death Is Only The Begining...


Alexis   (2004-09-15 19:42:00) [5]

2 DeadMeat- http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/exitprocess.asp
Пожалуйста...

Вот, ф-цией GetExitCodeProcess получаю значение, которое передаю в ExitProcess, а в GetExitCodeProcess я передаю хендл процесса
hExitProcess := OpenProcess(PROCESS_QUERY_INFORMATION,False,pidProcess[I]);

где pidProcess[I] это не id моей проги, а id rundll32.exe!


DeadMeat   (2004-09-15 19:28:00) [6]

А раз в MSDN все написано правильно, то можно ссылочку на это плииз...

---
...Death Is Only The Begining...


DeadMeat   (2004-09-15 19:27:00) [7]

А если передаешь, то он видимо тебе возвращается от GetExitCodeProcess?
Так чтоли получается?

---
...Death Is Only The Begining...


DeadMeat   (2004-09-15 19:25:00) [8]

А можно вопрос?
Каким макаром ExitProcess будет завершать чужое приложение?
Ты ему передаешь PID чтоли?

---
...Death Is Only The Begining...


VMcL   (2004-09-15 19:24:00) [9]

>> Alexis ©  (15.09.04 19:19) [3]

> Кстати TerminateProcess не выгружает DLL, использовавшиеся процессом

Перечитай пост [2]. "Можно два раза" © ИШ


Alexis   (2004-09-15 19:19:00) [10]

2 noname-MSDN почитай! Кстати TerminateProcess не выгружает DLL, использовавшиеся процессом, поэтому в моем случае необходим ExitProcess.


noname   (2004-09-15 19:01:00) [11]

ExitProcess - выход из своего приложения.
Использую TerminateProcess.


Alexis   (2004-09-15 18:59:00) [12]

Пардон, забыл выделить код :) Вот...


program dll_changer;

{$APPTYPE CONSOLE}

uses
 Windows,
 psapi;

var
pidProcess : array[0..1024] of DWORD;
cProcesses, cbNeeded, lpcbNeeded : DWORD;
phModule : HMODULE;
I : Integer;
hProcess, hExitProcess, lpExitCode : Cardinal;
lpBaseName, lpMsgBuf : LPTSTR;

begin
if EnumProcesses(@pidProcess, SizeOf(pidProcess), cbNeeded) then
 begin
  cProcesses := cbNeeded div SizeOf(DWORD);
  for I := 0 to cProcesses - 1 do
  begin
   hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,
                           False,
                           pidProcess[I]);
   if hProcess <> 0 then
   begin
    if EnumProcessModules(hProcess, @phModule, SizeOf(HMODULE), lpcbNeeded) then
    begin

      GetMem(lpBaseName, MAX_PATH);
      GetModuleBaseName(hProcess, phModule, lpBaseName, MAX_PATH);

      if CharUpper(lpBaseName) = 'RUNDLL32.EXE' then
        begin

         MessageBox(0,  'rundll32.exe detected!', 'OK', MB_OK);
         GetMem(lpMsgBuf, MAX_PATH);
         hExitProcess := OpenProcess(PROCESS_QUERY_INFORMATION,
                                     False,
                                     pidProcess[I]);
         if hExitProcess = 0 then
         MessageBox(0, 'OpenProcess failed', 'OK', MB_OK);
         if GetExitCodeProcess(hExitProcess, lpExitCode) then
          MessageBox(0, 'GetExitCodeProcess ok', 'OK', MB_OK)
         else
          MessageBox(0,  'GetExitCodeProcess failed', 'OK', MB_OK);

          ExitProcess(lpExitCode);
         CloseHandle(hExitProcess);

        end;
      FreeMem(lpBaseName);

    end; //end of EnumProcessModules
   end; //end of OpenProcess

   CloseHandle(hProcess);
  end;

 end; //end of EnumProcesses
 MessageBox(0, 'end', 'OK', MB_OK);
end.


Наверх

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