Форум: "WinAPI";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];
ВнизНайти процесс... Найти похожие ветки
← →
3APA3A © (2004-03-18 22:16) [0]Как мне получить все ProcessID запущенного процесса (несколько экземпляров запущено) с именем myprocess.exe?
← →
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 - все работает.
← →
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...
← →
3APA3A © (2004-03-20 22:55) [2]Есть программа, которая не создает никаких окон и не является кон. приложением. Имя ее myprog.exe. Я могу запустить несколько копий. И должен быть файл типа myprog_killer.exe, запустив которую я убью все экземпляры myprog.exe. Это должно работать на Win98, WinNT...
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.031 c