сабж, созданные функцией PsCreateSystemThread на любом уровне IRQL. Попробовал расставить разные приоритеты - та же беда. Версия ОС - XP. Как можно заставить их выполняться одновременно? Sleep не предлагать.
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.
"вытесняться" - см. вытесняющая многозадачность. Это не столь важно. Тогда как можно получить в режиме ядра HANDLE нужного мне процесса?
Спасибо, а то я без тебя не знал. Когда я задаю такие наводящие вопросы, я не прошу пояснить мне почему я такой тупой, а надеюсь, что ты подробнее опишешь проблему. Что значит по-твоему, что поток не вытесняется? Не надо строить из других идиотов. PsCreateSystemThread можно вызывать для создания потока только на PASSIVE_LEVEL. уточни, что ты под этим имел в виду. Где тут связь с вытеснением? Потоки, создаваемые через PsCreateSystemThread, являются вполне себе нормальными потоками и для них действуют все правила, что действуют для потоков. Нет, если у тебя задают вопросы, когда ты говоришь, что у тебя проблема, значит, что это важно. Как ты определяешь, что он тебе нужен? PID? ImageName? EPROCESS*? В первом случае - ZwOpenProcess. или PsLookupProcessByProcessId/ObOpenObjectByPointer. Во втором случае - перебор всех процессов через ZwQuerySystemInformation, а потом переход к первому варианту, имея его ID. В третьем случае - ObOpenObjectByPointer Давай так поступим. Либо ты все поясняешь, не строишь из себя умного, а из всех остальных идиотов, а подробно описываешь суть проблемы не разрозненными несвязными предложениями, которые не несут никакого смысла, а как нормально люди описывают проблему. И отвечаешь на вопросы, имеющие отношения к проблеме, без отнекивания что "это не важно". Поверь, нам виднее, что важно. Либо есть другой вариант. Ты сворачиваешь лавочку и чешешь думать сам. Решай, что тебе предпочтительнее
Только не надо на меня наезжать. Я вовсе не говорил, что ты идиот, а я умный. Я тебе так ответил, потому что ты некорректно задал вопрос. Да действительно, что значит "вытесняться"? Друг друга не поняли. Я думал, что мне тут быстро ответят, т.к. вопрос не из сложных. Но раз уж так непонятно, то объясню поподробнее. Задача следующая: PsCreateSystemThread создаёт несколько потоков с одной и той же функцией выполнения, каждая из которых пишет свою строку в файл посимвольно для возможности вытеснения, т.к. построчно вызов ZwWriteFile выполняется синхронно при наличии определённых флагов в ZwCreateFile. Открывая потом этот файл вижу, что строки написаны последовательно, т.е. потоки не вытеснялись. Не совсем. В DDK написано: Поэтому мне и нужен HANDLE другого процесса для запуска моего потока в адресном пространстве, например, explorer'a. Я имел ввиду, что поток далее сам поднимает уровень IRQL и на многозадачность и вытеснение это не влияет. Хотя странно то, что ZwWriteFile явно использует прерывание для записи на диск, а я поднимал IRQL до уровня HIGH_LEVEL, т.е. строки вообще не должны были быть записанными в файле. Мне нужен именно HANDLE, т.к. этот тип требует функция PsCreateSystemThread. Беда в том, что все 4 функции, которые ты перечислил, в моём ddk 2003 отсутствуют (и в хидерах, и в хелпе).
SysProger Ты не понимаешь что значит вытеснять потоки и вобще что есть планирование. Если у тебя один процессор то никак. Если у тебя их два, то необходимо каким то способом переключить процессоры на исполнение обоих потоков(к примеру послать IPI, в котором поставить поток в очередь планирования), после чего планирование должно быть остановлено(запрещены аппаратные прерывания), а в подобном состоянии ты не будешь иметь возможности использовать функционал ядра, например в файл ты ничего не сможешь записать. Бред. Ты вот Грита послал смотреть что значит "вытесняться", а сам даже не представляешь. Заучить термин мало, нужно понять. Ты полный нуб в этом вопросе.)
Clerk Слушай, не корчь здесь самого умного. Я и без тебя знаю, что на одном процессоре 2 потока не могут выполняться одновременно. Под термином "одновременно" я говорю о возможности прервать свою работу для выполнения другой работы. Про 2 процессора я сейчас не говорю. Факт есть факт. А вот что бред, а что нет, решать мне, а не тебе. И вообще, если нечего сказать из умного, лучше вообще не лезть со своими высказываниями в мою тему.
Можно пойти от обратного. Ты сказал: из чего можно сделать вывод, что ты знаешь, как это(что-то) сделать через него. Может покажешь, тогда мы все дружно поймём, чего ты хочешь.
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 например.
SysProger Время кванта измеренное в тактах настолько огромное, что говорить о вытеснении на всего-лишь строке можно лишь вероятностно - вдруг иногда и правда вытеснит ) А на Great и Clerk ты "наезжаешь" совершенно напрасно - они действительно много знают и могут много интересного рассказать, если ты наконец чётко объяснишь им что же ты далаешь и чего ожидаешь получить с учётом их дополнительных вопросов
Я понял ¦)) Лайк, автор создаёт несколько потоков, которые делают for(int i = 0; i < 100; ++i, ZwWriteFile(hFile, &i, sizeof(i))); И ожидает увидеть в файле не несколько последовательностей от 0 до 99, а нечто иное. Учитывая, что , это странно.
SysProger по поводу первого параметра: http://www.wasm.ru/article.php?article=drvw2k12 А про ваш случай, думаю следующее. У вас был там NULL. С точки зрения системы - все потоки выполняются в системном контексте. Поэтому, ни о какой смене потоков речь не идет, пускай даже потоки свой IRQL повышают сами себе (в теле) функцией KeRaiselrql() - это только ускорит завершение работы потока, не более того... Они просто выполняются последовательно. Но ИМХО, может иметь место и следующее, требуемое от вас (Great, Clerk правильно пишут) : 1) Нужен код. Как он создает потоки. 2) Нужно узнать что он пишет (возможно просто операции слишком незначительные, нужно больше действий к примеру). Желательно хотяб прототип кода потока (если уж такой секрет).
Отнюдь. Ты первый задал некорректный вопрос. Я задал вопрос вполне корректный, чтобы лучше понять твой. На HIGH_LEVEL (и на любом выше диспатч) поведение ZwWriteFile не определено. Поэтому может записаться, а может и бсоднуть. У тебя случился первый вариант. Ты идиот. На такие вопросы как в 1 посте ответа нет Молодец, расписал вопрос значительно понятнее для других. Но все равно - ты идиот. Знаешь, что такое кванты? Так вот, я тебе поясню. Потоку выделяется определенный интервал времени, в течение которого он не вытесняется. Если ты успеешь за этот интервал записать всю строчку - они будут записаны последовательно! Пиши не одну строчку с десятком символов, а пиши строчки под 1000 символов. Увидишь результат.