Приостановка тредов :: приостанавливаю все треды, но что то не так

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

Статус темы:
Закрыта.
  1. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    Код (Text):
    1. void SuspendResumeAllThreads(BOOL Suspend)
    2. //Suspending/Resuming all threads
    3. {
    4.     HANDLE hProcessSnap;
    5.     HANDLE hProcess;
    6.     PROCESSENTRY32 pe32;
    7.     HANDLE hThreadSnap;
    8.     THREADENTRY32 te32;
    9.     HANDLE hThread;
    10.  
    11.     hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    12.     pe32.dwSize = sizeof(PROCESSENTRY32);
    13.     Process32First(hProcessSnap, &pe32);
    14.     do
    15.     {
    16.         hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pe32.th32ProcessID);
    17.         if(hProcess)
    18.         {
    19.             hThreadSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, pe32.th32ProcessID);
    20.             if(INVALID_HANDLE_VALUE==hThreadSnap) continue;
    21.             te32.dwSize = sizeof(THREADENTRY32);
    22.             Thread32First(hThreadSnap, &te32);
    23.             do
    24.             {
    25.                 if(te32.th32ThreadID != GetCurrentThreadId() && te32.th32OwnerProcessID != GetCurrentProcessId())
    26.                 {
    27.                     hThread = OpenThread(THREAD_SUSPEND_RESUME, 0, te32.th32ThreadID);
    28.                     if(hThread)
    29.                         Suspend ? SuspendThread(hThread) : ResumeThread(hThread);
    30.                     CloseHandle(hThread);
    31.                 }
    32.             }
    33.             while(Thread32Next(hThreadSnap, &te32));
    34.             CloseHandle(hThreadSnap);
    35.         }
    36.     }while(Process32Next(hProcessSnap, &pe32));
    37.     CloseHandle(hProcessSnap);
    38. }
    походу останавливается все, хотя нужно чтобы останавливалось все кроме моего потока

    Код (Text):
    1. //...
    2. SuspendResumeAllThreads(TRUE);
    3. SuspendResumeAllThreads(FALSE);
    4. //...
     
  2. W4FhLF

    W4FhLF New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    1.050
    почему "!="?
     
  3. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    Если это не текущий поток и не текущего процесса - то приостанавливаю

    что то не так написал?
     
  4. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    UTeX
    Возможно приостанавливается что-то важное для функционирования системы. А так вроде свой поток останавливаться не должен. Можно попробовать поостанавливать выборочно. Я бы не советовал так делать с процессами чей приоритет выше нормального (taskmgr например), а также с системными.
     
  5. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    Странно не слыхал о таком.
     
  6. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Если бы остановился данный поток, то он не продолжил своего выполнения, и остальные процессы бы не остановились. Так что он то не останавливается, а останавливается всё остальное.
     
  7. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    Booster

    ниче не понял ))

    помогите проблемку решить
     
  8. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Думаю надо отсеивать потоки с высоким приоритетом, его возвращает Process32Next.
    Ну и отсеивать системные потоки.
    Здесь есть пример получения имени:http://i2r.ru/static/374/out_15681.shtml
     
  9. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    Ну а если мне нужно перехват некоторых функций сделать? С помощью сплайсинга. Как же я могу откидывать процессы если перехват нужно установить везде?

    Подскажите кто нибудь?

    Я прочитал статью Bill/TPOC

    там подобный код
    но только

    почему, не могу понять


     
  10. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    Просто если использовать код в таком виде, то потоки явно не останавливаются
     
  11. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    UTeX
    Не знаю, но по идее если останавливать, потом что-то делать, и затем снова возобновлять то по идее должно быть нормально.
     
  12. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    Booster
    Придется так переписывать, хотя так мне юзать не очень удобно
     
  13. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    Помогите кто-нибудь ((
     
  14. k3internal

    k3internal New Member

    Публикаций:
    0
    Регистрация:
    11 янв 2007
    Сообщения:
    607
    UTeX
    возьми сорцы Рэма и нимучай %*(;%№. Кроме того, для NT систем не совсем подходящще юзать ToolHelp32, об этом ещё у дядьки Руссиновича написано) Есть Таккая ZwQuerySystemInformation.
     
  15. calidus

    calidus Member

    Публикаций:
    0
    Регистрация:
    27 дек 2005
    Сообщения:
    618
    Код (Text):
    1. Пример:
    2. ;Возобновление всех потоков
    3. ResumeThreads proc
    4.     invoke GetModuleHandle,offset kern
    5.     invoke GetProcAddress,eax,offset OpenThreadStr
    6.     mov _OpenThread,eax
    7.     invoke GetCurrentThreadId
    8.     mov CurrThread,eax
    9.     invoke GetCurrentProcessId
    10.     mov CurrProcess,eax
    11.  
    12.     invoke CreateToolhelp32Snapshot,TH32CS_SNAPTHREAD,0
    13.     .if eax==-1
    14.         xor eax,eax
    15.         ret
    16.     .endif
    17.     mov hSnap,eax
    18.     mov Thread.dwSize,sizeof THREADENTRY32
    19.     invoke Thread32First,hSnap,offset Thread
    20.     .if eax==0
    21.         xor eax,eax
    22.         ret
    23.     .endif
    24. NextThread:
    25.     mov eax,CurrThread
    26.     mov edx,CurrProcess
    27.     .if (Thread.th32ThreadID!=eax)&&(Thread.th32OwnerProcessID==edx)
    28.         push Thread.th32ThreadID
    29.         push NULL
    30.         push THREAD_SUSPEND_RESUME
    31.         call _OpenThread
    32.         mov ThreadHandle,eax
    33.         .if ThreadHandle>0
    34.             invoke ResumeThread,ThreadHandle
    35.             invoke CloseHandle,ThreadHandle
    36.         .endif
    37.     .endif
    38.     invoke Thread32Next,hSnap,offset Thread
    39.     .if eax!=0
    40.         jmp NextThread
    41.     .endif
    42.     invoke CloseHandle,hSnap
    43.     ret
    44. ResumeThreads endp
    45.  
    46.  
    47. ;Приостановка всех потоков, кроме вызывающего
    48. SuspendThreads proc
    49.     invoke GetModuleHandle,offset kern
    50.     invoke GetProcAddress,eax,offset OpenThreadStr
    51.     mov _OpenThread,eax
    52.     invoke GetCurrentThreadId
    53.     mov CurrThread,eax
    54.     invoke GetCurrentProcessId
    55.     mov CurrProcess,eax
    56.  
    57.     invoke CreateToolhelp32Snapshot,TH32CS_SNAPTHREAD,0
    58.     .if eax==-1
    59.         xor eax,eax
    60.         ret
    61.     .endif
    62.     mov hSnap,eax
    63.     mov Thread.dwSize,sizeof THREADENTRY32
    64.     invoke Thread32First,hSnap,offset Thread
    65.     .if eax==0
    66.         xor eax,eax
    67.         ret
    68.     .endif
    69. NextThread:
    70.     mov eax,CurrThread
    71.     mov edx,CurrProcess
    72.     .if (Thread.th32ThreadID!=eax)&&(Thread.th32OwnerProcessID==edx)
    73.         push Thread.th32ThreadID
    74.         push NULL
    75.         push THREAD_SUSPEND_RESUME
    76.         call _OpenThread
    77.         mov ThreadHandle,eax
    78.         .if ThreadHandle>0
    79.             invoke SuspendThread,ThreadHandle
    80.             invoke CloseHandle,ThreadHandle
    81.         .endif
    82.     .endif
    83.     invoke Thread32Next,hSnap,offset Thread
    84.     .if eax!=0
    85.         jmp NextThread
    86.     .endif
    87.     invoke CloseHandle,hSnap
    88.     ret
    89. SuspendThreads endp
     
  16. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    k3internal
    насчет ZwQuerySystemInformation я понимаю. Но почему же в статье Bill/TPOC написан такой код? Неужели никто его не проверял? ведь не работает. Ппц.
    calidus
    не понял прикола.)) ты мне советуешь нерабочий код? попробовать еще раз? думаю нет смысла, т к в принципе нет смысла в этом условии
    .if (Thread.th32ThreadID!=CurrThread)&&(Thread.th32OwnerProcessID==CurrProcess)
    т е если это текущий процесс и не текущий поток, то мы останавливаем поток)), в чем прикол
    остановятся все потоки текущего процесса кроме потока останавливающего. В чем смысл?
    Если я не прав - обьясните в чем.
     
  17. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    хендл процесса не закрываешь.
    условие вообще корявое. код пропустит поток который находится в другом процессе но TID равен твоему. а по идее должен саспендить.
     
  18. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    Ну я закрыл. Как зависало все так и зависает для моего случая((

    if(te32.th32ThreadID != GetCurrentThreadId() && te32.th32OwnerProcessID != GetCurrentProcessId())

    что не так в этом условии?
    почему все потоки саспендятся но не возобновляются?
     
  19. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    UTeX
    Берёшь, запускаешь notepad.exe. В своей проге ищешь его пид и саспендишь только его потоки. Берёь отладчик и отлаживаешь это дело до полного просветления, пока не засаспендишь и потом не зарезюмишь всё что надо. Потом пытаеься саспендить все процессы. Поими что всем просто влом код компилить. Может у тебя зараза какая где нибудь нагадила, и что-то портит.
     
  20. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    asd
    я и не прошу ниче компилить ))
     
Статус темы:
Закрыта.