djmans Не совсем понятен вопрос твой вопрос. ResumeThread вообще вызывать не стоит, если до этого не вызывал SuspendThread. А если вызывал, то в чём опастность может быть, по твоему? Попробую в телепата поиграть Если ты боишься, что вызвав пару SuspendThread|ResumeThread для потока, который уже Suspend, ты его запустишь, то зря. Т.к.
ну допустим процесс A засуспендил зачемто свой поток t1, и тут процесс B врываеца и суспендид поток t1, что-то делает с ним и рассуспендивает. Дык вот в такой ситуации опасен ли вприцпе ResumeThread(хотя я сам себя уже не понел) из потока B. Или как можно универсально для всей ветки 2k+ узнать состояние потока?
djmans Если ты сначала суспендишь поток, а затем резъюмишь, то сам по себе Resume не опасен, т.к. при этом соблюдается баланс инк\дек suspend-count. Опасны могут быть только твои манипуляции с контекстом потока Универсального средства узнать, что поток suspended или в принципе не существует или оно бесполезно, т.к. после того как ты узнал, что поток спит, он в любой момент может проснуться, если ему не сделать еще один suspend
Если поток небыл остановлен, то ETHREAD.Tcb.SuspendCount = 0 и при вызове NtResumeThread(->KeResumeThread) ничего не происходит с потоком. В ядре проверка на ноль. Юзать это безопасно, конечно если ненадолго, поток может ждать обьект. Состояние потока определяется из NtQuerySystemInformation(SystemProcessesAndThreadsInformation), SYSTEM_THREAD_INFORMATION.State и WaitReason. SuspendCount - возвращает NtSuspendThread.