Безумната комбинация CreateToolhelp32Snapshot + TH32CS_SNAPTHREAD
| ВАШАТА ОЦЕНКА ЗА СТАТИЯТА => |
CreateToolhelp32Snapshot е основна функция що се отнася до изброяване на процеси, модули, нишки и heap-ове. В MSDN тя е дефинирана така:
HANDLE WINAPI CreateToolhelp32Snapshot(
__in DWORD dwFlags,
__in DWORD th32ProcessID
);
Най-просто казано първият параметър указва каква информация ще се изисква, а вторият - процесът, за който се отнася въпросната информация.
Нека за момент си представим, че искате да получите списък с нишките, които принадлежат на даден процес. Необходимият флаг е TH32CS_SNAPTHREAD. По инерция въвеждате и идентификатора на процеса, който Ви интересува. Изпълнявате и ХОП - ИЗНЕНАДА! Сдобивате се със списък на всички активни в операционната система нишки (до които имате достъп), а не за конкретната програма?!?
Всъщност то си го и пише:
"... The TH32CS_SNAPTHREAD value always creates a system-wide snapshot even if a process identifier is passed to CreateToolhelp32Snapshot..."
[ http://msdn.microsoft.com/en-us/library/ms686313%28VS.85%29.aspx ]
"... Includes all threads in the system in the snapshot ..."
[ http://msdn.microsoft.com/en-us/library/ms682489%28VS.85%29.aspx ]
Задължение на програмиста било от торбата с нишките да извади тези, които го интересуват чрез бавните операции "итерация" и "условен преход":
do
{
if( te32.th32OwnerProcessID == dwOwnerPID )
{
printf( "\n\n THREAD ID = 0x%08X", te32.th32ThreadID );
printf( "\n base priority = %d", te32.tpBasePri );
printf( "\n delta priority = %d", te32.tpDeltaPri );
}
} while( Thread32Next(hThreadSnap, &te32 ) );
Пълно безумие...Ами ако в системата има над 1500 нишки и трябва периодично да се прави метрика на 900 от тях? Къде избяга производителността???
За съжаление не успях да открия къде точно се съхранява списъкът с нишките в системата. Очаквах това да е "per process" информация, какъвто е случая с модулите и heap-овете - те се съдържат в PEB (Process Environment Block) структурата. Това ме кара да мисля, че нишко-списъка е записан нейде по-централно?
Ако някой има инфо - нека пише![]()
Print This Post
|
Видяна 402 път(и) | Email This Post
|































peter said
am December 20 2009 @ 23:45
Има!
Има такава структура, виждал съм я.
Обаче е Кернел-базирана и постосмъртни нямат достъп до там. Дори и привилегирован процес не може да я достъпне. Единствения вариант е драйвер.
Има много подобни структури – за процеси, сокети, прозорци, дръжки (handles), и т.н.