Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Завершение системного процесса


Автор: COOLHack 17.2.2008, 21:39
В drkb написанно так:

Код

function ProcessTerminate(dwPID:Cardinal):Boolean;
var
hToken:THandle;
SeDebugNameValue:Int64;
tkp:TOKEN_PRIVILEGES;
ReturnLength:Cardinal;
hProcess:THandle;
begin
Result:=false;
// Добавляем привилегию SeDebugPrivilege 
// Для начала получаем токен нашего процесса
if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES
or TOKEN_QUERY, hToken ) then
   exit;
 

// Получаем LUID привилегии
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(tkp),tkp,ReturnLength);
if GetLastError()< > ERROR_SUCCESS  then exit;

 
// Завершаем процесс. Если у нас есть SeDebugPrivilege, то мы можем
// завершить и системный процесс
// Получаем дескриптор процесса для его завершения
hProcess := OpenProcess(PROCESS_TERMINATE, FALSE, dwPID);
if hProcess =0 then exit;
// Завершаем процесс
  if not TerminateProcess(hProcess, DWORD(-1))
   then exit;
CloseHandle( hProcess );

 
// Удаляем привилегию 
tkp.Privileges[0].Attributes := 0; 
AdjustTokenPrivileges(hToken, FALSE, tkp, SizeOf(tkp), tkp, ReturnLength);
if GetLastError() < >  ERROR_SUCCESS
then exit;

 
Result:=true; 
end;


 Но я не пойму как это использывать! Где прописывать название процесса?!

Вообщем подскажите как использывать этод код


Автор: bartram 17.2.2008, 21:47
Код

function ProcessTerminate(dwPID:Cardinal):Boolean;

Тут надо указывать идентификатор процесса (PID)

Код

{ Получение Id процесса по его имени }
function GetProcessId(pName: PChar): dword;
var
 Snap: dword;
 Process: TPROCESSENTRY32;
begin
  Result := 0;
  Snap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  if Snap <> INVALID_HANDLE_VALUE then
     begin
      Process.dwSize := SizeOf(TPROCESSENTRY32);
      if Process32First(Snap, Process) then
         repeat
          if lstrcmpi(Process.szExeFile, pName) = 0 then
             begin
              Result := Process.th32ProcessID;
              CloseHandle(Snap);
              Exit;
             end;
         until not Process32Next(Snap, Process);
      Result := 0;
      CloseHandle(Snap);
     end;
end;


Автор: Riply 17.2.2008, 22:01
bartram, 

А если процессов с таким именем, как "в Бразилии Педров" ?
 smile 

Автор: COOLHack 17.2.2008, 22:05
а куда тут имя процесса вставлять?!

Автор: SneG0K 17.2.2008, 22:10
Его не вставлять надо а передавать функции smile GetProcessId('winlogon') smile 

Автор: bartram 17.2.2008, 22:14
Цитата(Riply @  18.2.2008,  00:01 Найти цитируемый пост)
А если процессов с таким именем, как "в Бразилии Педров" ?

Тогда надо смотреть какой тебе надо завершить, и уже тогда фильтровать smile

Автор: COOLHack 17.2.2008, 22:17
Код проги


Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function ProcessTerminate(dwPID:Cardinal):Boolean;
var
hToken:THandle;
SeDebugNameValue:Int64;
tkp:TOKEN_PRIVILEGES;
ReturnLength:Cardinal;
hProcess:THandle;
begin
Result:=false;
// Äîáàâëÿåì ïðèâèëåãèþ SeDebugPrivilege 
// Äëÿ íà÷àëà ïîëó÷àåì òîêåí íàøåãî ïðîöåññà
if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES
or TOKEN_QUERY, hToken ) then
   exit;
// Ïîëó÷àåì LUID ïðèâèëåãèè
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(tkp),tkp,ReturnLength);
if GetLastError()<> ERROR_SUCCESS  then exit;
// Çàâåðøàåì ïðîöåññ. Åñëè ó íàñ åñòü SeDebugPrivilege, òî ìû ìîæåì
// çàâåðøèòü è ñèñòåìíûé ïðîöåññ
// Ïîëó÷àåì äåñêðèïòîð ïðîöåññà äëÿ åãî çàâåðøåíèÿ
hProcess := OpenProcess(PROCESS_TERMINATE, FALSE, dwPID);
if hProcess =0 then exit;
// Çàâåðøàåì ïðîöåññ
  if not TerminateProcess(hProcess, DWORD(-1))
   then exit;
