В драйвере NDIS много раз вызывается DbgPrint в w2k работает нормально, но там был запущен DbgView (вместе c Айсом) Опробовал на ХР (без Айса и DbgView) - всё работало нормально, а через минут 20 просто перезагрузилась (без BSOD) Вопрос в следующем сообщения от DbgPrint нигде не задерживаются ? Н-р как в оконной процедуре. Возможен вариант переполнения какого-то буфера
SteelRat у меня была один раз (мне хватило) проблема : Отлаживаю драйвер (сайс включен). Потом что-то не захотелось замораживать винду (музыка играет) но нужно было посмиотреть сообщения я завел DbgView. вроде сообщения приходят, а потом бац, я впал в сайс в функцию Interlockedxxx... и в сайсе появилось сообщение Page Fault . При дальшейшем выполнение (команда g) винда крутилась в этой функции, при чем, 5 сек винет 5 сек работает ... и так постоянно, пока я не нажал 3 заветные клавиши, и не ушел в ребут.
В MSDN сказано, что размер буфера w2k 4кб. но посылать не более 512 байт, в 2003 размер можно менять. Вот я и задумался - этот буфер очищает система, или программы типа DbgView ?
SteelRat TermoSINteZ а ЦП наверное с HT? DbgView использует небезопасный способ перехвата - падч начала функции (может, в последних версиях это и устранено не смотрел), который приводит к проблемам на многоцпшных машинах. правильный способ перехвата - патч таблицы импорта.
kaspersky нет у меня проц селик (урезанный 4 пень 1700 мгц) , без HT по поводу несовместимости обоих программ это верно, скорее всего DbgView виноват . IceStudent спасибо за ссылку
<font color="gray][ kaspersky</font><!--color--><font color="gray]: DbgView использует небезопасный способ перехвата - падч начала функции (может, в последних версиях это и устранено не смотрел), который приводит к проблемам на многоцпшных машинах. ]</font><!--color--> Глянул последнюю версию 4.41 (драйвер версии 4.32) - ничего не изменилось (опасный патч в два приёма): Код (Text): :000109A8 call Remap . . . :000109AD mov ecx, g_pfnDbgPrint :000109B8 mov word ptr [ecx], 25FFh ; jmp . . . :000109D3 mov ecx, g_pfnDbgPrint . . . :000109DA mov dword ptr [ecx+2], offset g_pfnDbgPrintHook ; address . . . :000109E1 call Unmap Кстати говоря, можно использовать CMPXCHG8B - тогда всё будет ОК. Но вот что интересно. В предыдущих версиях Марк делал ремапинг ( MmCreateMdl / MmBuildMdlForNonPagedPool / MmMapLockedPages ). А вот тут ремапинг только под free билдом, а если checked билд, то сброс WP. Код (Text): :00010344 Remap proc near :00010344 mov eax, ds:NtBuildNumber :00010349 mov eax, [eax] :0001034B and eax, 0F0000000h :00010350 cmp eax, 0C0000000h ; checked or free ? :00010355 jnz short loc_10369 ; free build :00010357 :00010357 push ebx ; checked build :00010358 mov eax, cr0 :0001035B mov ebx, eax :0001035D and eax, 0FFFEFFFFh ; clear WP :00010362 mov cr0, eax :00010365 mov eax, ebx :00010367 pop ebx ; return old cr0 :00010368 retn :00010369 :00010369 loc_10369: :00010369 push 1000h ; free build :0001036E push g_pfnDbgPrint :00010374 push NULL :00010376 call ds:MmCreateMdl :0001037C :0001037C push eax ; pMDL :0001037D mov g_pMDL, eax :00010382 call ds:MmBuildMdlForNonPagedPool :00010388 :00010388 push KernelMode :0001038A push g_pMDL :00010390 call ds:MmMapLockedPages :00010396 :00010396 mov g_pfnDbgPrint, eax :0001039B xor eax, eax :0001039D retn :0001039D Remap endp Кто нибудь может пояснить, почему для дебужной винды манипуляции с cr0, а для фришной ремапинг?
Ну, сплайсинг на многопроцессорных машинах может сглючить только в момент установки хука, и то, при правильной реализации вероятность этого настолько низка, что ею можно принебречь. Это конечно в высшей степени странно. Но сброс WP бита тоже достаточно стабильно работает.
<font color="gray][ Ms Rem</font><!--color--><font color="gray]: Ну, сплайсинг на многопроцессорных машинах может сглючить только в момент установки хука, и то, при правильной реализации вероятность этого настолько низка, что ею можно принебречь. ]</font><!--color--> Это понятно. Для таких инструментов как DbgView один голубой экран на 1000...000 запусков не проблема, а в коммерческих проектах конечно же неприемлемо. <font color="gray][ Ms Rem</font><!--color--><font color="gray]: Но сброс WP бита тоже достаточно стабильно работает. ]</font><!--color--> Это тоже понятно. Оба метода одинакого (?) стабильны, но зачем один из них испльзовать на free, а другой на checked? Значит какая-то разница есть. Вопрос какая?
Полная стабильность - это идеал к которому нужно стремиться, но если посмотреть на реальность, то большинство коммерческих программ куда более глючны чем одно падение на 1000...000 запусков. Даже продукты МелкоСофта не доходят до идеала. Допустим, программа загружается один раз и только при старте системы (как большинство фаерволлов и антивирусов), при этом в системе еще мало потоков и вероятность падения снижается с 1000...000 запусков до совсем ничтожной величины, причем падение при этом не может причинить какой-либо ущерб. Разве в этом случае такой метод не может применяться в коммерческих программах?
Это риторический вопрос. Я так воспитан, что 0,00000000001% вероятность голубого экрана, для меня означает 100%.
...Ну, сплайсинг на многопроцессорных машинах может сглючить только в момент установки хука, и то, при правильной реализации вероятность этого настолько низка, что ею можно принебречь. тебе и Four-F и nikita вроде уже объясняли в чем разница между домашними поделками и коммерческим кодом, а ты ведешь себя как Swing из соседнего топика
infern0 А я вроде бы обьяснил целесообразность применения сплайсинга и привел пример коммерческих программ где это с успехом используется. Приведенный на reng.ru метод хуков (через int3) уж точно никуда не годен (причины я обьяснял). Остаются хуки через таблицу импорта и через SDT. А если вдруг нужно будет перехватить неэкспортируемую функцию? Предложи тогда абсолютно стабильный метод, подходящий для использования в коммерческих продуктах. Если нужна абсолютная стабильность (которой не бывает), то не используй сплайсинг. Я свое мнение тебе не навязываю.
Кстати, вариант с CMPXCHG8B приведенный Four-F тоже хорошее решение. Или можно заюзать MMX для быстрого патча.
>> Даже продукты МелкоСофта не доходят до идеала. Даже рядом не стоят.. =)) 2Ms Rem Если нужна абсолютная стабильность - выключи компьютер.. И то не факт..
<font color="gray][ Four-F</font><!--color--><font color="gray]: Кто нибудь может пояснить, почему для дебужной винды манипуляции с cr0, а для фришной ремапинг? ]</font><!--color--> Вот ответ автора: "The checked build asserts on the double-mapping."