просмотр потоков процесса

Тема в разделе "WASM.WIN32", создана пользователем DMD, 27 ноя 2007.

  1. DMD

    DMD Member

    Публикаций:
    0
    Регистрация:
    21 ноя 2005
    Сообщения:
    56
    приветсвую всех!

    вот кусок кода:
    (можно сказать: от Ms-REM, а можно сказать: из примеров М$)
    Код (Text):
    1.          invoke    CreateToolhelp32Snapshot, TH32CS_SNAPTHREAD , NULL
    2.          cmp       eax, INVALID_HANDLE_VALUE
    3.          je        out
    4.          mov       dword [TThreadEntry32.dwsize], size
    5.          invoke    Thread32First, eax, TThreadEntry32
    структура TThreadEntry32 описана по M$
    Код (Text):
    1.       TThreadEntry32:
    2.          .dwsize             dd  ?
    3.          .cntUsage           dd  ?
    4.          .th32ThreadID       dd  ?
    5.          .th32OwnerProcessID dd  ?
    6.          .tpBasePri          dd  ?
    7.          .tpDeltaPri         dd  ?
    8.          .dwFlags            dd  ?
    9.       ends
    10.  
    11.     size  = $ - TThreadEntry32
    проблема в Thread32First.. после выполнения в EAX 1 и LastErr ERROR_SUCCESS (00000000)
    но в TThreadEntry32 пусто.. кроме значения TThreadEntry32.dwsize
    Код (Text):
    1. 00402050  1C 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ...............
    2. 00402060  00 00 00 00 00 00 00 00 00 00 00 00              ............
    может кто знает: в чем дело?

    ps/ ос - w2k
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    дык ты PID процесса укажи
     
  3. DMD

    DMD Member

    Публикаций:
    0
    Регистрация:
    21 ноя 2005
    Сообщения:
    56
    и куда прикажете PID воткнуть??

    Код (Text):
    1. HANDLE WINAPI CreateToolhelp32Snapshot(
    2.   DWORD dwFlags,
    3.   DWORD th32ProcessID
    4. );
    5. th32ProcessID
    6. [in] Process identifier. This parameter can be zero to indicate the current process.
    7. This parameter is used when TH32CS_SNAPHEAPLIST or TH32CS_SNAPMODULE is specified.
    8. Otherwise, it is ignored.
    и примерно так же далее

    Код (Text):
    1. BOOL WINAPI Thread32First(
    2.   HANDLE hSnapshot,
    3.   LPTHREADENTRY32 lpte
    4. );
    5. hSnapshot
    6. [in]Handle to the snapshot returned from a previous call to
    7. the CreateToolhelp32Snapshot function.
    могу добавить вот еще что:
    если код разместить в процедуре и ее через CreateThread выполнить - после Thread32First
    EAX так же будет 1, но GetLastError вернет код 715...
     
  4. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    В CreateToolhelp32Snapshot.
     
  5. DMD

    DMD Member

    Публикаций:
    0
    Регистрация:
    21 ноя 2005
    Сообщения:
    56
    IceStudent

    еще раз готов процитировать:
    CreateToolhelp32Snapshot

    th32ProcessID
    [in] Process identifier. This parameter can be zero to indicate the current process.
    This parameter is used when TH32CS_SNAPHEAPLIST or TH32CS_SNAPMODULE is specified.
    Otherwise, it is ignored.

    И даже если последовать совету указать в CreateToolhelp32Snapshot PID, в лучшую сторону ничего не измениться: структура не заполняется.
     
  6. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    а Thread32Next как себя ведет после Thread32First?
     
  7. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    DMD
    А, ошибся чуть. Но и ты невнимательно читаешь доку: "This parameter is used when TH32CS_SNAPHEAPLIST or TH32CS_SNAPMODULE is specified... Otherwise, it is ignored and all processes are included in the snapshot."

    И ответ на твою задачу: "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."
     
  8. DMD

    DMD Member

    Публикаций:
    0
    Регистрация:
    21 ноя 2005
    Сообщения:
    56
    n0name

    Код (Text):
    1. 00401000 >/$ 6A 00                    PUSH    0                                         ; /ProcessID = 0
    2. 00401002  |. 6A 04                    PUSH    4                                         ; |Flags = TH32CS_SNAPTHREAD
    3. 00401004  |. FF15 8E404000            CALL    DWORD PTR [<&KERNEL32.CreateToolhelp32Sna>; \CreateToolhelp32Snapshot
    4. 0040100A  |. 83F8 FF                  CMP     EAX, -1
    5. 0040100D  |. C705 50204000 1C000000   MOV     DWORD PTR [402050], 1C
    6. 00401017  |. A3 40204000              MOV     DWORD PTR [402040], EAX
    7. 0040101C  |. 68 50204000              PUSH    00402050                                  ; /pThreadentry = 00402050
    8. 00401021  |. FF35 40204000            PUSH    DWORD PTR [402040]                        ; |hSnapshot = 0000003C (window)
    9. 00401027  |. FF15 AA404000            CALL    DWORD PTR [<&KERNEL32.Thread32First>]     ; \Thread32First
    10. 0040102D  |. 68 50204000              PUSH    00402050                                  ; /pThreadentry = 00402050
    11. 00401032  |. FF35 40204000            PUSH    DWORD PTR [402040]                        ; |hSnapshot = 0000003C (window)
    12. 00401038  |. FF15 AE404000            CALL    DWORD PTR [<&KERNEL32.Thread32Next>]      ; \Thread32Next
    13.  
    14. 00402050  1C 00 00 00 00 00 00 00 04 00 00 00 08 00 00 00  .............
    15. 00402060  00 00 00 00 00 00 00 00 00 00 00 00              ............
    16.  
    17.  
    18. 0040103E  |. FF15 9A404000            CALL    DWORD PTR [<&KERNEL32.GetCurrentThreadId>>; [GetCurrentThreadId
    19.  
    20. EAX 00000284
    21.  
    22. 00401044  |. FF15 96404000            CALL    DWORD PTR [<&KERNEL32.GetCurrentProcessId>; [GetCurrentProcessId
    23.  
    24. EAX 0000029C
    что соответствует системному PID=668 dec.

    после hread32Next заполняются как видим два поля в структуре:
    th32ThreadID и th32OwnerProcessID но на правду это не похоже
    GetLastError ERROR_SUCCESS (00000000) и EAX = 1

    IceStudent
    ну почему же?!
    гм.. ты, конечно, прав.. это действительно будет ответом.. если получить валидную структуру TThreadEntry32..
     
  9. DMD

    DMD Member

    Публикаций:
    0
    Регистрация:
    21 ноя 2005
    Сообщения:
    56
    Что? никаких мыслей по поводу высказанного нет?
     
  10. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Thread32First() тоже вернула пустую структуру. однако Thread32Next в цикле отрабатывают весьма корректно.
    PS: а почему не похоже на правду? PID = 4 и TID = 8 нормальные значение. а остальные поля не заполнены, тк это поток системы, и твоему приложению не хватает прав.
     
  11. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    Код (Text):
    1. TThreadEntry32:
    2.          .dwsize             dd  ?
    3.          .cntUsage           dd  ?
    4.          .th32ThreadID       dd  ?
    5.          .th32OwnerProcessID dd  ?
    6.          .tpBasePri          dd  ?
    7.          .tpDeltaPri         dd  ?
    8.          .dwFlags            dd  ?
    9.       ends
    10.  
    11.     size  = $ - TThreadEntry32
    Ты уверен, что в данном случае верно определяется размер?
     
  12. DMD

    DMD Member

    Публикаций:
    0
    Регистрация:
    21 ноя 2005
    Сообщения:
    56
    Twister
    не на 100% но почти...
    при экспериментах увеличения указанного размера - ошибка при Thread32First invalid size...

    n0name
    потому что
    0040103E |. FF15 9A404000 CALL DWORD PTR [<&KERNEL32.GetCurrentThreadId>>; [GetCurrentThreadId

    EAX 00000284

    00401044 |. FF15 96404000 CALL DWORD PTR [<&KERNEL32.GetCurrentProcessId>; [GetCurrentProcessId

    EAX 0000029C

    что не совпадает с данными структуры..
    тем более что это я пробовал из самого же приложения, а это не системный поток
    или я ошибаюсь?!

    привилегии .... интересная мысль .. подумаю..
     
  13. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    DMD
    Тебе возвращают потоки всех процессов, поэтому чтобы получить потоки твоего процесса, ты должен фильтровать полученное. Т.о., вторая часть твоего поста #12 не корректна.
     
  14. DMD

    DMD Member

    Публикаций:
    0
    Регистрация:
    21 ноя 2005
    Сообщения:
    56
    IceStudent
    Ай молодца! Браво! Заработало!

    n0name
    и тебе - спасибо!