Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.10.17;
Скачать: CL | DM;

Вниз

Проблема с ExitProcess( )   Найти похожие ветки 

 
Alexis ©   (2004-09-15 18:55) [0]

Написал прогу для закрытия определенного процесса по имени(в примере это 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-15 18:59) [1]

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


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.


 
noname ©   (2004-09-15 19:01) [2]

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


 
Alexis ©   (2004-09-15 19:19) [3]

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


 
VMcL ©   (2004-09-15 19:24) [4]

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

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

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


 
DeadMeat ©   (2004-09-15 19:25) [5]

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

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


 
DeadMeat ©   (2004-09-15 19:27) [6]

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

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


 
DeadMeat ©   (2004-09-15 19:28) [7]

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

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


 
Alexis ©   (2004-09-15 19:42) [8]

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 21:32) [9]

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

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


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

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


 
VMcL ©   (2004-09-16 13:59) [11]

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

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

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


 
Alexis ©   (2004-09-16 19:05) [12]

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?



Страницы: 1 вся ветка

Текущий архив: 2004.10.17;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.022 c
3-1095286910
Vasis
2004-09-16 02:21
2004.10.17
Вложенный запрос


1-1096378968
Lord_Prizrak
2004-09-28 17:42
2004.10.17
Плагины.


6-1092108374
Ден
2004-08-10 07:26
2004.10.17
поиск по сети


1-1096363145
msguns
2004-09-28 13:19
2004.10.17
Сообщение от одной форме другой


1-1096898854
redlord
2004-10-04 18:07
2004.10.17
запись в начало файла