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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как убить системный процесс, который виден в диспетчере задач 
:(
    Опции темы
Гость_Дмитрий
Дата 28.7.2005, 12:27 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Мне надо чтобы программным способом, сделалось тоже самое, что и просто открыть диспетчер, выбрать вкладку "процессы", потом выбрать процесс и нажать кнопку "завершить процесс".

Это сообщение отредактировал(а) Girder - 28.7.2005, 18:20
  Вверх
ScriptkidY
Дата 28.7.2005, 23:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 24.7.2005
Где: Тюмень

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



Код

uses  
  Tlhelp32, Windows, SysUtils;  

function KillTask(ExeFileName: string): integer;  
const  
  PROCESS_TERMINATE=$0001;  
var  
  ContinueLoop: BOOL;  
  FSnapshotHandle: THandle;  
  FProcessEntry32: TProcessEntry32;  
begin  
  result := 0;  

  FSnapshotHandle := CreateToolhelp32Snapshot  
                     (TH32CS_SNAPPROCESS, 0);  
  FProcessEntry32.dwSize := Sizeof(FProcessEntry32);  
  ContinueLoop := Process32First(FSnapshotHandle,  
                                 FProcessEntry32);  

  while integer(ContinueLoop) <> 0 do  
  begin  
    if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =  
         UpperCase(ExeFileName))  
     or (UpperCase(FProcessEntry32.szExeFile) =  
         UpperCase(ExeFileName))) then  
      Result := Integer(TerminateProcess(OpenProcess(  
                        PROCESS_TERMINATE, BOOL(0),  
                        FProcessEntry32.th32ProcessID), 0));  
    ContinueLoop := Process32Next(FSnapshotHandle,  
                                  FProcessEntry32);  
  end;  

  CloseHandle(FSnapshotHandle);  
end; 


Попробуй это...

Это сообщение отредактировал(а) Girder - 29.7.2005, 11:11
PM MAIL ICQ   Вверх
Гость_Дмитрий
Дата 29.7.2005, 12:24 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Вообщем я сделал так:
Код

function KillTask(ExeFileName: string): integer;
const
  PROCESS_TERMINATE=$0001;
var
  ContinueLoop: BOOL;
  FSnapshotHandle: THandle;
  FProcessEntry32: TProcessEntry32;
begin
  result := 0;
  FSnapshotHandle := CreateToolhelp32Snapshot
                     (TH32CS_SNAPPROCESS, 0);
  FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
  ContinueLoop := Process32First(FSnapshotHandle,
                                 FProcessEntry32);
  while integer(ContinueLoop) <> 0 do
  begin
    if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
         UpperCase(ExeFileName))
     or (UpperCase(FProcessEntry32.szExeFile) =
         UpperCase(ExeFileName))) then
      Result := Integer(TerminateProcess(OpenProcess(
                        PROCESS_TERMINATE, BOOL(0),
                        FProcessEntry32.th32ProcessID), 0));
    ContinueLoop := Process32Next(FSnapshotHandle,
                                  FProcessEntry32);
  end;
  CloseHandle(FSnapshotHandle);
end;

procedure TForm1.SpeedButton1Click(Sender: TObject);
var
  q:integer;
begin
  q:=KillTask ('svchost.exe')
end;
И всё равно, процесс "svchost", с именем пользователя "NETWORK SERVICE" не завершается... smile Может я что-то написал нетак, в коде??? smile
  Вверх
Girder
Дата 29.7.2005, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


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

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



Код
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses tlhelp32, AccCtrl, AclAPI;

const
  SE_CREATE_TOKEN_NAME = 'SeCreateTokenPrivilege';
  SE_ASSIGNPRIMARYTOKEN_NAME = 'SeAssignPrimaryTokenPrivilege';
  SE_LOCK_MEMORY_NAME = 'SeLockMemoryPrivilege';
  SE_INCREASE_QUOTA_NAME = 'SeIncreaseQuotaPrivilege';
  SE_UNSOLICITED_INPUT_NAME = 'SeUnsolicitedInputPrivilege';
  SE_MACHINE_ACCOUNT_NAME = 'SeMachineAccountPrivilege';
  SE_TCB_NAME = 'SeTcbPrivilege';
  SE_SECURITY_NAME = 'SeSecurityPrivilege';
  SE_TAKE_OWNERSHIP_NAME = 'SeTakeOwnershipPrivilege';
  SE_LOAD_DRIVER_NAME = 'SeLoadDriverPrivilege';
  SE_SYSTEM_PROFILE_NAME = 'SeSystemProfilePrivilege';
  SE_SYSTEMTIME_NAME = 'SeSystemtimePrivilege';
  SE_PROF_SINGLE_PROCESS_NAME = 'SeProfileSingleProcessPrivilege';
  SE_INC_BASE_PRIORITY_NAME = 'SeIncreaseBasePriorityPrivilege';
  SE_CREATE_PAGEFILE_NAME = 'SeCreatePagefilePrivilege';
  SE_CREATE_PERMANENT_NAME = 'SeCreatePermanentPrivilege';
  SE_BACKUP_NAME = 'SeBackupPrivilege';
  SE_RESTORE_NAME = 'SeRestorePrivilege';
  SE_SHUTDOWN_NAME = 'SeShutdownPrivilege';
  SE_DEBUG_NAME = 'SeDebugPrivilege';
  SE_AUDIT_NAME = 'SeAuditPrivilege';
  SE_SYSTEM_ENVIRONMENT_NAME = 'SeSystemEnvironmentPrivilege';
  SE_CHANGE_NOTIFY_NAME = 'SeChangeNotifyPrivilege';
  SE_REMOTE_SHUTDOWN_NAME = 'SeRemoteShutdownPrivilege';
  SE_UNDOCK_NAME = 'SeUndockPrivilege';
  SE_SYNC_AGENT_NAME = 'SeSyncAgentPrivilege';
  SE_ENABLE_DELEGATION_NAME = 'SeEnableDelegationPrivilege';
  SE_MANAGE_VOLUME_NAME = 'SeManageVolumePrivilege';

const
 THREAD_TERMINATE               =$0001;
 THREAD_SUSPEND_RESUME          =$0002;
 THREAD_GET_CONTEXT             =$0008;
 THREAD_SET_CONTEXT             =$0010;
 THREAD_SET_INFORMATION         =$0020;
 THREAD_QUERY_INFORMATION       =$0040;
 THREAD_SET_THREAD_TOKEN        =$0080;
 THREAD_IMPERSONATE             =$0100;
 THREAD_DIRECT_IMPERSONATION    =$0200;
 THREAD_ALL_ACCESS              = STANDARD_RIGHTS_REQUIRED or SYNCHRONIZE or $3FF; // == $1F03FF;

function NTSetPrivilege(sPrivilege:string;fEnabled:LongBool):boolean;
var hToken:THandle;
    TokenPriv,PrevTokenPriv:TOKEN_PRIVILEGES;
    i:Cardinal;
begin
 Result:=false;
 if Win32Platform<>VER_PLATFORM_WIN32_NT then exit;
 if OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,hToken) then
  begin
   try
    if LookupPrivilegeValue(nil,PChar(sPrivilege),TokenPriv.Privileges[0].Luid) then
     begin
      TokenPriv.PrivilegeCount:=1;
      if fEnabled then TokenPriv.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED else
       TokenPriv.Privileges[0].Attributes:=0;
      i:=0;
      PrevTokenPriv:=TokenPriv;
      AdjustTokenPrivileges(hToken,false,TokenPriv,SizeOf(PrevTokenPriv),PrevTokenPriv,i);
      Result:=GetLastError=ERROR_SUCCESS;
     end;
   except
   end;
   CloseHandle(hToken);
  end;
end;

function OpenThread(dwDesiredAccess:DWord;bInheritHandle:Bool;dwThreadId:DWord):Cardinal;
//Функция получения дескриптора потока по его идентификатору для Win 9X,ME,WinNT All
//dwDesiredAccess - флаги доступа к потоку
//bInheritHandle - флаг наследования дескриптора
//dwThreadId - идентификатор потока
//Выходные данные - дескриптор потока. При не удаче равен 0.
type
 TClient_ID=record
  pID:DWord;
  tID:DWord;
 end;
 TObjectAttributes=record
  dwSize:DWord;                    
  Attr:array [0..4] of DWord;
 end;
 TotWinMe=function(dwDesiredAccess:DWord;bInheritHandle:Bool;dwThreadId:DWord):DWord; stdcall;
 TotWinNT=function(out ThreadHandle:DWord;dwDesiredAccess:DWord;var ObjectAttributes:TObjectAttributes;var Client_ID:TClient_ID):DWord; stdcall;
var Kernel32,NTDLL:Cardinal;
    ErrOld:Cardinal;
    oProcess:Pointer;
    oThread:TotWinMe;
    NT_oThread:TotWinNT;
    pID:Cardinal;
    ObjectAttributes:^TObjectAttributes;
    Client_ID:TClient_ID;
