【发布时间】:2023-04-08 07:10:01
【问题描述】:
我正在尝试完成一个确定的过程 (reference),但在它之前我需要 ZwAssignProcessToJobObject(),我制作了以下小代码来演示我的问题,Status 正在返回 0xC0000022 (ACCESS_DENIED)。有办法解决吗?
type
NTSTATUS = cardinal;
PClientId = ^TClientId;
TClientId = record
UniqueProcess: THandle;
UniqueThread: THandle;
end;
PObjectAttributes = ^TObjectAttributes;
TObjectAttributes = packed record
Length: Cardinal;
RootDirectory: THandle;
ObjectName: PUnicodeString;
Attributes: Cardinal;
SecurityDescriptor: Pointer;
SecurityQualityOfService: Pointer;
end;
OBJECT_ATTRIBUTES = ^TObjectAttributes;
POBJECT_ATTRIBUTES = ^OBJECT_ATTRIBUTES;
const
STATUS_SUCCESS = $00000000;
var
Status: NTSTATUS;
function CreateJobObjectW(lpJobAttributes: PSecurityAttributes; lpName: LPCWSTR): THANDLE; stdcall;external kernel32 name 'CreateJobObjectW' ;
function ZwAssignProcessToJobObject(hJob, hProcess: THANDLE): NTSTATUS; stdcall; external 'ntdll.dll';
function IsProcessInJob(ProcessHandle, JobHandle: THANDLE; var Result_: BOOL): BOOL; stdcall; external kernel32 name 'IsProcessInJob';
function ZwTerminateJobObject(JobHandle: THANDLE; ExitStatus: NTSTATUS): NTSTATUS; stdcall; external 'ntdll.dll';
function ZwOpenProcess(phProcess:PDWORD; AccessMask:DWORD; ObjectAttributes:PObjectAttributes; ClientID:PClientID): NTStatus; stdcall; external 'ntdll.dll' name 'ZwOpenProcess';
function ZwClose(Handle: THandle): NTSTATUS; stdcall;external 'ntdll.dll';
function MyZwOpenProcess(PID: Integer):THandle;
var
cid: TClientId;
atr: TObjectAttributes;
begin
atr.Length := SizeOf(OBJECT_ATTRIBUTES);
atr.RootDirectory := 0;
atr.ObjectName := nil;
atr.Attributes := 0;
atr.SecurityDescriptor := nil;
atr.SecurityQualityOfService := nil;
cid.UniqueProcess := PID;
cid.UniqueThread := 0;
ZwOpenProcess(@Result,PROCESS_ALL_ACCESS,@atr,@cid);
end;
Procedure CloseProcessByHandle(hProcess:Thandle);
var
h:Thandle;
bInJob: LongBool;
begin
h := CreateJobObjectW(nil,'foo');
Status := ZwAssignProcessToJobObject(h,hProcess);
if (Status = STATUS_SUCCESS) then
begin
ZwTerminateJobObject(h,0);
end;
ZwClose(h);
end;
////////// ButtonClick event (usage) ///////////
var
closeProcess: Thandle;
begin
closeProcess := MyZwOpenProcess(2980);
CloseProcessByHandle(closeProcess);
Showmessage('0x'+ inttostr(inttohex(Status,8)));
end;
【问题讨论】:
-
寻找NtAssignProcessToJobObject的源代码。它可以通过多种原因返回
STATUS_ACCESS_DENIED。在您的情况下最有可能 - 如果进程已经在工作中,或者工作会话 ID 与进程会话 ID 不同。从您的代码不清楚-您使用的过程是什么。以及为什么你在做什么,而不是简单地终止进程 -
@RbMm,谢谢。解决了!
-
@flash - 如果您对发布/接收答案不感兴趣,请考虑删除问题。
标签: delphi winapi kill-process