Thread32First / Thread32Next :: приколы

Тема в разделе "WASM.WIN32", создана пользователем _DEN_, 11 янв 2005.

  1. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Как странно работает поиск потоков. Во-первых, для какого бы процесса мы не сделали снапшот, Thread32First / Thread32Next всеравно выдаст список всех потоков в системе. Далее, поле THREADENTRY32::tpBasePri может быть не только



    <ul type=disc>THREAD_PRIORITY_IDLE

    THREAD_PRIORITY_LOWEST

    THREAD_PRIORITY_BELOW_NORMAL

    THREAD_PRIORITY_NORMAL

    THREAD_PRIORITY_ABOVE_NORMAL

    THREAD_PRIORITY_HIGHEST

    THREAD_PRIORITY_TIME_CRITICAL</ul>



    как сказано в MSDN, но и еще хрен знает чем. Прокоментируйте, кто в курсе.
     
  2. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    Ты бы еще большее старье юзал, млин. PSAPI надо использовать. А для работы с потоками, вообще NtQueryInformation. И комментировать тут нечего, вторые упаковищики читать и Неббета, там все написано.
     
  3. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    _DEN_

    всеравно выдаст список всех потоков в системе

    В справке, к CreateToolhelp32Snapshot, этот факт освещен: "To identify the threads that belong to a specific process, compare its process identifier to the th32OwnerProcessID member of the THREADENTRY32 structure when enumerating the threads".



    поле THREADENTRY32::tpBasePri может быть ... хрен знает чем

    Конкретнее.
     
  4. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    q_q





    WinXP без протезов, build 2600, процесс EXPLORER.EXE, приоритеты потоков:


    Код (Text):
    1. 1480
    2. 1636
    3. 1640
    4. 1644
    5. 1648
    6. 1684
    7. THREAD_PRIORITY_TIME_CRITICAL
    8. 1712
    9. 968
    10. 1728
    11. 1156
    12. 1936


    Вот что сия хрень значит?



    volodya

    Я тоже рад тебя видеть :) А как же MSDN? У меня ему еще и пол года не исполнилось. А как же совместимость?
     
  5. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    volodya



    Ты бы еще большее старье юзал, млин. PSAPI надо использовать. А для работы с потоками, вообще NtQueryInformation.



    Че-то ты гонишь, порутчик. kernel32.dll импортирует только ntdll.dll и работы с процессами, потоками и остальными прелестями через NtXXX и делаются. Комментарии?
     
  6. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    volodya

    Да и psapi.dll тоже юзает только ntdll.dll и kernel.dll. Не могут же ntdll-евские функции работать по разному, в зависимости от того где их юзают? :derisive: Или может у psapi.dll есть участки кода, работающие в режиме ядра? :derisive:
     
  7. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    _DEN_

    Что-то у тебя цифры странные.

    Попробовал на 2k_sp4, xppro_sp1 и xppro_sp2.

    Действительно есть "недокументированные", только у меня 8, 9, 10, THREAD_PRIORITY_TIME_CRITICAL и THREAD_PRIORITY_ABOVE_NORMAL.
     
  8. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    q_q

    Ну может я конечно в четырех строках пять ошибок сделал...


    Код (Text):
    1. vector <THREADENTRY32> TE32;
    2. THREADENTRY32 te32;
    3. te32.dwSize=sizeof(THREADENTRY32);
    4. HANDLE hSnapshot=CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD,0);
    5. if(hSnapshot!=INVALID_HANDLE_VALUE)
    6. {
    7.   if(Thread32First(hSnapshot,&te32))
    8.     do
    9.       if(te32.th32OwnerProcessID==th32ProcessID)
    10.         TE32.push_back(te32);
    11.     while(Thread32Next(hSnapshot,&te32));
    12.   CloseHandle(hSnapshot);
    13. }


    Не на STL же списывать...
     
  9. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    q_q

    Мать моя женщина... Извиняюсь за поспешные выводы. Вот я тупой урод! :) Читаю приоритеты я правильно. Вывожу неправильно :) Все, пофиксил, только у меня всеравно 90% потоков имеют "недокументированные" приоритеты.

    Численная величина токена говорит о "приоритетности" ?
     
  10. Broken Sword

    Broken Sword Robert

    Публикаций:
    0
    Регистрация:
    30 авг 2002
    Сообщения:
    433
    блин вот вы гоните!



    THREAD_PRIORITY_IDLE equ -15

    THREAD_PRIORITY_LOWEST equ -2

    THREAD_PRIORITY_BELOW_NORMAL equ -1

    THREAD_PRIORITY_NORMAL equ 0

    THREAD_PRIORITY_ABOVE_NORMAL equ 1

    THREAD_PRIORITY_HIGHEST equ 2

    THREAD_PRIORITY_TIME_CRITICAL equ 15



    комментарии нужны?
     
  11. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Broken Sword

    вы гоните!

    Объяснись.



    Тестовый код и выхлоп в аттаче.



    [​IMG] _1799188685__foo.rar
     
  12. Broken Sword

    Broken Sword Robert

    Публикаций:
    0
    Регистрация:
    30 авг 2002
    Сообщения:
    433
    q_q

    объясняюсь: всего приоритетов у потоков может быть 31 различных (от -15 до +15). Официальные имена есть только у 7 из них. Остальные лежат между ними по приорететности. Например, 8 - нечто среднее между THREAD_PRIORITY_HIGHEST и THREAD_PRIORITY_TIME_CRITICAL.
     
  13. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Broken Sword

    Теперь ясно :)

    И все же, почему сабж всегда выдает все потоки системы?
     
  14. Broken Sword

    Broken Sword Robert

    Публикаций:
    0
    Регистрация:
    30 авг 2002
    Сообщения:
    433
    сабж выдает все потоки? ну незнаю, так и в msdn написано -Retrieves information about the first thread of any process encountered in a system snapshot.