{
*通过WinStationTerminateProcess终止指定进程*
作者: JJony
联系方式: jzj_jony@126.com
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.