Здраствуйте
Пытаюсь создать сервер на TDI уровне.Вариант отработанный т.е. работает без проблем если запущен в отдельном процессе.Но если я пытаюсь создать сервер в потоке драйвера, а прослушку на TDI_ACCEPT в отдельном потоке то при конекте происходит BSOD.
Здравствуйте, Zoya_Pobeda, Вы писали:
Z_P>Здраствуйте Z_P>Пытаюсь создать сервер на TDI уровне.Вариант отработанный т.е. работает без проблем если запущен в отдельном процессе.Но если я пытаюсь создать сервер в потоке драйвера, а прослушку на TDI_ACCEPT в отдельном потоке то при конекте происходит BSOD.
Не могли бы Вы подробно указать место, где происходит BSOD? Я могу предположить, что это происходит в ф. TDISrvEventConnect, а ее код вы не привели.
Здравствуйте, TarasCo, Вы писали:
TC>Не могли бы Вы подробно указать место, где происходит BSOD? Я могу предположить, что это происходит в ф. TDISrvEventConnect, а ее код вы не привели.
Да собственно как я понимаю стандартная комбинация...
Вы так и не написали ни место где произошел BSOD, ни даже его кода. Кроме того, Вы скорее свего не включали Driver Verifier — а он мог бы показать более точную причину ошибку. Поэтому, придется угадывать причину ошибки. Конечно мы попробуем , но это может продолжать очень долго.
Итак, первая возможная причина.
1. В коде ф.ServerWorkerThread есть такие строки:
Это Вы загодя создаете Irp. Причем этот объект довольно хитрый — он связан с очередью потока, поскольку TdiBuildInternalDeviceControlIrp — всего лишь макрос-оболочка над IoBuildDeviceIoControlRequest ( обязательно читаем описание!!! ). Теперь, мы принимаем входящее соединение ( ф.TDISrvEventConnect ) и производим с Irp некое действие:
Я так понял, что pIrpAccept это Irp, созданный вызовом TdiBuildInternalDeviceControlIrp? Тогда с ним поступили довольно нехорошо — подменили процедуру завершения, указанную при создании и контекст. При этом на мой взгляд все, что происходит дальше — это неопределенное поведении и BSOD не удивителен. Что нужно было сделать? Нужно было в ф.TDISrvEventConnect создать собственный Irp простым вызовом IoAllocateIrp и инициализировать его через макрос TdiBuildAccept. В ф. TDIClnIoCompRtnAcc — освободить через вызов IoFreeIrp, там же взвести нотифицирующее событие.
Здравствуйте, TarasCo, Вы писали:
TC>Здравствуйте, Zoya_Pobeda, Вы писали:
TC>Вы так и не написали ни место где произошел BSOD, ни даже его кода. Кроме того, Вы скорее свего не включали Driver Verifier — а он мог бы показать более точную причину ошибку. Поэтому, придется угадывать причину ошибки. Конечно мы попробуем , но это может продолжать очень долго.
Хорошо исправлюсь
Так можно?Дело в том что это отработанный вариан, пока жил(более года, 5-10 презагрузок за все это время) в отдельном потоке все было хорошо...
Здравствуйте, Zoya_Pobeda, Вы писали:
Z_P>Хорошо исправлюсь
Зоя, блин, где BSOD???? Напиши, после какой строчки кода све падает?
Z_P>Так можно?Дело в том что это отработанный вариан, пока жил(более года, 5-10 презагрузок за все это время) в отдельном потоке все было хорошо...
Ну, для начала гарантирована утечка ресурсов — кто будет освобождать IRP? Во-вторых, при завершении потока в котором была вызвана ф. TdiBuildInternalDeviceControlIrp может что-то случиться — Вы ведь там в IRP кой-чего подправили. То, что у сервера большой аптайм ниочем не говорит — может просто повезло. Driver Verifier включали?
Да пребудет с тобою сила
Re[6]: Сервер (TDI),BSOD при конекте...
От:
Аноним
Дата:
31.01.07 15:21
Оценка:
Здравствуйте, TarasCo, Вы писали:
TC>Зоя, блин, где BSOD???? Напиши, после какой строчки кода све падает?
TarasCo а как посмотреть, SoftIce-ом я так и не научилась пользоваться...
TC>Ну, для начала гарантирована утечка ресурсов — кто будет освобождать IRP? Во-вторых, при завершении потока в котором была вызвана ф. TdiBuildInternalDeviceControlIrp может что-то случиться — Вы ведь там в IRP кой-чего подправили. То, что у сервера большой аптайм ниочем не говорит — может просто повезло. Driver Verifier включали?
Точно IRP я освобожу.Включала машина зверски тормозит, не возможно работать, перезагрузилась SafeMode вырубила его..
Здравствуйте, Аноним, Вы писали:
TC>>Зоя, блин, где BSOD???? Напиши, после какой строчки кода све падает?
А>TarasCo а как посмотреть, SoftIce-ом я так и не научилась пользоваться...
После BSOD а должен остаться минидамп — его можно открыть в windbg — он покажет стек во время падения + всякую диагностику. Кроме того, каким нибудь отладчиком нужно научиться пользоваться. Если есть вторая машина — лучше пользуйтесь windbg.
А>Точно IRP я освобожу.Включала машина зверски тормозит, не возможно работать, перезагрузилась SafeMode вырубила его..
Так Вы не можете его освобождать — раз выделяли через TdiBuildInternalDeviceControlIrp — система сама должна его освободить
убедительная просьба следить за объемом цитирования — модератор
Даже если и нет второй машины, то работать с WinDbg с виртуальной машиной намного приятнее чем с СофтАйсом, во время отладки есть возможность полазить по докам например.
[от модератора] убедительная просьба следить за объемом цити
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
Извиняюсь за долгое молчание — грипповала
Может я вас не правильно поняла...,но что то у меня что странное твориться стало...
Windbg-ер у меня запустиь не удалось,что бы посмотреть что бы проанализировать дамп-файл,Verifiry тоже какойто кривой выбираю драйвер для ставлю его на проверку,перезагружаюсь...а он не проверяется...Вообщем какаято я не везучая
Но зато я по немногу осваеваю софтАйс, и вот что я выяснела...BSOD происходит уже после выхода и ф-ии TDIClnIoCompRtnAcc, а там уже АСМ и пнять что там происходит я непойму
Z_P>TarasCo правильно ли я вас поняла?
Зоя, Вы меня поняли правильно. Только из TDIClnIoCompRtnAcc необходимо вернуть STATUS_MORE_PROCESSING_REQUIRED, иначе система попытается продолжить завершение IRP вверх по стеку, что приведет к ошибке — ведь в данном случае вы на верхушке.
Z_P>Windbg-ер у меня запустиь не удалось,что бы посмотреть что бы проанализировать дамп-файл,Verifiry тоже какойто кривой выбираю драйвер для ставлю его на проверку,перезагружаюсь...а он не проверяется...Вообщем какаято я не везучая
Вы случайно не в понедельник родились? . Что значит не удалось запустить? Для анализа дамп-файла не нужно никаких особых ухищрений. Запускаете windbg — появляется окно. Дальше в меню файл выбирается соответствующая опция. Если окно не появляется — у Вас какая то проблема с системой — большая вероятность, что система заражена вирусом. На счет верифаера — попробуйте поэкспериментировать, если не получится — создайте отдельныю тему в форуме с подробным описание что и как.
Z_P>Но зато я по немногу осваеваю софтАйс, и вот что я выяснела...BSOD происходит уже после выхода и ф-ии TDIClnIoCompRtnAcc, а там уже АСМ и пнять что там происходит я непойму
Первое дело — нужно научиться просматривать стек. Как правило в нем будет где-нибудь вызов из вашего кода, скорее всего ошибка там. Если уж взялись за айс — разберитесь ОБЯЗАТЕЛЬНО со следующими вопросом: загрузка отладочных символов и трассировка по исходному коду. Я тут не помощник — айсом не пользовался уже два года, на память уже ничего не помню.
Z_P> Извиняюсь за долгое молчание — грипповала
С выздоровлением