Не вытесняются потоки в драйверах

Тема в разделе "WASM.NT.KERNEL", создана пользователем SysProger, 17 дек 2008.

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

    SysProger New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2007
    Сообщения:
    127
    сабж, созданные функцией PsCreateSystemThread на любом уровне IRQL. Попробовал расставить разные приоритеты - та же беда. Версия ОС - XP. Как можно заставить их выполняться одновременно? Sleep не предлагать.
     
  2. SysProger

    SysProger New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2007
    Сообщения:
    127
    Как я понимаю, такая странность должна быть только в win98. В XP они вроде должны вытесняться.
     
  3. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    SysProger
    Наверно вся проблема в этом:
    If the input ProcessHandle is NULL, the created thread is associated with the system process. Such a thread continues running until either the system is shut down or the thread terminates itself by calling PsTerminateSystemThread.
     
  4. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Поясни, что по-твоему значит "вытесняться" и причем тут выполняться одновременно?
     
  5. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    Как определил, что они не вытесняются (что бы это не значило) ?
     
  6. SysProger

    SysProger New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2007
    Сообщения:
    127
    "вытесняться" - см. вытесняющая многозадачность.

    Это не столь важно.

    Тогда как можно получить в режиме ядра HANDLE нужного мне процесса?
     
  7. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Спасибо, а то я без тебя не знал. Когда я задаю такие наводящие вопросы, я не прошу пояснить мне почему я такой тупой, а надеюсь, что ты подробнее опишешь проблему.
    Что значит по-твоему, что поток не вытесняется?
    Не надо строить из других идиотов.

    PsCreateSystemThread можно вызывать для создания потока только на PASSIVE_LEVEL. уточни, что ты под этим имел в виду.

    Где тут связь с вытеснением? Потоки, создаваемые через PsCreateSystemThread, являются вполне себе нормальными потоками и для них действуют все правила, что действуют для потоков.

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

    Как ты определяешь, что он тебе нужен? PID? ImageName? EPROCESS*?
    В первом случае - ZwOpenProcess. или PsLookupProcessByProcessId/ObOpenObjectByPointer.
    Во втором случае - перебор всех процессов через ZwQuerySystemInformation, а потом переход к первому варианту, имея его ID.
    В третьем случае - ObOpenObjectByPointer


    Давай так поступим. Либо ты все поясняешь, не строишь из себя умного, а из всех остальных идиотов, а подробно описываешь суть проблемы не разрозненными несвязными предложениями, которые не несут никакого смысла, а как нормально люди описывают проблему. И отвечаешь на вопросы, имеющие отношения к проблеме, без отнекивания что "это не важно". Поверь, нам виднее, что важно.
    Либо есть другой вариант. Ты сворачиваешь лавочку и чешешь думать сам. Решай, что тебе предпочтительнее
     
  8. SysProger

    SysProger New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2007
    Сообщения:
    127
    Только не надо на меня наезжать. Я вовсе не говорил, что ты идиот, а я умный. Я тебе так ответил, потому что ты некорректно задал вопрос.
    Да действительно, что значит "вытесняться"? Друг друга не поняли.

    Я думал, что мне тут быстро ответят, т.к. вопрос не из сложных. Но раз уж так непонятно, то объясню поподробнее.

    Задача следующая:
    PsCreateSystemThread создаёт несколько потоков с одной и той же функцией выполнения, каждая из которых пишет свою строку в файл посимвольно для возможности вытеснения, т.к. построчно вызов ZwWriteFile выполняется синхронно при наличии определённых флагов в ZwCreateFile. Открывая потом этот файл вижу, что строки написаны последовательно, т.е. потоки не вытеснялись.

    Не совсем. В DDK написано:
    Поэтому мне и нужен HANDLE другого процесса для запуска моего потока в адресном пространстве, например, explorer'a.

    Я имел ввиду, что поток далее сам поднимает уровень IRQL и на многозадачность и вытеснение это не влияет. Хотя странно то, что ZwWriteFile явно использует прерывание для записи на диск, а я поднимал IRQL до уровня HIGH_LEVEL, т.е. строки вообще не должны были быть записанными в файле.

    Мне нужен именно HANDLE, т.к. этот тип требует функция PsCreateSystemThread.
    Беда в том, что все 4 функции, которые ты перечислил, в моём ddk 2003 отсутствуют (и в хидерах, и в хелпе).
     
  9. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    SysProger
    Ты не понимаешь что значит вытеснять потоки и вобще что есть планирование.
    Если у тебя один процессор то никак. Если у тебя их два, то необходимо каким то способом переключить процессоры на исполнение обоих потоков(к примеру послать IPI, в котором поставить поток в очередь планирования), после чего планирование должно быть остановлено(запрещены аппаратные прерывания), а в подобном состоянии ты не будешь иметь возможности использовать функционал ядра, например в файл ты ничего не сможешь записать.
    Бред. Ты вот Грита послал смотреть что значит "вытесняться", а сам даже не представляешь. Заучить термин мало, нужно понять. Ты полный нуб в этом вопросе.)
     
  10. SysProger

    SysProger New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2007
    Сообщения:
    127
    Clerk
    Слушай, не корчь здесь самого умного. Я и без тебя знаю, что на одном процессоре 2 потока не могут выполняться одновременно. Под термином "одновременно" я говорю о возможности прервать свою работу для выполнения другой работы. Про 2 процессора я сейчас не говорю.
    Факт есть факт. А вот что бред, а что нет, решать мне, а не тебе. И вообще, если нечего сказать из умного, лучше вообще не лезть со своими высказываниями в мою тему.
     
  11. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    SysProger
    Не стоит обижаться на гурЕй :)
    Я, например, тоже не пойму при чем тут IRQL к вытеснению.
     
  12. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    Можно пойти от обратного. Ты сказал:
    из чего можно сделать вывод, что ты знаешь, как это(что-то) сделать через него. Может покажешь, тогда мы все дружно поймём, чего ты хочешь.
     
  13. blast

    blast New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2008
    Сообщения:
    170
    http://www.osronline.com/ddkx/kmarch/k108_0q42.htm

    ProcessHandle
    Specifies an open handle for the process in whose address space the thread is to be run. The caller's thread must have PROCESS_CREATE_THREAD access to this process. If this parameter is not supplied, the thread will be created in the initial system process. This value should be NULL for a driver-created thread.

    Создать поток в каком-то процессе из дрова можно заинжектив в этот процесс код, который создаст поток.

    Да и вообще для синхронизации потоков существует куча механизмов mutex, event например.
     
  14. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    SysProger
    Время кванта измеренное в тактах настолько огромное, что говорить о вытеснении на всего-лишь строке можно лишь вероятностно - вдруг иногда и правда вытеснит :))
    А на Great и Clerk ты "наезжаешь" совершенно напрасно - они действительно много знают и могут много интересного рассказать, если ты наконец чётко объяснишь им что же ты далаешь и чего ожидаешь получить с учётом их дополнительных вопросов ;)
     
  15. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    Кто нибудь понял, что автор хотел сказать ?
     
  16. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Я понял ¦))
    Лайк, автор создаёт несколько потоков, которые делают for(int i = 0; i < 100; ++i, ZwWriteFile(hFile, &i, sizeof(i)));
    И ожидает увидеть в файле не несколько последовательностей от 0 до 99, а нечто иное.

    Учитывая, что
    , это странно.
     
  17. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    SysProger
    по поводу первого параметра: http://www.wasm.ru/article.php?article=drvw2k12
    А про ваш случай, думаю следующее. У вас был там NULL.
    С точки зрения системы - все потоки выполняются в системном контексте. Поэтому, ни о какой смене потоков речь не идет, пускай даже потоки свой IRQL повышают сами себе (в теле) функцией KeRaiselrql() - это только ускорит завершение работы потока, не более того... Они просто выполняются последовательно. Но ИМХО, может иметь место и следующее, требуемое от вас (Great, Clerk правильно пишут) :
    1) Нужен код. Как он создает потоки.
    2) Нужно узнать что он пишет (возможно просто операции слишком незначительные, нужно больше действий к примеру). Желательно хотяб прототип кода потока (если уж такой секрет).
     
  18. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Отнюдь. Ты первый задал некорректный вопрос. Я задал вопрос вполне корректный, чтобы лучше понять твой.
    На HIGH_LEVEL (и на любом выше диспатч) поведение ZwWriteFile не определено. Поэтому может записаться, а может и бсоднуть. У тебя случился первый вариант.

    Ты идиот. На такие вопросы как в 1 посте ответа нет

    Молодец, расписал вопрос значительно понятнее для других.
    Но все равно - ты идиот. Знаешь, что такое кванты? Так вот, я тебе поясню. Потоку выделяется определенный интервал времени, в течение которого он не вытесняется. Если ты успеешь за этот интервал записать всю строчку - они будут записаны последовательно!
    Пиши не одну строчку с десятком символов, а пиши строчки под 1000 символов. Увидишь результат.
     
  19. SysProger

    SysProger New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2007
    Сообщения:
    127
    Сначала научись правильно писать, а потом уже выходи в сеть, малыш.
     
  20. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Я то пишу правильно, в отличие от некоторых.
    Закрыто
     
Статус темы:
Закрыта.