ПАУЗА В ДРАЙВЕРЕ

Тема в разделе "WASM.NT.KERNEL", создана пользователем cou, 13 янв 2008.

  1. cou

    cou New Member

    Публикаций:
    0
    Регистрация:
    6 янв 2008
    Сообщения:
    30
    Доброго времени суток!
    Собственно 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):
    1. hookproc proc PacketHeader:DWORD, Packet:DWORD, PacketLength:WORD,
    2.         RecvInterfaceIndex:WORD,SendInterfaceIndex:WORD,RecvLinkNextHop:DWORD,
    3.         SendLinkNextHop:DWORD
    4.     DO_DELAY
    5.             mov eax,PF_PASS
    6.     ret
    7. hookproc endp
     
  2. cou

    cou New Member

    Публикаций:
    0
    Регистрация:
    6 янв 2008
    Сообщения:
    30
    Ну ребяты, не стресняйтесь!
    Вопрос наверное сложный?
    Но я не вижу даже глупых ответов. Быстро их в студию! Будем обсуждать...
    Я ж не кусаюсь. А если жвачки мало, то 10WMZ устроит?)
     
  3. asmlamo

    asmlamo Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    1.734
    Попробуй сделать на таймере.


    Или найди аналог функции Sleep для ядра ...


    ZwDelayExecution, NtDelayExecution или нечто подобное ...
     
  4. cou

    cou New Member

    Публикаций:
    0
    Регистрация:
    6 янв 2008
    Сообщения:
    30
    Как? С моими скромными познаниями , мне необходимы:
    Ссылка на пример. Или хоть пару строк-намек...

    п.с.: KeDelayExecutionThread - это и есть аналог Слиипа... он приостоновит поток... а мне всего лишь пауза нужна... если поток приостановиться ... полный Windows'у будет... он же в драйвер посылает пакеты, а мой драйвер спит в это время, видимо потому и черный экран ..

    пс2: прочитал http://www.wasm.ru/forum/viewtopic.php?id=20903, плохи дела мои, ну кто поможет, городить таймер... сейчас нагорожу, в двадцать вопросов выльется)... городить значит пока не бу...
     
  5. asmlamo

    asmlamo Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    1.734
    Ну тогда городи таймер.
     
  6. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    скорее всего твой код, в который ты хочешь вставить задержку, выполняется в разных потоках. и изза пренебрежения синхронизацией ресурсов такая ситуация может возникнуть. используя общие ресурсы для всех потоков.
     
  7. asmlamo

    asmlamo Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    1.734
    т.е. нужно использовать мьютексы ?
     
  8. cou

    cou New Member

    Публикаций:
    0
    Регистрация:
    6 янв 2008
    Сообщения:
    30
    умно! даже слишком( не понятно!(
    в разных потоках? там один обработчик, туда приходят пакеты, я могу их дропнуть или пассить(пропустить), так вот я их хочу пропустить, но с секундной задержкой, вставить паузу в сеть, уж слишком она зараза быстрая. Второй вариант работает на ура, но процессор грузиться...
     
  9. cou

    cou New Member

    Публикаций:
    0
    Регистрация:
    6 янв 2008
    Сообщения:
    30
    про "мьютексы" я промолчу, пойду поматерюсь и кофе заодно налью...
    Неплохо бы не залазить в дебри, переписал вопрос в первом посте.
     
  10. TermoSINteZ

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

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    Off:
    Интересно, писать сетевые дрова не имея знаний о синхронизации объектов ядра.. Ммм это интересно.
    Посоветую почитать Walter Oney :derisive:
     
  11. cou

    cou New Member

    Публикаций:
    0
    Регистрация:
    6 янв 2008
    Сообщения:
    30
    Вам бы такое интересно. Может мне почитать "Приключения на пятую точку, от Незнайки!") ищу Walter Oney... а там на русском?...
     
  12. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    чаще используют спин-блокировки нужных объектов.
    при посылке пакета происходит много шагов. например r3-приложение обращается к драйверу TDI, TDI вызывает функцию NdisSendPacket, драйвер ndis уже твой хендлер. и все это происходит в одном контексте. и так для разных приложений будут разные контексты вызова твоего хендлера. и не исключено что, например, ты обращаешься со списком доверенных приложений, а одновремено в него и записываешь. пример утрирован, но идея должна быть ясна.

    то есть даже в пустом обработчике, где кроме задержки ничего нет, тогда бсод?
    посмотри твой ли драйвер бсодит.
     
  13. TermoSINteZ

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

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    cou
    В электронном виде видел тока на английском. На русском тока печатную видел.
    Но вам лучше все же английскую скачать.
     
  14. cou

    cou New Member

    Публикаций:
    0
    Регистрация:
    6 янв 2008
    Сообщения:
    30
    Благодарю, скачал. Сейчас книжку поставлю в нужную позу и начну изучать...
     
  15. cou

    cou New Member

    Публикаций:
    0
    Регистрация:
    6 янв 2008
    Сообщения:
    30
    BSOD ... это наверное СЭСмерти ...
    вот второй вариант работает... сейчас установил драйвер... но дело в том если задержку ставлю большую, то она влияет на всю систему... даже мышь еле шевелиться... а хотелось бы только на подсистему сетевую... т.е. как то процессам другим передавать управление...
    а первый вариант с KeDelayExecutionThread работает вначале или создает видимость, потом я имитирую обращение к сети, чтобы мой перехватчик сработал и сразу ребут...
     
  16. cou

    cou New Member

    Публикаций:
    0
    Регистрация:
    6 янв 2008
    Сообщения:
    30
    Почитал про синхронизацию, наверное все таки это не из моей оперы...
    Spin блокировка не нужна.
    ВОПРОС НА 10WMZ : Как приостановить драйвер, не останавливая всей работы ring0 ? Вариант с KeDelayExecutionThread отпадает по причине нестабильности(возможно изза проблемы с синхронизацией).
    Пока что рабочий вариант макрос DO_DELAY... CPU 100% грузит) но работает! Уберем загрузку ЦПУ и 10 WMZ Ваши. Светлые умы просыпайтесь!

    пс.: спасибо за посты выше, но проблему не решили они( увы(
     
  17. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    А если разморозить систему на время выполнения пустого цикла, отдавая процессор другим потокам?
    while (currentTime-startTime < 1sec) ZwYieldExecution();
     
  18. cou

    cou New Member

    Публикаций:
    0
    Регистрация:
    6 янв 2008
    Сообщения:
    30
    сейчас попробую...
    Вариант 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(блокировка)
     
  19. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Что значит "сервис не устанавливается"? Какое отношение имеет наличие вызова ZwYieldExecution к запуску драйвера? Это ж не юзермодная функция, чтобы блокировался запуск драйвера.
    Всё устанавливается прекрасно.

    Код (Text):
    1. NTSTATUS DriverEntry(PDRIVER_OBJECT  DriverObject, PUNICODE_STRING RegistryPath ){
    2.     NTSTATUS            status;
    3.     UNICODE_STRING      unicodeDeviceName;  
    4.     UNICODE_STRING      unicodeDosDeviceName;  
    5.     int counter;
    6.     UNREFERENCED_PARAMETER (RegistryPath);
    7.  
    8.     counter = 100000000;
    9.     __asm{
    10.         push    ebx
    11.         mov     ebx,counter
    12.       _st:
    13.     }    
    14.     ZwYieldExecution();
    15.     __asm{
    16.         dec     ebx
    17.         jnz     _st
    18.         mov     counter,ebx
    19.         pop     ebx
    20.  
    21.     }
    22.  
    23.     DbgPrint("End of delay loop");
    Вот такой код дает задержку (у меня) 12 сек. Если без ZwYieldExecution, то пока он не отработает и не появится вывод от DbgPrint, всё замерзает.
    С ZwYieldExecution система работает нормально параллельно выполнению цикла (т.е. полноценная работа с другими приложениями), не дожидаясь вывода от DbgPrint.
    Никаких проблем.
    Естественно таскменеджер показывает загрузку процессора, но другие потоки не испытывают дефицита процессорного времени

    P.S.
    Ты случайно не к ntdll линкуешься???
    ZwYieldExecution нужна из ntoskrnl.exe, а не из ntdll.dll

    Если импортировать ZwYieldExecution из ntdll.dll, то естественно не запустится...
     
  20. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Чувак ты нереально жжошь. Тебе нужна пауза без загрузки CPU (!) но и чтобы у тебя другие потоки не выполнялись?
    Тогда могу посоветовать лишь перехватить временно прерывание таймера, в котором проверять истекло ли время.
    А в твоем потоке просто сделать HLT.

    Это раз. Два - почему тебе так важна загрузка цпу когда другие потоки не должны выполняться?\

    Три - или всетаки должны? Тогда KeDelayExecutionThread рулит.
    ZwDelayExecution можешь не пробовать, она к ней сводится.