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

ВАШАТА ОЦЕНКА ЗА СТАТИЯТА =>
1 Star2 Stars3 Stars4 Stars5 Stars (17 votes, average: 5.00 out of 5)
Loading ... Loading ...

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 Print This Post Видяна 402 път(и) Email This Post Email This Post

1 Comment so far »

  1. peter said

    am December 20 2009 @ 23:45

    Има!

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

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

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

Comment RSS · TrackBack URI

Leave a comment

Name: (Required)

eMail: (Required)

Website:

Comment: