Безумната комбинация 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) структурата. Това ме кара да мисля, че нишко-списъка е записан нейде по-централно?
Ако някой има инфо – нека пише 🙂

One thought on “Безумната комбинация CreateToolhelp32Snapshot + TH32CS_SNAPTHREAD

  1. Има!

    Има такава структура, виждал съм я.

    Обаче е Кернел-базирана и постосмъртни нямат достъп до там. Дори и привилегирован процес не може да я достъпне. Единствения вариант е драйвер.

    Има много подобни структури – за процеси, сокети, прозорци, дръжки (handles), и т.н.

Leave a Reply

Your email address will not be published. Required fields are marked *