天天看点

通过WinStationTerminateProcess终止指定进程

{

  *通过WinStationTerminateProcess终止指定进程*

  作者: JJony

  联系方式: [email protected]

  QQ: 254706028

}

unit JJony_Unit;

interface

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs,StdCtrls;

const

WTS_CURRENT_SERVER_HANDLE=0;

type

  TForm1 = class(TForm)

    Edit1: TEdit;

    Button1: TButton;

    Label1: TLabel;

    Button2: TButton;

    procedure FormCreate(Sender: TObject);

    procedure Button1Click(Sender: TObject);

    procedure Button2Click(Sender: TObject);

    procedure Edit1KeyPress(Sender: TObject; var Key: Char);

  private

    { Private declarations }

  public

    { Public declarations }

  end;

 //定义 WinStationTerminateProcess

type

 TWinStationTerminateProcess=function(hServer:thandle;ProcessId:Cardinal;ExitCode:Cardinal):boolean;stdcall;

var

  Form1: TForm1;

  HKernelDll:HMODULE;

  WinStationTerminateProcess:TWinStationTerminateProcess;

implementation

{$R *.dfm}

//获取Debug权限

function EnableDebugPrivilege:Boolean;

var

 TokenHandle:THandle;

 DebugNameValue:TLargeInteger;

 Privileges:TOKEN_PRIVILEGES;

 RetLen:Cardinal;

begin

 Result:=False;

 if not OpenProcessToken(GetCurrentProcess,TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,TokenHandle) then Exit;

 if not LookupPrivilegeValue(nil,'SeDebugPrivilege',DebugNameValue) then

 begin

  CloseHandle(TokenHandle);

  Exit;

 end;

 Privileges.PrivilegeCount:=1;

 Privileges.Privileges[0].Luid:=DebugNameValue;

 Privileges.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED;

 Result:=AdjustTokenPrivileges(TokenHandle,False,Privileges,SizeOf(Privileges),nil,RetLen);

 CloseHandle(TokenHandle);

end;

//动态加载 WinStationTerminateProcess

function LoadWinStaDll: LongBool;

begin

  if HKernelDll = 0 then

  begin

    HKernelDll := LoadLibrary('WINSTA.dll');

    if HKernelDll<> 0 then

    begin

      WinStationTerminateProcess:= GetProcAddress(HKernelDll, 'WinStationTerminateProcess');

    end;

  end;

  Result := Assigned(WinStationTerminateProcess);

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

LoadWinStaDll;

end;

procedure TForm1.Button1Click(Sender: TObject);

var

h:thandle;

ECode:ULong;

begin

if edit1.Text='' then exit;

EnableDebugPrivilege;

h:=OpenProcess(PROCESS_TERMINATE,false,strtoint(edit1.Text));//以PROCESS_TERMINATE权限打开进程

if h<=0 then

 begin

  messagebox(handle,'打开进程失败!','提示',MB_OK or MB_ICONINFORMATION);

  exit;

 end;

if GetExitCodeProcess(h,ECode) then   //获取进程退出码

 begin

  WinStationTerminateProcess(WTS_CURRENT_SERVER_HANDLE,strtoint(edit1.Text),ECode);

 end

 else

  messagebox(handle,'获取进程退出码失败!','提示',MB_OK or MB_ICONINFORMATION);

end;

procedure TForm1.Button2Click(Sender: TObject);

begin

close;

end;

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);

begin

//使Edit只能接受数字键和删除键

if not (key in ['0','1','2','3','4','5','6','7','8','9',char(VK_DELETE),char(VK_CLEAR),char(VK_BACK)]) then

  key:=#0; 

end;

end.

继续阅读