Если в двух словах, драйвера, работающие с tcpip.sys ( afd.sys, netbt.sys ) для работы с входящими соединениями используют клиентскую нотификацию — TDI_EVENT_CONNECT. Эта нотификация устанавливается на файл-транспортный адрес.
Да пребудет с тобою сила
Re[2]: без TdiBuildAccept ? Как?
От:
Аноним
Дата:
29.10.06 13:24
Оценка:
Здравствуйте, TarasCo, Вы писали:
TC>Здравствуйте, -CANCER-, Вы писали:
CAN>>Как же все таки на TDI уровне можно обойтись без TdiBuildAccept? CAN>>listen???
TC>Если в двух словах, драйвера, работающие с tcpip.sys ( afd.sys, netbt.sys ) для работы с входящими соединениями используют клиентскую нотификацию — TDI_EVENT_CONNECT. Эта нотификация устанавливается на файл-транспортный адрес.
Ок! Спасибо. Буду пробывать. А какие преимущества имеет данный способ? Ведь не зря его используют сервисы. Я так понимаю и сервисы от дяди Билли?
СТОП! А я так и делал но у меня не получалось! Если надо могу превести код.
З.Ы. Т.е. TdiBuildListen тоже не надо использовать?
Здравствуйте, Аноним, Вы писали:
А>Ок! Спасибо. Буду пробывать. А какие преимущества имеет данный способ? Ведь не зря его используют сервисы. Я так понимаю и сервисы от дяди Билли?
Этот способ могут использовать ТОЛЬКО драйвера режима ядра. Поэтому, если понимать под сервисом также драйвера ( AKA сервисы режима ядра ), то все драйвера — клиенты tcpip.sys делают это. Преимущество одно — производительность.
А>СТОП! А я так и делал но у меня не получалось! Если надо могу превести код.
Прежде всего не расстраивайтесь, не все получается с первого раза. Не останавливайтесь и все получится .
А>З.Ы. Т.е. TdiBuildListen тоже не надо использовать?
Если установили нотификатор — то нет, необязательно, это тольо запутает все дело .
Я бы Вам посоветовал посмотреть, как работают стандартные драйвера — установите драйвер-фильтр, или если есть достаточно опыта, можно просто точек останова расставить. Можно TDIMon использовать, есть такая утилита — ссылку давать не буду, она и гуглом моментом найдется.
Да пребудет с тобою сила
Re[4]: без TdiBuildAccept ? Как?
От:
Аноним
Дата:
03.11.06 14:26
Оценка:
Здравствуйте, TarasCo, Вы писали:
Блин, не получается у меня соединение!Может подскажете где ошибка зарылась? Все примерно так
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, TarasCo, Вы писали:
А>Блин, не получается у меня соединение!Может подскажете где ошибка зарылась? Все примерно так
А>
А>Вообщем вылетау в BSOD с ошибкой IRQ_NOT_LESS_OR_EQUAL(0x00000000,0x00000002,0x00000001, 0x8042def4)!!! А>Множество вариантов перепробывал, не растет кокос!!! Может я не правильно Вас понял?
Алогритм правильный, но реализация хромает .
Первое, по поводу отладки — подобные вещи ( BSOD ) при отладке драйвера — рядовое явление, бессмысленно по каждому случаю задавать вопрос. Поставте точку остонова в начало ф.Tdi_ClientEventConnect и протрассируйте код. Узнав точное место ошибки, можно будет и документацию почитать или задать осмысленный вопрос. В данном случае, учитывая факт, что клиентсикие нотификаторы вызываются на DISPATCH_LEVEL, можно указать несколько мест, приводящих к фатальным ошибкам:
— KeWaitForMutexObject — ожидание с ненулевым таймаутом не допустимо
— TdiBuildInternalDeviceControlIr — документация настаивает на вызове только на PASSIVE_LEVEL ( хотя вроде как BSOD а быть не должно )
— KeWaitForSingleObject — ожидание м ненулевым таймаутом не допустимо
Да пребудет с тобою сила
Re[6]: без TdiBuildAccept ? Как?
От:
Аноним
Дата:
05.11.06 12:55
Оценка:
Здравствуйте, TarasCo, Вы писали:
TC>Алогритм правильный, но реализация хромает .
Слава богу!!! А то я уже подумал может случилась какое то мировое бедствие. Вчера, сегодня — полный штиль! Умеют люди отдыхать, а мне вот еще 4 дня с 9 до 9!!! Жуть
TC>Первое, по поводу отладки — подобные вещи ( BSOD ) при отладке драйвера — рядовое явление, бессмысленно по каждому случаю задавать вопрос. Поставте точку остонова в начало ф.Tdi_ClientEventConnect и протрассируйте код. Узнав точное место ошибки, можно будет и документацию почитать или задать осмысленный вопрос.
Если честно пишу драйвер впервые, поэтому как поставить точки останова для драйвера я не знаю...Драйвер мне достался от предыдущего программиста, точнее его каркас — DriverEntry Драйвер грузится вместе с системой. Отладочную информацию смотрю через DbgView+TdiMon
TC>В данном случае, учитывая факт, что клиентсикие нотификаторы вызываются на DISPATCH_LEVEL, можно указать несколько мест, приводящих к фатальным ошибкам: TC>- KeWaitForMutexObject — ожидание с ненулевым таймаутом не допустимо TC>- TdiBuildInternalDeviceControlIr — документация настаивает на вызове только на PASSIVE_LEVEL ( хотя вроде как BSOD а быть не должно ) TC>- KeWaitForSingleObject — ожидание м ненулевым таймаутом не допустимо
Так я вылетая даже с пустым нотификатором...
Я сейчас все это дело немного переделал, но результат тотже:
Здравствуйте, Аноним, Вы писали:
А>Если честно пишу драйвер впервые, поэтому как поставить точки останова для драйвера я не знаю...Драйвер мне достался от предыдущего программиста, точнее его каркас — DriverEntry Драйвер грузится вместе с системой. Отладочную информацию смотрю через DbgView+TdiMon
Этак Вы будете писать очень долго. Предлагаю отвлечся от текущей проблемы и организовать нормальный поцесс разработки — использовать отладчик.
Если у Вас есть два компьютера и возможность связать их через последовательный порт или через 1394, то лучшим вариантом будет использование windbg ( свободно распространяется ). Если машина одна — то SoftIce. Оба эти отладчика поддерживают трассировку по исходному коду. Кроме того, windbg полезен при разборе т.н crash dump ов. И еще один совет — не загружать драйвер вместе с системой — очень трудно разрабатывать. Поставте порядок загрузки 3, т.е по требованию. Загрузить драйвер можно будет с помощью команды net start имя_сервиса
А>Я сейчас все это дело немного переделал, но результат тотже:
Вы таки решили оставить захват мьютекса — KeWaitForMutexObject. Еще раз напишу — в данном случае НЕЛЬЗЯ использовать мьютексы. Потом появился у Вас в коде вызов IoSetNextIrpStackLocation, зачем?
Да пребудет с тобою сила
Re[8]: без TdiBuildAccept ? Как?
От:
Аноним
Дата:
06.11.06 03:39
Оценка:
Здравствуйте, TarasCo, Вы писали:
TC>Этак Вы будете писать очень долго. Предлагаю отвлечся от текущей проблемы и организовать нормальный поцесс разработки — использовать отладчик.
Да это понятно...
TC>Если у Вас есть два компьютера и возможность связать их через последовательный порт или через 1394, то лучшим вариантом будет использование windbg ( свободно распространяется ).
Машины нет, но постараюсь че нибудь придумать...
TC>Если машина одна — то SoftIce.
Пробывал я как то что то он мне не очень понравился..
TC>Оба эти отладчика поддерживают трассировку по исходному коду. Кроме того, windbg полезен при разборе т.н crash dump ов.
TC>И еще один совет — не загружать драйвер вместе с системой — очень трудно разрабатывать. Поставте порядок загрузки 3, т.е по требованию. Загрузить драйвер можно будет с помощью команды net start имя_сервиса
Я в самом начале как то попытался он у меня не загружается...Он инсталится с помощью инф-файла,как виртуальный параллельный порт. Как мне такой драйвер можно загрузить после старта ОС? И выгрузить? Пытаюсь его в устройствах отключить — требует перезагрузки системы!
Здравствуйте, Аноним, Вы писали:
TC>>Если машина одна — то SoftIce. А>Пробывал я как то что то он мне не очень понравился..
Ну, не знаю, если Вам кажется удобнее использовать DbgView.....
А>Я в самом начале как то попытался он у меня не загружается...Он инсталится с помощью инф-файла,как виртуальный параллельный порт. Как мне такой драйвер можно загрузить после старта ОС? И выгрузить? Пытаюсь его в устройствах отключить — требует перезагрузки системы!
Возможно, не задана стандартная процедура DriverUnload. Или c обработкой PnP сообщений ( если конечно драйвер класса параллельных портов должен их обрабатывать? ) что то не в порядке. Кроме того, у Вас проблемы с установленем ТСР соединения. Ну вынесите это в отдельный драйвер и отлаживайте, потом перенесите рабочий код в исходный проект.
Да пребудет с тобою сила
Re[10]: без TdiBuildAccept ? Как?
От:
Аноним
Дата:
06.11.06 13:30
Оценка:
Здравствуйте, TarasCo, Вы писали:
TC>Здравствуйте, Аноним, Вы писали:
TC>>>Если машина одна — то SoftIce. А>>Пробывал я как то что то он мне не очень понравился..
TC>Ну, не знаю, если Вам кажется удобнее использовать DbgView.....
Теперь то я ясно что не очень удобно!!!
А>>Я в самом начале как то попытался он у меня не загружается...Он инсталится с помощью инф-файла,как виртуальный параллельный порт. Как мне такой драйвер можно загрузить после старта ОС? И выгрузить? Пытаюсь его в устройствах отключить — требует перезагрузки системы!
TC>Возможно, не задана стандартная процедура DriverUnload. Или c обработкой PnP сообщений ( если конечно драйвер класса параллельных портов должен их обрабатывать? ) что то не в порядке.
Да вроде все ф-ции заDispatchены, вот на сколько они верны....мне не понятно. В DriverUnload просто убивается виртуальный порт,
TC>Кроме того, у Вас проблемы с установленем ТСР соединения. Ну вынесите это в отдельный драйвер и отлаживайте, потом перенесите рабочий код в исходный проект.
Вопрос, я понял Вас, но как мне загружать этот драйвер, с системой или по требованию? ОС во время загрузки не будет пытаться открыть этот вирт.порт? Веддь у меня в IRP_MJ_CREATE происходит запуск потока в котором создается TDI "сессия", а в IRP_MJ_CLEANUP он убивается. Т.е. если это так то девайс виртуального порта попытается подрубиться к моему вынесенному "сетевому" драйверу — а тут облом...Или я не прав?
Re[11]: Ну все-таки, почему BSOD?
От:
Аноним
Дата:
08.11.06 13:55
Оценка:
Не поиму в чем дело? Почему постоянно этот BSOD?
Я уже раз 5 переделал эту ф-цию конекта, результат один — крах ОС! Может есть какая то хитрость?