приветсвую всех! вот кусок кода: (можно сказать: от Ms-REM, а можно сказать: из примеров М$) Код (Text): invoke CreateToolhelp32Snapshot, TH32CS_SNAPTHREAD , NULL cmp eax, INVALID_HANDLE_VALUE je out mov dword [TThreadEntry32.dwsize], size invoke Thread32First, eax, TThreadEntry32 структура TThreadEntry32 описана по M$ Код (Text): TThreadEntry32: .dwsize dd ? .cntUsage dd ? .th32ThreadID dd ? .th32OwnerProcessID dd ? .tpBasePri dd ? .tpDeltaPri dd ? .dwFlags dd ? ends size = $ - TThreadEntry32 проблема в Thread32First.. после выполнения в EAX 1 и LastErr ERROR_SUCCESS (00000000) но в TThreadEntry32 пусто.. кроме значения TThreadEntry32.dwsize Код (Text): 00402050 1C 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ............... 00402060 00 00 00 00 00 00 00 00 00 00 00 00 ............ может кто знает: в чем дело? ps/ ос - w2k
и куда прикажете PID воткнуть?? Код (Text): HANDLE WINAPI CreateToolhelp32Snapshot( DWORD dwFlags, DWORD th32ProcessID ); 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. и примерно так же далее Код (Text): BOOL WINAPI Thread32First( HANDLE hSnapshot, LPTHREADENTRY32 lpte ); hSnapshot [in]Handle to the snapshot returned from a previous call to the CreateToolhelp32Snapshot function. могу добавить вот еще что: если код разместить в процедуре и ее через CreateThread выполнить - после Thread32First EAX так же будет 1, но GetLastError вернет код 715...
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, в лучшую сторону ничего не измениться: структура не заполняется.
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."
n0name Код (Text): 00401000 >/$ 6A 00 PUSH 0 ; /ProcessID = 0 00401002 |. 6A 04 PUSH 4 ; |Flags = TH32CS_SNAPTHREAD 00401004 |. FF15 8E404000 CALL DWORD PTR [<&KERNEL32.CreateToolhelp32Sna>; \CreateToolhelp32Snapshot 0040100A |. 83F8 FF CMP EAX, -1 0040100D |. C705 50204000 1C000000 MOV DWORD PTR [402050], 1C 00401017 |. A3 40204000 MOV DWORD PTR [402040], EAX 0040101C |. 68 50204000 PUSH 00402050 ; /pThreadentry = 00402050 00401021 |. FF35 40204000 PUSH DWORD PTR [402040] ; |hSnapshot = 0000003C (window) 00401027 |. FF15 AA404000 CALL DWORD PTR [<&KERNEL32.Thread32First>] ; \Thread32First 0040102D |. 68 50204000 PUSH 00402050 ; /pThreadentry = 00402050 00401032 |. FF35 40204000 PUSH DWORD PTR [402040] ; |hSnapshot = 0000003C (window) 00401038 |. FF15 AE404000 CALL DWORD PTR [<&KERNEL32.Thread32Next>] ; \Thread32Next 00402050 1C 00 00 00 00 00 00 00 04 00 00 00 08 00 00 00 ............. 00402060 00 00 00 00 00 00 00 00 00 00 00 00 ............ 0040103E |. FF15 9A404000 CALL DWORD PTR [<&KERNEL32.GetCurrentThreadId>>; [GetCurrentThreadId EAX 00000284 00401044 |. FF15 96404000 CALL DWORD PTR [<&KERNEL32.GetCurrentProcessId>; [GetCurrentProcessId EAX 0000029C что соответствует системному PID=668 dec. после hread32Next заполняются как видим два поля в структуре: th32ThreadID и th32OwnerProcessID но на правду это не похоже GetLastError ERROR_SUCCESS (00000000) и EAX = 1 IceStudent ну почему же?! гм.. ты, конечно, прав.. это действительно будет ответом.. если получить валидную структуру TThreadEntry32..
Thread32First() тоже вернула пустую структуру. однако Thread32Next в цикле отрабатывают весьма корректно. PS: а почему не похоже на правду? PID = 4 и TID = 8 нормальные значение. а остальные поля не заполнены, тк это поток системы, и твоему приложению не хватает прав.
Код (Text): TThreadEntry32: .dwsize dd ? .cntUsage dd ? .th32ThreadID dd ? .th32OwnerProcessID dd ? .tpBasePri dd ? .tpDeltaPri dd ? .dwFlags dd ? ends size = $ - TThreadEntry32 Ты уверен, что в данном случае верно определяется размер?
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 что не совпадает с данными структуры.. тем более что это я пробовал из самого же приложения, а это не системный поток или я ошибаюсь?! привилегии .... интересная мысль .. подумаю..
DMD Тебе возвращают потоки всех процессов, поэтому чтобы получить потоки твоего процесса, ты должен фильтровать полученное. Т.о., вторая часть твоего поста #12 не корректна.