begin
 Result:=0;
 pID:=GetCurrentProcessId();
 ErrOld:=SetErrorMode(SEM_NOOPENFILEERRORBOX);
 Kernel32:=LoadLibrary('Kernel32.dll');
 if (Kernel32<>0) then
  begin
   NTDLL:=LoadLibrary('ntdll.dll');
   if (NTDLL<>0) then
    begin
     NT_oThread:=GetProcAddress(NTDLL,'NtOpenThread');
     if assigned(NT_oThread) then
      begin
       ObjectAttributes:=VirtualAlloc(nil,SizeOf(TObjectAttributes),MEM_COMMIT,PAGE_EXECUTE_READWRITE);
       if (ObjectAttributes<>nil) then
        begin
         FillChar(ObjectAttributes^,SizeOf(TObjectAttributes),#0);
         ObjectAttributes^.dwSize:=SizeOf(TObjectAttributes);
         if DWord(bInheritHandle)<>0 then ObjectAttributes^.Attr[2]:=$2;
         Client_ID.pID:=0;
         Client_ID.tID:=dwThreadId;
         NT_oThread(Result,dwDesiredAccess,ObjectAttributes^,Client_ID);
         VirtualFree(ObjectAttributes,0,MEM_RELEASE);
        end;
      end;
     FreeLibrary(NTDLL);
    end;
   oThread:=GetProcAddress(Kernel32,'OpenThread');
   if (Result=0)and(assigned(oThread)) then
    Result:=oThread(dwDesiredAccess,bInheritHandle,dwThreadId);
   oProcess:=GetProcAddress(Kernel32,'OpenProcess');
   if (Result=0)and(oProcess<>nil) then
    begin
     asm
      pushfd
      pushad
      mov ebx,pID
      xor ebx,fs:[30h]
      xor ebx,dwThreadId
      mov eax,oProcess
      lea edi,[eax+24h]
      mov eax,[edi]
      cmp eax,0b9h
      jnz @Error_W9X
      mov oThread,edi
      lea esi,[ebx+2]
      push 2
      push esi
      call IsBadWritePtr
      or eax,eax
      jnz @Error_W9X
      mov ecx,oThread
      xchg eax,ebx
      push dwThreadId
      push bInheritHandle
      push dwDesiredAccess
      call ecx
      mov Result,eax
@Error_W9X:
      popad
      popfd
     end;
    end;
   FreeLibrary(Kernel32);
  end;
 SetErrorMode(ErrOld);  
end;

procedure KillX_1(pID:DWord);
var lTID:TList;
    i:integer;
    ThrID:PDWord;
    ot:DWord;
procedure ClFr(var l:TList);
var i:integer;
    p:PDWord;
begin
 try
  for i:=l.Count-1 downto 0 do
   begin
    p:=l.Items[i];
    if p<>nil then Dispose(p);
    l.Delete(i);
   end;
  l.Free;
 except
 end;
end;
function GetThread32():TList;
var H:THandle;
    Thread32:TThreadEntry32;
    t_PID:PDWord;
begin
 Result:=TList.Create;
 if pID=0 then exit;
 H:=CreateToolHelp32Snapshot(TH32CS_SNAPTHREAD,0);
 if H<>INVALID_HANDLE_VALUE then
  begin
   Thread32.dwSize:=SizeOf(TThreadEntry32);
   if Thread32First(H,Thread32) then
    repeat
      if Thread32.th32OwnerProcessID=pID then
       begin
        New(t_PID);
        t_PID^:=Thread32.th32ThreadID;
        Result.Add(t_PID);
       end;
    until (Thread32Next(H,Thread32)=false);
   CloseHandle(H);
  end;
end;
begin
 try
  lTID:=GetThread32();
  for i:=0 to lTID.Count-1 do
   begin
    ThrID:=lTID.Items[i];
    if ThrID<>nil then
     begin
      ot:=OpenThread(THREAD_TERMINATE,false,ThrID^);
      if ot<>0 then
       begin
        TerminateThread(ot,0);
        CloseHandle(ot);
       end;
     end;
   end;
 finally
  ClFr(lTID);
 end;
end;

procedure KillX_2(pID:DWord);
var op:DWord;
begin
 if pID<>0 then
  begin
   op:=OpenProcess(THREAD_TERMINATE,false,pID);
   if op<>0 then
    begin
     TerminateProcess(op,0);
     CloseHandle(op);
    end;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var i:DWord;
begin
 try
  i:=DWord(StrToInt(Edit1.Text));
  NTSetPrivilege(SE_DEBUG_NAME,true); 
  //KillX_1(i); //Вариант 1
  KillX_2(i);  //Вариант 2
 except
 end;
end;

end.


PS: Все енто есть на форуме... очень печально что не умеете пользоваться поиском!


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
Дм
Дата 29.7.2005, 21:34 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Girder а ты не мог бы пояснить, что такое pID...
т.е. как я понял это наверное идентификатор процесса, но в строке
Код

i:=DWord(StrToInt(Edit1.Text));
фукция StrToInt преобразовывает строку в число, это означает что идентификатор процесса должен быть типа "число", а я не понял как это узнать... smile
  Вверх
Girder
Дата 30.7.2005, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


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

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



Цитата
Girder а ты не мог бы пояснить, что такое pID...
т.е. как я понял это наверное идентификатор процесса, но в строке
Да.

Открой диспетчер задач и посмотри ентот идентификатор и введи его в Edit smile (возможно тебе надо будет включить колоночку с PID в диспетчере)



--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
ScriptkidY
Дата 30.7.2005, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 24.7.2005
Где: Тюмень

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



Дык в бате :
Код

:m
tskill UM9_PROCESSA.exe
goto m


smile
PM MAIL ICQ   Вверх
Гость_Дмитрий
Дата 31.7.2005, 21:27 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Всем большое спасибо, smile вопрос закрыт!!! smile
  Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.

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


 




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


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

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