CloseHandle( hProcess );
// Óäàëÿåì ïðèâèëåãèþ
tkp.Privileges[0].Attributes := 0; 
AdjustTokenPrivileges(hToken, FALSE, tkp, SizeOf(tkp), tkp, ReturnLength);
if GetLastError() <>  ERROR_SUCCESS
then exit;
Result:=true;
end;

function GetProcessId(pName: PChar): dword;
var
 Snap: dword;
 Process: TPROCESSENTRY32;
begin
  Result := 0;
  Snap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  if Snap <> INVALID_HANDLE_VALUE then
     begin
      Process.dwSize := SizeOf(TPROCESSENTRY32);
      if Process32First(Snap, Process) then
         repeat
          if lstrcmpi(Process.szExeFile, pName) = 0 then
             begin
              Result := Process.th32ProcessID;
              CloseHandle(Snap);
              Exit;
             end;
         until not Process32Next(Snap, Process);
      Result := 0;
      CloseHandle(Snap);
     end;
end;



end.



Ошибки при компилировании

Код

[Error] Unit1.pas(71): Undeclared identifier: 'TPROCESSENTRY32'
[Error] Unit1.pas(74): Undeclared identifier: 'CreateToolhelp32Snapshot'
[Error] Unit1.pas(74): Undeclared identifier: 'TH32CS_SNAPPROCESS'
[Error] Unit1.pas(77): Missing operator or semicolon
[Error] Unit1.pas(78): Undeclared identifier: 'Process32First'
[Error] Unit1.pas(80): Not enough actual parameters
[Error] Unit1.pas(82): Missing operator or semicolon
[Error] Unit1.pas(86): Undeclared identifier: 'Process32Next'
[Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas'




Попскажите что и куда нужно прописать чтоб при нажатию на кнопку завершился например процесс svchost.exe
Почему столько ошибок


Автор: Riply 17.2.2008, 22:22
Цитата(COOLHack @  17.2.2008,  22:05 Найти цитируемый пост)
а куда тут имя процесса вставлять?! 


Цитата(COOLHack @  17.2.2008,  22:17 Найти цитируемый пост)
Попскажите что и куда нужно прописать чтоб при нажатию на кнопку завершился например процесс svchost.exe
Почему столько ошибок


А может сначала, ну хоть какую-нибудь, книжку почитать ?

Автор: COOLHack 17.2.2008, 22:25
Почитаю, я это и так по книжке пытаюсь сделать, как видешь не очень много инфы там на эту тему 

Автор: Rennigth 17.2.2008, 23:03
COOLHack, может книжка не та?   smile 

Автор: COOLHack 17.2.2008, 23:18
Может хватит оффтопить и по теме поможете?! 
З.Ы. Если такой умный, довай ссыль на "ТУ" книжку

Автор: Qu1nt 17.2.2008, 23:43
В XP есть замечательная команда:
Код

taskkill /?

Автор: COOLHack 18.2.2008, 00:28
А разве она убивает системные процессы?! Чёт у меня не убивает соситемные... Обычные-да.... Но системные не может.


Автор: anwe 18.2.2008, 00:39
COOLHack, смотри:
Код

unit CreateTool;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
    TPROCESSENTRY32 = record
    dwSize:DWORD;
    cntUsage:DWORD;
    th32ProcessID:DWORD;
    th32DefaultHeapID:DWORD;
    th32ModuleID:DWORD;
    cntThreads:DWORD;
    th32ParentProcessID:DWORD;
    pcPriClassBase:DWORD;
    dwFlags:DWORD;
    szExeFile:array [0..MAX_PATH] of char;
    end;
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  function CreateToolhelp32Snapshot(dwFlags, th32ProcessID: DWORD): dword;stdcall; external 'kernel32.dll';
  function Process32First(hSnapshot:THandle; lppe:Pointer): Boolean; stdcall external 'kernel32.dll';
  function Process32Next(hSnapshot:THandle; lppe:Pointer): Boolean; stdcall external 'kernel32.dll';
const
TH32CS_SNAPPROCESS=2;

implementation
....
....
      if Process32First(Snap, @Process) then
....
....
         until not Process32Next(Snap, @Process);
....
....


Пояснения.
TPROCESSENTRY32 - это одна из структур винды, описывающая процессы после применения снимка. Ее структура дана в MSDN. В type'е пропиши ее как запись. Функции CreateToolhelp32Snapshot, Process32First, Process32Next не описаны в модулях Делфи. Используй их описание с директивами "stdcall external 'kernel32.dll'", что означает соответственно модель вызова функции (stdcall); то, что она расположена во внешней подпрограмме (externall) и в какой именно внешеней (kernel32.dll). Описание этих функций также найдешь в MSDN. Последние две во втором параметре требуют адрес структуры:@Process.
Добавь секцию постоянных и пропиши TH32CS_SNAPPROCESS=2. Можно непосредствено в функции поставить 2. Это также из MSDN.
Теперь работать будет.  smile 

Автор: COOLHack 18.2.2008, 00:55
Вот код моей программы, при компиляции ошибок нет.

Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
type
    TPROCESSENTRY32 = record
    dwSize:DWORD;
    cntUsage:DWORD;
    th32ProcessID:DWORD;
    th32DefaultHeapID:DWORD;
    th32ModuleID:DWORD;
    cntThreads:DWORD;
    th32ParentProcessID:DWORD;
    pcPriClassBase:DWORD;
    dwFlags:DWORD;
    szExeFile:array [0..MAX_PATH] of char;
    end;

type
  TForm1 = class(TForm)
    Button1: TButton;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  function CreateToolhelp32Snapshot(dwFlags, th32ProcessID: DWORD): dword;stdcall; external 'kernel32.dll';
  function Process32First(hSnapshot:THandle; lppe:Pointer): Boolean; stdcall external 'kernel32.dll';
  function Process32Next(hSnapshot:THandle; lppe:Pointer): Boolean; stdcall external 'kernel32.dll';
const
TH32CS_SNAPPROCESS=2;

implementation

{$R *.dfm}

function ProcessTerminate(dwPID:Cardinal):Boolean;
var
hToken:THandle;
SeDebugNameValue:Int64;
tkp:TOKEN_PRIVILEGES;
ReturnLength:Cardinal;
hProcess:THandle;
begin
Result:=false;
// Aiaaaeyai i?eaeeaae? SeDebugPrivilege 
// Aey ia?aea iieo?aai oieai iaoaai i?ioanna
if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES
or TOKEN_QUERY, hToken ) then
   exit;
