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

Вниз

Найти процесс...   Найти похожие ветки 

 
3APA3A ©   (2004-03-18 22:16) [0]

Как мне получить все ProcessID запущенного процесса (несколько экземпляров запущено) с именем myprocess.exe?


 
Alexander666 ©   (2004-03-19 06:20) [1]

Гмм, ну коли использовать NtQuerySystemInformation или ToolHelp32, то тогда так:

NtQuerySystemInformation:
==============================================
type
 TUnicodeString = packed record
   Length : WORD;
   MaximumLength : WORD;
   Buffer : PWideChar;
 end;
 PUnicodeString = ^TUnicodeString;
 TUNICODE_STRING = TUnicodeString;
 UNICODE_STRING = TUnicodeString;
 PUNICODE_STRING = PUnicodeString;

 VM_COUNTERS = packed record
   PeakVirtualSize : ULONG;
   VirtualSize : ULONG;
   PageFaultCount : ULONG;
   PeakWorkingSetSize : ULONG;
   WorkingSetSize : ULONG;
   QuotaPeakPagedPoolUsage : ULONG;
   QuotaPagedPoolUsage : ULONG;
   QuotaPeakNonPagedPoolUsage : ULONG;
   QuotaNonPagedPoolUsage : ULONG;
   PageFileUsage : ULONG;
   PeakPageFileUsage : ULONG;
 end;

 IO_COUNTERS = packed record
   ReadOperationCount : LARGE_INTEGER;
   WriteOperationCount : LARGE_INTEGER;
   OtherOperationCount : LARGE_INTEGER;
   ReadTransferCount : LARGE_INTEGER;
   WriteTransferCount : LARGE_INTEGER;
   OtherTransferCount : LARGE_INTEGER;
 end;

 SYSTEM_PROCESSES_NT = packed record
   NextEntryDelta : ULONG;
   ThreadCount : ULONG;
   Reserved1 : array[0..5] of ULONG;
   CreateTime : LARGE_INTEGER;
   UserTime : LARGE_INTEGER;
   KernelTime : LARGE_INTEGER;
   ProcessName : UNICODE_STRING;
   BasePriority : Integer;
   ProcessId : ULONG;
   InheritedFromProcessId : ULONG;
   HandleCount : ULONG;
   Reserved2 : array[0..1] of ULONG;
   VmCounters : VM_COUNTERS;
   PrivatePageCount : ULONG;
   IoCounters : IO_COUNTERS;
 end;
 PSYSTEM_PROCESSES_NT = ^SYSTEM_PROCESSES_NT;

...

procedure TMainForm.Button1Click(Sender: TObject);
const
 STATUS_INFO_LENGTH_MISMATCH = Integer($C0000004);
 STATUS_SUCCESS              = Integer($00000000);
var
 NtdllHandle: THandle;
 NtStatus: Integer;
 NextOffset : ULONG;
 NtQuerySystemInformation: function(SystemInformationClass: LongInt;
   SystemInformation: Pointer; SystemInformationLength: ULONG;
   ReturnLength: PDWORD): Integer; stdcall;
 Buf: Pointer;
 BufSize, RetSize: DWORD;
 ListOfProcesses: PSYSTEM_PROCESSES_NT;
begin
 NtDllHandle := GetModuleHandle("ntdll.dll");
 if NtDllHandle <> 0 then
 begin
   BufSize := $400;
   GetMem(Buf, BufSize);
   @NtQuerySystemInformation := GetProcAddress(NtDllHandle, "NtQuerySystemInformation");
   NtStatus := NtQuerySystemInformation(5, Buf, BufSize, @RetSize);
   while NtStatus = STATUS_INFO_LENGTH_MISMATCH do
   begin
     FreeMem(Buf);
     BufSize := BufSize * 2;
     GetMem(Buf, BufSize);
     NtStatus := NtQuerySystemInformation(5, Buf, BufSize, @RetSize);
   end;
   if NtStatus <> STATUS_SUCCESS then
     FreeMem(Buf)
   else begin
     ListOfProcesses := PSYSTEM_PROCESSES_NT(Buf);
     repeat
       if ListOfProcesses.ProcessName.Buffer = "myprocess.exe" then  
       begin
         ListBox1.Items.Add(Format("$%0x", [ListOfProcesses.ProcessID]));
         {или еще что-нибудь}
       end;
       NextOffset := ListOfProcesses^.NextEntryDelta;
       ListOfProcesses :=
         PSYSTEM_PROCESSES_NT(DWORD(ListOfProcesses) + NextOffset);
     until NextOffset = 0;
   end;
 end;
end;
========================
С ToolHelp32 будет немного полегче:

uses TlHelp32,...;

...

procedure TMainForm.Button2Click(Sender: TObject);
var
 ProcessEntry : TProcessEntry32;
 Snap: THandle;
begin
 Snap := CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0);
 if Snap <> INVALID_HANDLE_VALUE then
 begin
   ProcessEntry.dwSize := SizeOf(ProcessEntry);
   if Process32First(Snap, ProcessEntry) then
     repeat
       if ProcessEntry.szExeFile = "myprocess.exe" then  
       begin
         ListBox1.Items.Add(Format("$%0x", [ProcessEntry.th32ProcessID]));
         {или еще что-нибудь}
       end;
     until not Process32Next(Snap, ProcessEntry);
   CloseHandle(Snap);
 end;
end;

Тестировалось это в XP SP1 - все работает.


 
3APA3A ©   (2004-03-20 22:55) [2]

Есть программа, которая не создает никаких окон и не является кон. приложением. Имя ее myprog.exe. Я могу запустить несколько копий. И должен быть файл типа myprog_killer.exe, запустив которую я убью все экземпляры myprog.exe. Это должно работать на Win98, WinNT...



Страницы: 1 вся ветка

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

Наверх




Память: 0.47 MB
Время: 0.028 c
1-1079615848
Pa5ha
2004-03-18 16:17
2004.04.11
Возможности синтаксиса и компиляьора.


1-1082487064
Shopot
2004-04-20 22:51
2004.04.11
Перетаскивание компонентов.


14-1079618779
rea
2004-03-18 17:06
2004.04.11
Variant и реляционные DB


1-1079732940
OneHumanMore
2004-03-20 00:49
2004.04.11
Описание формы в нескольких модулях


14-1082029483
Kolyan
2004-04-15 15:44
2004.04.11
БЕЗОПАСНОСТЬ ПО ЛОКАЛКЕ