1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
| Function TForm1.SetPrivilege(aPrivilege :string; aEnabled :boolean): Boolean;
var
Token :THandle;
TokenPriv :TOKEN_PRIVILEGES;
PrevTokenPriv :TOKEN_PRIVILEGES;
Len :Cardinal;
begin
if OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, Token) then
begin
try
if LookupPrivilegeValue(nil, PChar(aPrivilege), TokenPriv.Privileges[0].Luid) then
begin
TokenPriv.PrivilegeCount := 1;
if aEnabled
then TokenPriv.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED
else TokenPriv.Privileges[0].Attributes := 0;
Exit(AdjustTokenPrivileges(Token, False, TokenPriv, SizeOf(PrevTokenPriv), PrevTokenPriv, Len));
end;
finally
CloseHandle(Token);
end;
end;
Result := FALSE;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
SnapShot :THandle;
Process :TProcessEntry32;
Handle :THandle;
s :string;
const
PROCESS_QUERY_LIMITED_INFORMATION = $1000;
begin
SetPrivilege('SeDebugPrivilege', TRUE);
try
Process.dwSize := SizeOf(TProcessEntry32);
Snapshot := CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if Snapshot <> INVALID_HANDLE_VALUE then
try
if Process32First(Snapshot, Process) then
repeat
Handle := OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, Process.th32ProcessID);
if Handle <> 0 then
try
SetLength(s, MAX_PATH);
SetLength(s, GetModuleFileNameEx(Handle, 0, PChar(s), MAX_PATH));
finally
CloseHandle(Handle);
end
else s := format('%d : %s', [GetLastError, SysErrorMessage(GetLastError)]);
Listbox1.Items.Add(format('%s (%s)', [Process.szExeFile, s]));
until not Process32Next(Snapshot, Process);
finally
CloseHandle(Snapshot);
end;
finally
SetPrivilege('SeDebugPrivilege', FALSE);
end;
end; |
Partager