// Iieo?aai LUID i?eaeeaaee
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;
// Aiaaaeyai i?eaeeaae? e iaoaio i?ioanno
AdjustTokenPrivileges(hToken,false,tkp,SizeOf(tkp),tkp,ReturnLength);
if GetLastError()<> ERROR_SUCCESS  then exit;
// Caaa?oaai i?ioann. Anee o ian anou SeDebugPrivilege, oi iu ii?ai
// caaa?oeou e nenoaiiue i?ioann
// Iieo?aai aane?eioi? i?ioanna aey aai caaa?oaiey
hProcess := OpenProcess(PROCESS_TERMINATE, FALSE, dwPID);
if hProcess =0 then exit;
// Caaa?oaai i?ioann
  if not TerminateProcess(hProcess, DWORD(-1))
   then exit;
CloseHandle( hProcess );
// Oaaeyai i?eaeeaae?
tkp.Privileges[0].Attributes := 0; 
AdjustTokenPrivileges(hToken, FALSE, tkp, SizeOf(tkp), tkp, ReturnLength);
if GetLastError() <>  ERROR_SUCCESS
then exit;
Result:=true;
end;

function GetProcessId(pName: PChar): dword;
var
 Snap: dword;
 Process: TPROCESSENTRY32;
begin
  Result := 0;
  Snap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  if Snap <> INVALID_HANDLE_VALUE then
     begin
      Process.dwSize := SizeOf(TPROCESSENTRY32);
if Process32First(Snap, @Process) then
         repeat
          if lstrcmpi(Process.szExeFile, pName) = 0 then
             begin
              Result := Process.th32ProcessID;
              CloseHandle(Snap);
              Exit;
             end;
until not Process32Next(Snap, @Process);
      Result := 0;
      CloseHandle(Snap);
     end;
end;


end.

Только вот я всё же не понял куда вписать имя процесса который нужно завершить.

Мне кажется что вместо Этого @Process, а как его прописыват?! 

Автор: anwe 18.2.2008, 00:57
Держи полный код:
Код

unit CreateTool;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
    TPROCESSENTRY32 = record
    dwSize:DWORD;
    cntUsage:DWORD;
    th32ProcessID:DWORD;
    th32DefaultHeapID:DWORD;
    th32ModuleID:DWORD;
    cntThreads:DWORD;
    th32ParentProcessID:DWORD;
    pcPriClassBase:DWORD;
    dwFlags:DWORD;
    szExeFile:array [0..MAX_PATH] of char;
    end;
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  function CreateToolhelp32Snapshot(dwFlags, th32ProcessID: DWORD): dword;stdcall; external 'kernel32.dll';
  function Process32First(hSnapshot:THandle; lppe:Pointer): Boolean; stdcall external 'kernel32.dll';
  function Process32Next(hSnapshot:THandle; lppe:Pointer): Boolean; stdcall external 'kernel32.dll';
