Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.09.21;
Скачать: CL | DM;

Вниз

Получение списка процессов (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 вся ветка

Текущий архив: 2008.09.21;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.029 c
4-1197007012
Riply
2007-12-07 08:56
2008.09.21
Перечисление потоков "файлового объекта".


15-1217245659
brother
2008-07-28 15:47
2008.09.21
слетел raid5 массив


2-1218464716
ChaosAD
2008-08-11 18:25
2008.09.21
Переход на другой компонет при достужении конечной длины Edit a


15-1217603510
_koha
2008-08-01 19:11
2008.09.21
Разрабатываю новую утилиту AdminLancher


15-1217251086
ArMellon
2008-07-28 17:18
2008.09.21
Как сделать прогу для КПК?