delphi 11 64位 OpenProcessToken
时间: 2023-09-15 08:16:11 浏览: 36
在 Delphi 11 64 位环境下,可以使用 Windows API 函数 `OpenProcess` 和 `OpenProcessToken` 来打开进程句柄和进程访问令牌。
以下是一个示例代码:
```delphi
uses
Windows;
function OpenProcessTokenByPID(dwPID: DWORD): THandle;
var
hProcess: THandle;
hToken: THandle;
begin
// 打开进程句柄
hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, dwPID);
if hProcess = 0 then
RaiseLastOSError;
try
// 打开进程访问令牌
if not OpenProcessToken(hProcess, TOKEN_QUERY, hToken) then
RaiseLastOSError;
Result := hToken;
finally
CloseHandle(hProcess);
end;
end;
```
可以通过调用 `OpenProcessTokenByPID` 函数来获取指定进程的进程访问令牌句柄。其中,`dwPID` 参数为进程的进程 ID。在函数执行完成后,可以使用返回的句柄来获取进程访问令牌信息。
相关问题
delphi11OpenProcessToken 传参报错’
在 Delphi 11 中,`OpenProcessToken` 函数的参数与之前的版本可能有所不同,您需要确认您的参数是否正确。
首先,您需要确保 `hProcess` 参数是一个有效的进程句柄。如果进程句柄无效,则会导致 `OpenProcessToken` 失败。您可以使用 `GetLastError` 函数获取详细的错误信息。
其次,您需要确认访问权限参数是否正确。在 Delphi 11 中,您可以使用 `TOKEN_ADJUST_DEFAULT` 和 `TOKEN_QUERY_DEFAULT` 这两个常量来设置访问权限,如下所示:
```delphi
const
TOKEN_ADJUST_DEFAULT = $0080;
TOKEN_QUERY_DEFAULT = $0100;
var
hProcess: THandle;
hToken: THandle;
dwAccess: DWORD;
begin
// 获取进程句柄
hProcess := OpenProcess(PROCESS_QUERY_INFORMATION, False, ProcessID);
if hProcess = 0 then
begin
RaiseLastOSError;
Exit;
end;
// 设置访问权限
dwAccess := TOKEN_ADJUST_DEFAULT or TOKEN_QUERY_DEFAULT;
// 打开进程令牌
if not OpenProcessToken(hProcess, dwAccess, hToken) then
begin
RaiseLastOSError;
CloseHandle(hProcess);
Exit;
end;
// 使用令牌进行操作
// ...
// 关闭句柄
CloseHandle(hToken);
CloseHandle(hProcess);
end;
```
请注意,`TOKEN_ADJUST_DEFAULT` 和 `TOKEN_QUERY_DEFAULT` 与之前的常量值不同。如果您使用了旧的常量值,可能会导致访问权限设置不正确,从而导致 `OpenProcessToken` 失败。
delphi OpenProcessToken如何传参
在 Delphi 中使用 `OpenProcessToken` 函数时,需要传递两个参数:进程句柄和访问权限。
进程句柄是一个 `THandle` 类型的值,可以通过 `OpenProcess` 函数获得。访问权限是一个 `DWORD` 类型的值,表示对进程访问的权限,通常使用 `TOKEN_ADJUST_PRIVILEGES` 和 `TOKEN_QUERY` 这两个常量进行设置,如下所示:
```delphi
const
TOKEN_ADJUST_PRIVILEGES = $0020;
TOKEN_QUERY = $0008;
var
hProcess: THandle;
hToken: THandle;
dwAccess: DWORD;
begin
// 获取进程句柄
hProcess := OpenProcess(PROCESS_QUERY_INFORMATION, False, ProcessID);
if hProcess = 0 then
begin
RaiseLastOSError;
Exit;
end;
// 设置访问权限
dwAccess := TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY;
// 打开进程令牌
if not OpenProcessToken(hProcess, dwAccess, hToken) then
begin
RaiseLastOSError;
CloseHandle(hProcess);
Exit;
end;
// 使用令牌进行操作
// ...
// 关闭句柄
CloseHandle(hToken);
CloseHandle(hProcess);
end;
```
在上面的代码中,`ProcessID` 表示进程的 ID,`PROCESS_QUERY_INFORMATION` 是获取进程信息的访问权限。`RaiseLastOSError` 函数可以抛出最近一次操作系统错误信息。