Доброго времени суток! Собственно subj интересует. Сайт почитал, понравилось), отличные статьи и потянуло вспомнить былое. Объект писанины: драйвер-фильт сетевого трафика, см. статью http://www.wasm.ru/article.php?article=netfilter. Цель: добиться простоя в N-секунд. Пробовал ...... local DelayTime:LARGE_INTEGER mov DelayTime.HighPart, 0 or DelayTime.HighPart, -1 mov DelayTime.LowPart, -500000 invoke KeDelayExecutionThread,KernelMode,FALSE,addr DelayTime ..... ================== запускаю ... работает ... посылаю пакеты в сеть - черный экран, ребут... хм, делаю вывод, не работает ============================ а так же из статьи http://www.wasm.ru/article.php?article=drvw2k03 макрос ... DO_DELAY MACRO mov eax, DELAY .while eax dec eax .endw ENDM ... работает8) с загрузкой системы и притормаживаниями ... т.е. тоже почти не работает НУ и КАК сделать ТАК чтобы пауза была пару секунд и ничего не тормозило и не глючила, кто ответит тому жвачка... стоимостью 10WMZ Пример работающий, где вместо DO_DELAY нужна пауза без загрузки CPU ~90%: Код (Text): hookproc proc PacketHeader:DWORD, Packet:DWORD, PacketLength:WORD, RecvInterfaceIndex:WORD,SendInterfaceIndex:WORD,RecvLinkNextHop:DWORD, SendLinkNextHop:DWORD DO_DELAY mov eax,PF_PASS ret hookproc endp
Ну ребяты, не стресняйтесь! Вопрос наверное сложный? Но я не вижу даже глупых ответов. Быстро их в студию! Будем обсуждать... Я ж не кусаюсь. А если жвачки мало, то 10WMZ устроит?)
Попробуй сделать на таймере. Или найди аналог функции Sleep для ядра ... ZwDelayExecution, NtDelayExecution или нечто подобное ...
Как? С моими скромными познаниями , мне необходимы: Ссылка на пример. Или хоть пару строк-намек... п.с.: KeDelayExecutionThread - это и есть аналог Слиипа... он приостоновит поток... а мне всего лишь пауза нужна... если поток приостановиться ... полный Windows'у будет... он же в драйвер посылает пакеты, а мой драйвер спит в это время, видимо потому и черный экран .. пс2: прочитал http://www.wasm.ru/forum/viewtopic.php?id=20903, плохи дела мои, ну кто поможет, городить таймер... сейчас нагорожу, в двадцать вопросов выльется)... городить значит пока не бу...
скорее всего твой код, в который ты хочешь вставить задержку, выполняется в разных потоках. и изза пренебрежения синхронизацией ресурсов такая ситуация может возникнуть. используя общие ресурсы для всех потоков.
умно! даже слишком( не понятно!( в разных потоках? там один обработчик, туда приходят пакеты, я могу их дропнуть или пассить(пропустить), так вот я их хочу пропустить, но с секундной задержкой, вставить паузу в сеть, уж слишком она зараза быстрая. Второй вариант работает на ура, но процессор грузиться...
про "мьютексы" я промолчу, пойду поматерюсь и кофе заодно налью... Неплохо бы не залазить в дебри, переписал вопрос в первом посте.
Off: Интересно, писать сетевые дрова не имея знаний о синхронизации объектов ядра.. Ммм это интересно. Посоветую почитать Walter Oney
Вам бы такое интересно. Может мне почитать "Приключения на пятую точку, от Незнайки!") ищу Walter Oney... а там на русском?...
чаще используют спин-блокировки нужных объектов. при посылке пакета происходит много шагов. например r3-приложение обращается к драйверу TDI, TDI вызывает функцию NdisSendPacket, драйвер ndis уже твой хендлер. и все это происходит в одном контексте. и так для разных приложений будут разные контексты вызова твоего хендлера. и не исключено что, например, ты обращаешься со списком доверенных приложений, а одновремено в него и записываешь. пример утрирован, но идея должна быть ясна. то есть даже в пустом обработчике, где кроме задержки ничего нет, тогда бсод? посмотри твой ли драйвер бсодит.
cou В электронном виде видел тока на английском. На русском тока печатную видел. Но вам лучше все же английскую скачать.
BSOD ... это наверное СЭСмерти ... вот второй вариант работает... сейчас установил драйвер... но дело в том если задержку ставлю большую, то она влияет на всю систему... даже мышь еле шевелиться... а хотелось бы только на подсистему сетевую... т.е. как то процессам другим передавать управление... а первый вариант с KeDelayExecutionThread работает вначале или создает видимость, потом я имитирую обращение к сети, чтобы мой перехватчик сработал и сразу ребут...
Почитал про синхронизацию, наверное все таки это не из моей оперы... Spin блокировка не нужна. ВОПРОС НА 10WMZ : Как приостановить драйвер, не останавливая всей работы ring0 ? Вариант с KeDelayExecutionThread отпадает по причине нестабильности(возможно изза проблемы с синхронизацией). Пока что рабочий вариант макрос DO_DELAY... CPU 100% грузит) но работает! Уберем загрузку ЦПУ и 10 WMZ Ваши. Светлые умы просыпайтесь! пс.: спасибо за посты выше, но проблему не решили они( увы(
А если разморозить систему на время выполнения пустого цикла, отдавая процессор другим потокам? while (currentTime-startTime < 1sec) ZwYieldExecution();
сейчас попробую... Вариант 3. ....... ; DO_DELAY invoke KeStallExecutionProcessor,500000 ...... аналогичен DO_DELAY, но тормозит по другому ) наткнулся при поиске ZwYieldExecution в DDKNT .... возвращаюсь к ZwYieldExecution ... в процессе.... да собственно ошибочка вышла !!! CreateService SUCCESS failure: StartService (0x7f) Can't get a handle to \\.\filter ======== сервис не устанавливается( если в теле есть вызов к ZwYieldExecution - не работает! по теме http://www.intel.com/cd/ids/developer/emea/rus/dc/windows/windows64/334068.htm(блокировка)
Что значит "сервис не устанавливается"? Какое отношение имеет наличие вызова ZwYieldExecution к запуску драйвера? Это ж не юзермодная функция, чтобы блокировался запуск драйвера. Всё устанавливается прекрасно. Код (Text): NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath ){ NTSTATUS status; UNICODE_STRING unicodeDeviceName; UNICODE_STRING unicodeDosDeviceName; int counter; UNREFERENCED_PARAMETER (RegistryPath); counter = 100000000; __asm{ push ebx mov ebx,counter _st: } ZwYieldExecution(); __asm{ dec ebx jnz _st mov counter,ebx pop ebx } DbgPrint("End of delay loop"); Вот такой код дает задержку (у меня) 12 сек. Если без ZwYieldExecution, то пока он не отработает и не появится вывод от DbgPrint, всё замерзает. С ZwYieldExecution система работает нормально параллельно выполнению цикла (т.е. полноценная работа с другими приложениями), не дожидаясь вывода от DbgPrint. Никаких проблем. Естественно таскменеджер показывает загрузку процессора, но другие потоки не испытывают дефицита процессорного времени P.S. Ты случайно не к ntdll линкуешься??? ZwYieldExecution нужна из ntoskrnl.exe, а не из ntdll.dll Если импортировать ZwYieldExecution из ntdll.dll, то естественно не запустится...
Чувак ты нереально жжошь. Тебе нужна пауза без загрузки CPU (!) но и чтобы у тебя другие потоки не выполнялись? Тогда могу посоветовать лишь перехватить временно прерывание таймера, в котором проверять истекло ли время. А в твоем потоке просто сделать HLT. Это раз. Два - почему тебе так важна загрузка цпу когда другие потоки не должны выполняться?\ Три - или всетаки должны? Тогда KeDelayExecutionThread рулит. ZwDelayExecution можешь не пробовать, она к ней сводится.