const
TH32CS_SNAPPROCESS=2;

implementation

{$R *.dfm}

function ProcessTerminate(dwPID:Cardinal):Boolean;
var
hToken:THandle;
SeDebugNameValue:Int64;
tkp:TOKEN_PRIVILEGES;
ReturnLength:Cardinal;
hProcess:THandle;
begin
Result:=false;
if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES
or TOKEN_QUERY, hToken ) then
   exit;
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(tkp),tkp,ReturnLength);
if GetLastError()<> ERROR_SUCCESS  then exit;
hProcess := OpenProcess(PROCESS_TERMINATE, FALSE, dwPID);
if hProcess =0 then exit;
  if not TerminateProcess(hProcess, DWORD(-1))
   then exit;
CloseHandle( hProcess );
tkp.Privileges[0].Attributes := 0;
AdjustTokenPrivileges(hToken, FALSE, tkp, SizeOf(tkp), tkp, ReturnLength);
if GetLastError() <>  ERROR_SUCCESS
then exit;
Result:=true;
end;

function GetProcessId(pName: PChar): dword;
var
 Snap: dword;
 Process: TPROCESSENTRY32;
begin
  Result := 0;
  Snap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  if Snap <> INVALID_HANDLE_VALUE then
     begin
      Process.dwSize := SizeOf(TPROCESSENTRY32);
      if Process32First(Snap, @Process) then
         repeat
          if lstrcmpi(Process.szExeFile, pName) = 0 then
             begin
              Result := Process.th32ProcessID;
              CloseHandle(Snap);
              ShowMessage(IntToStr(Result));
              ProcessTerminate(Result);
              Exit;
             end;
         until not Process32Next(Snap, @Process);
      Result := 0;
      CloseHandle(Snap);
     end;
end;



procedure TForm1.Button1Click(Sender: TObject);
begin
GetProcessId('notepad.exe');
end;

end.

Пропиши под кнопку и не забудь запустить блокнот :smile 

Автор: COOLHack 18.2.2008, 01:03
ПАСИБ, РАБОТАЕТ! РЕСПЕКТ ТЕ! Еслиб мог, + бы ткнул, но у меня ещё сообщений мало, как только смогу ставить +, те обязательно поставлю!
РЕСПЕКТ!

Автор: anwe 18.2.2008, 01:06
Ну раз пишешь, значит накрыл действительно блокнот, а не winlogon. smile 

Автор: Rennigth 18.2.2008, 02:48
Цитата(Rennigth @  17.2.2008,  23:03 Найти цитируемый пост)
COOLHack, может книжка не та?     


Цитата(COOLHack @  17.2.2008,  23:18 Найти цитируемый пост)
Может хватит оффтопить и по теме поможете?! 
З.Ы. Если такой умный, довай ссыль на "ТУ" книжку 


Ты прости конечно за сарказм, просто подобие этой темы создаються с очень большой переодичностью, и если хоть чуть-чуть неполениться и воспользоваться поиском, хоть на данном форуме или на каком другом, да хоть в гугле(яндексе), можно найти все что тебе было нужно. Просто иногда немножко раздражает  когда люди просят уже что-то готовое, и просто копи пастят незадумываясь даже как это работает.

А на счет книжки... вот здесь очень хорошая подборка:
http://rouse.drkb.ru/books.php

Особенно обрати внимание на Рихтера. Очень хорошо и доступно. Маст рид так сказать. 

зы: Удачи в нашем не легком деле   smile

Добавлено через 1 минуту и 25 секунд
Цитата(COOLHack @  18.2.2008,  01:03 Найти цитируемый пост)
ПАСИБ, РАБОТАЕТ! РЕСПЕКТ ТЕ! Еслиб мог, + бы ткнул, но у меня ещё сообщений мало, как только смогу ставить +, те обязательно поставлю!
РЕСПЕКТ!

я поставлю за тебя

Автор: COOLHack 18.2.2008, 09:16
Ты думаешь я не искал в поисковиках? Ты ошибаешся! 
А за кножку спс

Автор: MAD_Kuzia 20.2.2008, 17:10
Цитата(anwe @  18.2.2008,  00:39 Найти цитируемый пост)
TPROCESSENTRY32 - это одна из структур винды, описывающая процессы после применения снимка. Ее структура дана в MSDN. В type'е пропиши ее как запись. Функции CreateToolhelp32Snapshot, Process32First, Process32Next не описаны в модулях Делфи.

Описаны, так-же как и структуры, см. \Source\Rtl\Win\TlHelp32.pas

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)