Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как получить идентификаторы потоков одного процесса под NT ;? [D5, NT4, Win2k, WinXP]


zhmax ©   (2002-04-08 14:43:00) 

Как получить идентификаторы потоков одного процесса под NT ?
По моему мнению, PSAPI не способна это сделать. Тогда как ?
Ведь под W95,98 это сделать можно.
Посоветуйте.


Fellomena   (2002-04-11 12:14:00) [1]

2 Виктор Щербаков © (09.04.02 16:58):
В Win2000 при определении некоторых имён модулей, загруженных выбранным процессом выводились "левые" символы, а не имена файлов.
Это имело место для некоторых процессов - не для всех.
И с путём та же история, что у тебя.


Виктор Щербаков   (2002-04-09 16:58:00) [2]

.
> у меня возникали некоторые "глюки" при попытках получения
> имён модулей,

А какие именно глюки???

Насчет модулей, не знаю, а вот имена exe-шника в Win2k, полученные с помощью Process32First/Process32Next не содержат путей к ним. И права доступа на это никак не влияют.


Fellomena   (2002-04-09 15:46:00) [3]

Кстати, не советовала бы использовать под Win2000 и XP ToolHelp - у меня возникали некоторые "глюки" при попытках получения имён модулей, загруженных данным процессом.
Возможно это как-то связанно с правами доступа,... хотя не думаю, т.к. запускала из под root-а.
Ну это так... на всякий случай...


zhmax   (2002-04-09 15:40:00) [4]

Спасибо большое ! я очень рад, что есть еще люди, делящиеся своими знаниями бесплатно и от души ...
спасибо !


Fellomena   (2002-04-09 15:29:00) [5]

Для NT и WIN2k:

NTSTATUS NtQuerySystemInformation (
IN SYSTEM_INFORMATION_CLASS SystemInformationClass,
OUT PVOID SystemInformation,
IN ULONG SystemInformationLength,
OUT PULONG ReturnLength OPTIONAL);

где SystemInformationClass – код запроса, SystemInformation -указатель на
буфер для данных, SystemInformationLength – размер буфера, ReturnLength –
размер записанных в буфер данных. Если выделенный буфер мал, то в
параметре ReturnLength функция возвратит необходимый размер буфера.

Так выглядит структура информации для процессов. В
конце блока информации о процессе идет информация о потоках процесса.


typedef struct _SYSTEM_INFORMATION_CLASS {

ULONG NextEntryOffset;

ULONG NumberOfThreads;

LARGE_INTEGER SpareLi1;

LARGE_INTEGER SpareLi2;

LARGE_INTEGER SpareLi3;

LARGE_INTEGER CreateTime;

LARGE_INTEGER UserTime;

LARGE_INTEGER KernelTime;

UNICODE_STRING ImageName;

KPRIORITY BasePriority;

HANDLE UniqueProcessId;

HANDLE InheritedFromUniqueProcessId;

ULONG HandleCount;

ULONG SpareUl2;

ULONG SpareUl3;

ULONG PeakVirtualSize;

ULONG VirtualSize;

ULONG PageFaultCount;

ULONG PeakWorkingSetSize;

ULONG WorkingSetSize;

ULONG QuotaPeakPagedPoolUsage;

ULONG QuotaPagedPoolUsage;

ULONG QuotaPeakNonPagedPoolUsage;

ULONG QuotaNonPagedPoolUsage;

ULONG PagefileUsage;

ULONG PeakPagefileUsage;

ULONG PrivatePageCount;

SYSTEM_THREAD_INFORMATION TH[1];


} SYSTEM_INFORMATION_CLASS, *PSYSTEM_INFORMATION_CLASS;

Структура буфера, содержащего информацию о модулях такова:

typedef struct _DEBUGMODULEINFO
{
DWORD ImageBase; адрес загрузки модуля в память
DWORD ImageSize; размер файла модуля
DWORD unknown1;
USHORT DllSequenceNum; если равен 0, то это EXE-файл
USHORT NumDlls; порядковый номер модуля
DWORD GrantedAccess; допуск на доступ
CHAR Name[_MAX_PATH]; имя модуля
DWORD unknown;
}
DEBUGMODULEINFO,PDEBUGMODULEINFO;


troits   (2002-04-09 15:25:00) [6]

Для XP должен работать ToolHelp
Для NT посмотри статью , где рассматривается ф-я ZwQuerySystemInformation

http://www.rsdn.ru/qna/?baseserv/enumproc.xml


zhmax   (2002-04-09 15:10:00) [7]

Уже проверил, действительно работает.
Приношу свои извинения.
Но как быть с XP или NT4_0 ??????


troits   (2002-04-09 15:07:00) [8]

Вот код - у меня под Win2k все работает

var
Hndl: THandle;
THREADENTRY32: tagTHREADENTRY32;
begin
THREADENTRY32.dwSize := SizeOf(tagTHREADENTRY32);
Hndl := CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
Thread32First(Hndl, THREADENTRY32);
Writeln("ProcessID: ", THREADENTRY32.th32OwnerProcessID, " ThreadID: ", THREADENTRY32.th32ThreadID);
while Thread32Next(Hndl, THREADENTRY32) do
Writeln("ProcessID: ", THREADENTRY32.th32OwnerProcessID, " ThreadID: ", THREADENTRY32.th32ThreadID);
readln
end;


zhmax   (2002-04-09 14:56:00) [9]

Проверял, работают процессы, модули, кучи. Потоки - нет !
Что делать ?


troits   (2002-04-09 14:36:00) [10]

Под 2000 работают ToolHelp - ф-ции.


zhmax   (2002-04-09 13:56:00) [11]

и так, и так и эдак. приму все варианты, так сказать.
Но больше ориентируюсь под NT4.0 и W2000.
Если можно, подробнее ...


Fellomena   (2002-04-09 10:34:00) [12]

Тебе под Win2k или XP надо ? Или под NT4 ?


zhmax   (2002-04-09 08:42:00) [13]

ну подскажите, плииз.


zhmax   (2002-04-08 16:15:00) [14]

неужели никто не знает ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо