Форум: "WinAPI";
Текущий архив: 2008.09.21;
Скачать: [xml.tar.bz2];
ВнизПолучение списка процессов (ZwQuerySystemInformation) Найти похожие ветки
← →
Nucer (2007-12-01 11:28) [0]Необходимо получить список процессов всех пользователей в системе. Нашел статью:
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1279
Код:program process_seeker;
{$APPTYPE CONSOLE}
uses
SysUtils, windows, tintlist;
type
NTStatus = cardinal;
PVOID = pointer;
USHORT = WORD;
UCHAR = byte;
PWSTR = PWideChar;
CONST //Статус константы
STATUS_SUCCESS = NTStatus($00000000);
STATUS_ACCESS_DENIED = NTStatus($C0000022);
STATUS_INFO_LENGTH_MISMATCH = NTStatus($C0000004);
const SystemProcessesAndThreadsInformation = 5;
type
PClientID = ^TClientID;
TClientID = packed record
UniqueProcess:cardinal;
UniqueThread:cardinal;
end;
PUnicodeString = ^TUnicodeString;
TUnicodeString = packed record
Length: Word;
MaximumLength: Word;
Buffer: PWideChar;
end;
PVM_COUNTERS = ^VM_COUNTERS;
VM_COUNTERS = packed record
PeakVirtualSize,
VirtualSize,
PageFaultCount,
PeakWorkingSetSize,
WorkingSetSize,
QuotaPeakPagedPoolUsage,
QuotaPagedPoolUsage,
QuotaPeakNonPagedPoolUsage,
QuotaNonPagedPoolUsage,
PagefileUsage,
PeakPagefileUsage: dword;
end;
PIO_COUNTERS = ^IO_COUNTERS;
IO_COUNTERS = packed record
ReadOperationCount,
WriteOperationCount,
OtherOperationCount,
ReadTransferCount,
WriteTransferCount,
OtherTransferCount: LARGE_INTEGER;
end;
PSYSTEM_THREADS = ^SYSTEM_THREADS;
SYSTEM_THREADS = packed record
KernelTime,
UserTime,
CreateTime: LARGE_INTEGER;
WaitTime: dword;
StartAddress: pointer;
ClientId: TClientId;
Priority,
BasePriority,
ContextSwitchCount: dword;
State: dword;
WaitReason: dword;
end;
PSYSTEM_PROCESSES = ^SYSTEM_PROCESSES;
SYSTEM_PROCESSES = packed record
NextEntryDelta,
ThreadCount: dword;
Reserved1 : array [0..5] of dword;
CreateTime,
UserTime,
KernelTime: LARGE_INTEGER;
ProcessName: TUnicodeString;
BasePriority: dword;
ProcessId,
InheritedFromProcessId,
HandleCount: dword;
Reserved2: array [0..1] of dword;
VmCounters: VM_COUNTERS;
IoCounters: IO_COUNTERS; // Windows 2000 only
Threads: array [0..0] of SYSTEM_THREADS;
end;
Function ZwQuerySystemInformation(ASystemInformationClass: dword;
ASystemInformation: Pointer;
ASystemInformationLength: dword;
AReturnLength:PCardinal): NTStatus;
stdcall;external "ntdll.dll";
{ Получение буфера с системной информацией }
Function GetInfoTable(ATableType:dword):Pointer;
var
mSize: dword;
mPtr: pointer;
St: NTStatus;
begin
Result := nil;
mSize := $4000; //начальный размер буфера
repeat
mPtr := VirtualAlloc(nil, mSize, MEM_COMMIT or MEM_RESERVE, PAGE_READWRITE);
if mPtr = nil then Exit;
St := ZwQuerySystemInformation(ATableType, mPtr, mSize, nil);
if St = STATUS_INFO_LENGTH_MISMATCH then
begin //надо больше памяти
VirtualFree(mPtr, 0, MEM_RELEASE);
mSize := mSize * 2;
end;
until St <> STATUS_INFO_LENGTH_MISMATCH;
if St = STATUS_SUCCESS
then Result := mPtr
else VirtualFree(mPtr, 0, MEM_RELEASE);
end;
var info, info2: PSystem_Processes;
i, j, k: integer;
t, t1: LARGE_INTEGER;
process_id: tintegerlist;
begin
process_id := TIntegerList.Create;
//СОЗДАЕМ СПИСОК ПРОЦЕССОВ НА МОМЕНТ СОЗДАНИЯ НАШЕГО ПРОЦЕССА
info := GetInfoTable(SystemProcessesAndThreadsInformation);
info2 := info;
while (info2^.NextEntryDelta <> 0) do
begin
if (process_id.IndexOf(info2^.ProcessId)=-1)
then process_id.Add(info2^.ProcessId);
info2 := Pointer(dword(info2)+info2^.NextEntryDelta);
end;
VirtualFree(info, 0, MEM_RELEASE);
//А теперь смотрим что добавилось
while true do
begin
Sleep(200);
info := GetInfoTable(SystemProcessesAndThreadsInformation);
info2 := info;
while (info2^.NextEntryDelta <> 0) do
begin
if (process_id.IndexOf(info2^.ProcessId)=-1)
then
begin
writeln(info2^.ProcessId, " - created");
process_id.Add(info2^.ProcessId);
end;
info2 := Pointer(dword(info2)+info2^.NextEntryDelta);
end;
VirtualFree(info, 0, MEM_RELEASE);
end;
end.
info2^.ProcessName.Buffer - тут будет имя файла, а реально ли получить полный путь к этому файлу?
← →
Nucer (2007-12-01 11:41) [1]Можно воспользоваться этим:
function GetNameByPid(pid: dword): string;
var
ph: THandle;
mh: hmodule;
cm: cardinal;
ModName: array[0..max_path] of char;
begin
ph:=OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, false, pid);
if ph > 0 then
begin
EnumProcessModules(ph, @mh, 4, cm);
GetModuleFileNameEx(ph, mh, ModName, sizeof(ModName));
result:=string(ModName);
CloseHandle(ph);
end else result:="ERROR";
end;
Но процессы другого пользователя открыть не получится в результете чего будут одни ERROR"ы...
← →
Nucer (2007-12-03 18:36) [2]UP
← →
Игорь Шевченко © (2007-12-04 11:11) [3]
> Но процессы другого пользователя открыть не получится в
> результете чего будут одни ERROR"ы...
выстави себе seDebugPrivilege
← →
slow!alfamoon!com (2007-12-04 23:46) [4]Гы! Читают таки мою статью... :))
А по теме - сказано в [3]
По поводу добавления дебаг привилегии..
function EnablePrivilegeEx(Process: dword; lpPrivilegeName: PChar):Boolean;
var
hToken: dword;
NameValue: Int64;
tkp: TOKEN_PRIVILEGES;
ReturnLength: dword;
begin
Result:=false;
OpenProcessToken(Process, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken);
if not LookupPrivilegeValue(nil, lpPrivilegeName, NameValue) then
begin
CloseHandle(hToken);
exit;
end;
tkp.PrivilegeCount := 1;
tkp.Privileges[0].Luid := NameValue;
tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, false, tkp, SizeOf(TOKEN_PRIVILEGES), tkp, ReturnLength);
if GetLastError() <> ERROR_SUCCESS then
begin
CloseHandle(hToken);
exit;
end;
Result:=true;
CloseHandle(hToken);
end;
function EnablePrivilege(lpPrivilegeName: PChar):Boolean;
begin
Result := EnablePrivilegeEx(INVALID_HANDLE_VALUE, lpPrivilegeName);
end;
function EnableDebugPrivilegeEx(Process: dword):Boolean;
begin
Result := EnablePrivilegeEx(Process, "SeDebugPrivilege");
end;
function EnableDebugPrivilege():Boolean;
begin
Result := EnablePrivilegeEx(INVALID_HANDLE_VALUE, "SeDebugPrivilege");
end;
Можно использовать не ту функцию что вы предлагаете, а немного другую.
Сорцы искать правда лениво... Посмотри на сайте (см.ник)
← →
Ins © (2007-12-04 23:54) [5]
> Гы! Читают таки мою статью... :))
Ты эта... Сам в обсуждение свой статьи иногда заглядывай! ;)
← →
Nucer (2007-12-05 16:58) [6]Может я что не правильно сделал, но SeDebugPrivilege дается только администратору. В итоге уже лучше, но из под гостя все равно будет отказано в доступе. Я где-то ошибся или это уже никак не обойти?
← →
slow!alfamoon!com (2007-12-05 23:38) [7]Из под гостя таким образом не посмотришь... Надо либо повышать привилегии либо смотреть в сторону WTS функций (что более правильно)
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2008.09.21;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.007 c