HANDLE HS = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
PROCESSENTRY32 P;
P.dwSize = sizeof (PROCESSENTRY32);
if (Process32First(HS, &P))
do
{
printf("%s\n", P.szExeFile);
} while (Process32Next(HS, &P));
CloseHandle(HS);
Работа с процессами
Меня интересуют следующие вопросы:
1) Как вывести на экран ( Работаю в Borland C++ Builder 6 ) информацию о всех процессах, запущенных в системе .
2) Как узнать адрес первой и последней ячеек памяти, занимаемой процессом?
P.S: Только ради Бога, не отсылайте меня к Рихтеру . Его пример у меня не работает .
Цитата:
1) Как вывести на экран ( Работаю в Borland C++ Builder 6 ) информацию о всех процессах, запущенных в системе
Код:
Цитата: flat
Код:
HANDLE HS = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
PROCESSENTRY32 P;
P.dwSize = sizeof (PROCESSENTRY32);
if (Process32First(HS, &P))
do
{
printf("%s\n", P.szExeFile);
} while (Process32Next(HS, &P));
CloseHandle(HS);
PROCESSENTRY32 P;
P.dwSize = sizeof (PROCESSENTRY32);
if (Process32First(HS, &P))
do
{
printf("%s\n", P.szExeFile);
} while (Process32Next(HS, &P));
CloseHandle(HS);
HANDLE HS = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); - не проходит . Пишет "Cannot convert void to unsigned int *" .
int FillProcessesList(TRichEdit slProcesses)
{THandle *hSnap ;
PROCESSENTRY32 pe32 ;
int i;
// Проверяем кооректность параметра
// Пролучаем снапшот состояния системных объектов
hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
и вот тут не проходит :(
Цитата: MurzET
HANDLE HS = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); - не проходит . Пишет "Cannot convert void to unsigned int *" .
Ты хочешь сказать, что CreateToolhelp32Snapshot объявлена как возвращающая тип void? Или ты пропустил звёздочку (void*)? Если последнее, просто сделай каст:
Код:
HADNLE hSnap=(unsigned int*)CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
Если же всё-таки первое, то бросай этот долбаный Бильдер к чертям собачим.
Код:
HANDLE hProcessSnap;
hProcessSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
hProcessSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
Кстати есть прекрасный пример в MSDN.
Код:
local cb:DWORD
local p:PVOID
local dwMemAddr:DWORD
and cb, 0
invoke ZwQuerySystemInformation, SystemProcessesAndThreadsInformation, addr p, 0, addr cb
.if cb!=0
invoke VirtualAlloc,0h,cb,MEM_COMMIT,PAGE_READWRITE
.if eax!=0
mov dwMemAddr,eax
mov p,eax
invoke ZwQuerySystemInformation,SystemProcessesAndThreadsInformation, p, cb, addr cb
.if eax == STATUS_SUCCESS
invoke MessageBox,0h,$CTA0("ZwQuerySystemInformation Ok"),$CTA0("Ok"),MB_OK
mov eax,dword ptr p
.endif
.else
invoke MessageBox,0h,$CTA0("VirtualAlloc Error"),$CTA0("Error"),MB_OK
.endif
invoke VirtualFree,dwMemAddr,cb,MEM_DECOMMIT
.if eax!=0
.else
invoke MessageBox,0h,$CTA0("VirtualFree Error"),$CTA0("Error"),MB_OK
.endif
.endif
local p:PVOID
local dwMemAddr:DWORD
and cb, 0
invoke ZwQuerySystemInformation, SystemProcessesAndThreadsInformation, addr p, 0, addr cb
.if cb!=0
invoke VirtualAlloc,0h,cb,MEM_COMMIT,PAGE_READWRITE
.if eax!=0
mov dwMemAddr,eax
mov p,eax
invoke ZwQuerySystemInformation,SystemProcessesAndThreadsInformation, p, cb, addr cb
.if eax == STATUS_SUCCESS
invoke MessageBox,0h,$CTA0("ZwQuerySystemInformation Ok"),$CTA0("Ok"),MB_OK
mov eax,dword ptr p
.endif
.else
invoke MessageBox,0h,$CTA0("VirtualAlloc Error"),$CTA0("Error"),MB_OK
.endif
invoke VirtualFree,dwMemAddr,cb,MEM_DECOMMIT
.if eax!=0
.else
invoke MessageBox,0h,$CTA0("VirtualFree Error"),$CTA0("Error"),MB_OK
.endif
.endif
В dwMemAddr будет адрес памяти, в которой будут все процессы!
Память заполнится вот такими структурами:
Код:
SYSTEM_PROCESSES STRUCT
NextEntryDelta DWORD ?
ThreadCount DWORD ?
Reserved1 DWORD 6 dup(?)
CreateTime LARGE_INTEGER <>
UserTime LARGE_INTEGER <>
KernelTime LARGE_INTEGER <>
ProcessName UNICODE_STRING <>
BasePriority SDWORD ?
ProcessId DWORD ?
InheritedFromProcessId DWORD ?
HandleCount DWORD ?
Reserved2 DWORD 2 dup(?)
VmCounters VM_COUNTERS <>
IoCounters IO_COUNTERS <>
Threads SYSTEM_THREADS <>
SYSTEM_PROCESSES ENDS
NextEntryDelta DWORD ?
ThreadCount DWORD ?
Reserved1 DWORD 6 dup(?)
CreateTime LARGE_INTEGER <>
UserTime LARGE_INTEGER <>
KernelTime LARGE_INTEGER <>
ProcessName UNICODE_STRING <>
BasePriority SDWORD ?
ProcessId DWORD ?
InheritedFromProcessId DWORD ?
HandleCount DWORD ?
Reserved2 DWORD 2 dup(?)
VmCounters VM_COUNTERS <>
IoCounters IO_COUNTERS <>
Threads SYSTEM_THREADS <>
SYSTEM_PROCESSES ENDS
NextEntryDelta - это указатель на следующую структуру!
Есть ещё EnumProcesses...
Цитата:
Это делается так: ...
Ну ты и загнул! Человек на С++ пишет, причём в Бильдере, а ты ему Ассемблер. :D
Цитата: MurzET
Никак не могу найти информацию о работе с процессами .
Меня интересуют следующие вопросы:
1) Как вывести на экран ( Работаю в Borland C++ Builder 6 ) информацию о всех процессах, запущенных в системе .
2) Как узнать адрес первой и последней ячеек памяти, занимаемой процессом?
P.S: Только ради Бога, не отсылайте меня к Рихтеру . Его пример у меня не работает .
Меня интересуют следующие вопросы:
1) Как вывести на экран ( Работаю в Borland C++ Builder 6 ) информацию о всех процессах, запущенных в системе .
2) Как узнать адрес первой и последней ячеек памяти, занимаемой процессом?
P.S: Только ради Бога, не отсылайте меня к Рихтеру . Его пример у меня не работает .
Тут всё просто. в первом случае есть замечательная апишка ZwQuerySystemInformation с флагом SystemProcessesAndThreadsInformation. Она выдаст пиды, имена, потоки всех процессов. Что касается памяти - тут можно обычным перебором (типа ReadProcessMemory) либо просмотреть страницы данного процесса - там тоже какая-то апишка есть.