Вроде SuspendThread, а вроде и нет...

Тема в разделе "WASM.WIN32", создана пользователем MoonShiner, 5 авг 2005.

  1. MoonShiner

    MoonShiner New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2004
    Сообщения:
    44
    Добрый день. Помогите пожалуйста разобраться со следующей проблемой: В контексте некоторого процесса имеется некоторый код (не поток!). Как и когда он туда попал - неважно. Смысл в том, что иногда он вызывается каким-либо (с равной вероятностью - любым) функционирующем в этом процессе потоком. В этом коде имеется определенная функция, выполнять которую необходимо при гарантии, что остальные потоки во время ее выполнения не будут шевелиться. Т.е. необходимо саспендить все незасаспенденные остальные потоки перед вызовом этой функции, и отпускать их после. Проблема в том, что по определенным причинам нежелательно получать список потоков и саспендить каждый в отдельности. Интересует вопрос, существуют ли какие-либо иные методы, позволяющие гарантированно вытеснить на время выполнения этой функции остальные потоки, чтобы планировщик не дал им работать? Желательно, чтобы это еще и побыстрее работало=) Вообще, какие существуют методы заморозки всех потоков кроме текущего в своем процессе?



    ЗЫ В ядро лазать нельзя!
     
  2. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    Повышай приоритет своего потока до реалтаймового.
     
  3. Artemy

    Artemy New Member

    Публикаций:
    0
    Регистрация:
    18 май 2005
    Сообщения:
    48
    Адрес:
    Russia


    Вашего процесса? Судя по фразе
    вы творите нечто несовсем легальное ;)

    Если так, то по-моему придется тормозить потоки по одиночке.

    Если же вы сами конструируете все вызывающие ваш код потоки, то воспользуйтесь mutex'ом
     
  4. SDragon

    SDragon New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2005
    Сообщения:
    133
    Адрес:
    Siberia
    Или критической секцией, а не mutex'ом. По информации Platform SDK критическая секция быстрее mutex'а, а других различий между ними для потоков одного процесса нет.
     
  5. MoonShiner

    MoonShiner New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2004
    Сообщения:
    44


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



    Легальное=) Определенные причины заключаются в том, что мой код будет вызываться достаточно часто и, соответственно, функция, запрещающая работу другим потокам должна работать как можно быстрее. Поэтому получать список потоков и тормозить их по одному, а затем снова получать и проверять, не успели ли еще создаться и тормозить новые и т.д. в цикле неособо хорошо...



    Критические секции не годятся... Мне же нужно, чтобы все потоки функционировали нормально до вызова моего кода. Потоки создаю не я. Можно считать, я просто записываю в память левого процесса свой код и патчу оригинальный, чтобы мой иногда вызывался.
     
  6. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    MoonShiner

    Если точка входа в твой код, для всех сторонних потоков одинакова - можешь второй командой его сделать патч первой (SMC). Это может дать потерю до 4000 тиков, но зато реализуется достаточно просто, если в секцию твоего кода уже разрешена запись:

    <font face="fixedsys]

    <font size=1>

    start_code:

    jmp $+2

    mov byte ptr [start_code + 1], end_code - start_code

    ... ; some code (small or call big proc)

    mov byte ptr [start_code + 1], 0 ;; unpatch

    end_code:

    </font><!--size-->

    </font><!--face-->



    Но в принципе, в этом случае ГОС и крит.секции гораздо надежнее, на худой конец можно воспользоваться одной из Interlocked функций.
     
  7. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    MoonShiner



    Пока твой поток сам не отдаст управление или пока не появиться поток с неменьшим приоритетом твой поток не будет прерван.



    А зачем собственно останавливать остальные потоки?

    Если нужно остановить потоки при входе в свой код, то нет ничего быстрее критических секций со спин блокировками.

    Если нужно просто сделать апи хуки, то для этого не обязательно останавливать сторонние потоки, создание true функции с помощью копирования оригинальных байт функции в буффер и установки jmp а продолжение рулит.