Home › Forums › Discussions › General › TDI FILTER driver
- This topic has 61 replies, 2 voices, and was last updated 17 years, 4 months ago by Dmitry_177.
-
AuthorPosts
-
June 28, 2007 at 1:45 pm #6291
SerpentFly, помоги пожалуйста.. Все что я смог сделать я отобразил это в коде.. Я реально зашел в тупик.. Помоги пожалуйста..
ClientEventReceive это не единственный event handler, который нужно перехватить, есть еще ClientEventReceiveExpedited, ClientEventChainedReceive.
И подскажите пожалуйста как вытащить принятые пакеты и от куда их вообще нужно вытаскивать, из Tsdu?
Да, вообще повнимательней читай DDK, там все написано в комментариях к event handler’ам.
June 28, 2007 at 2:31 pm #6292Я понимаю что несколько Event-ов нужно перехватывать.. Но у меня этот код почему-то постоянно синий экран выдает… никак не могу понять почему..=(
June 28, 2007 at 2:38 pm #6293Но у меня этот код почему-то постоянно синий экран выдает… никак не могу понять почему.
А отладчик на что?
June 30, 2007 at 4:16 pm #6294Soft-ICE у меня не запускается почему-то.. Что я только не делал.. И разные версии ставил и саму DriverStudio полную.. И на всяких форумах искал ответа и в гугле, не работает почему-то он у меня и все.. 🙁 Может из за того что у меня ноут..
А для WinDBG нужен второй комп.. И еще, везде пишут что он входит в состав DDK, у меня его почему-то нету.. Еще искал файл windbg.exe(точно не помню сейчас его название, но на каком-то форуме видел его правильное название) ничего не нашлось.. 🙁
Других отладчиков под ring0 я не знаю..
А сдавать мне уже совсем скоро.. Скорей всего у меня перехват как-то неправильно устанавливается.. SerpentFly, помоги пожалуйста, очень надо..
June 30, 2007 at 10:36 pm #6295WinDBG:
http://www.microsoft.com/whdc/devtools/debugging/default.mspx
Конфигурирование для работы с VMWare (вместо второй машины используем виртуальную):
http://silverstr.ufies.org/lotr0/windbg-vmware.html
Для SoftIce нужно скачать последний osinfo.dat, хотя если он перестал обновляться то может и не заработает.
July 1, 2007 at 9:32 am #6296Я как понимаю нужно VMWare скачать для создания виртуальной машины.. Зашел на сайт http://www.vmware.com/products/ и суда http://www.vmware.com/download/home.html а там много разных программ.. а какая мне нужна?
July 1, 2007 at 10:34 am #6297Лучше использовать VMWare Workstation, 30 дневная триал лицензия к ней прилагается.
July 1, 2007 at 1:23 pm #6298Установил, VMware Workstation, создал там виртуальный комп, установил там ось.. Потом установил VMWare Tools, расшарил полностью диск С, так мне проще.. А вот как отлаживать драйвер? На ВМ нужно установить WinDBG и что дальше?
Из той статьи не понятно где искать этот “Configuration Editor” написано что Settings->Configuration Editor, но что-то нигде в настройках не найду его что-то..
July 1, 2007 at 1:36 pm #6299нашел..=) оказывается это при выключенной винде на ВМ есть..
July 1, 2007 at 6:40 pm #6300Разобрался я немного с отладчиком… Из него я как понял драйвер валится на этом:
return OldClientEventReceive(pBlockFromPagedLookasideList->EventContext,ConnectionContext,
ReceiveFlags,
BytesIndicated,
BytesAvailable,
*BytesTaken,
Tsdu,
*IoRequestPacket);`
из функции HookedClientEventReceive, а она вот так выглядит:
NTSTATUS HookedClientEventReceive(IN PVOID TdiEventContext, IN CONNECTION_CONTEXT ConnectionContext, IN ULONG ReceiveFlags, IN ULONG BytesIndicated, IN ULONG BytesAvailable, OUT ULONG *BytesTaken, IN PVOID Tsdu, OUT PIRP *IoRequestPacket) { UCHAR *sduBuffer; PCLIENTEVENTRECEIVECONTEXT pBlockFromPagedLookasideList; OLDCLIENTEVENTRECEIVE OldClientEventReceive; _asm // ýòî ÿ äåëàë äëÿ ïðåðûâàíèÿ, äëÿ îòëàäêè.. { int 3 } pBlockFromPagedLookasideList = TdiEventContext; OldClientEventReceive = pBlockFromPagedLookasideList->EventHandler; _asm { int 3 } sduBuffer = Tsdu; DbgPrint("tdi_sniffer TDI_RECEIVE:n"); DbgPrint(sduBuffer); _asm { int 3 } // âîò òà ýòîì OldClientEventReceive âàëèòñÿ.. return OldClientEventReceive(pBlockFromPagedLookasideList->EventContext, ConnectionContext, ReceiveFlags, BytesIndicated, BytesAvailable, *BytesTaken, Tsdu, *IoRequestPacket); }
Вобщем все прерывания срабатывают.. DbgPrint пишет принятый первый пакет только.. А потом драйвет сваливается.. Я как понял на этой строке, но что в ней не так никак не пойму… По идее я присваиваю OldClientEventReceive оригинальный адрес из EventHandler-а а в pBlockFromPagedLookasideList->EventContext по идее содержится оригинальный контекст.. и почему BSOD не понимаю…
July 2, 2007 at 7:15 am #6301Первым делом, я бы проверил валидность сохраненных обработчика и контекста, а вообще смотреть нужно почему оригинап выпетает.
Не вижу всего кода, но если pBlockFromPagedLookasideList действительно аппокирован из paged pool, то падает вполне закономерно, так как ClientEventReceive вызывается на IRQL_DISPATCH_LEVEL.
July 2, 2007 at 3:40 pm #6302Я выкладывал код в своем посте: Posted:Wed Jun 27, 2007 12:02 am. Он практически так и не изменился, добавились только прерывания..
Не вижу всего кода, но если pBlockFromPagedLookasideList действительно аппокирован из paged pool, то падает вполне закономерно, так как ClientEventReceive вызывается на IRQL_DISPATCH_LEVEL.
У меня pBlockFromPagedLookasideList находится в НЕСТРАНИЧНОЙ ПАМЯТИ(NonPagedPool)! Вот:
g_pPagedLookasideList = ExAllocatePool(NonPagedPool, sizeof(PAGED_LOOKASIDE_LIST)); ExInitializePagedLookasideList(g_pPagedLookasideList, NULL, NULL, 0, sizeof(CLIENTEVENTRECEIVECONTEXT), 'tdis', 0); InitializeListHead(&g_ClientEventReceiveListHead); ......... ..... ...... ..... pBlockFromPagedLookasideList = ExAllocateFromPagedLookasideList(g_pPagedLookasideList); memset(pBlockFromPagedLookasideList, 0, sizeof(CLIENTEVENTRECEIVECONTEXT)); InsertHeadList(&g_ClientEventReceiveListHead, &pBlockFromPagedLookasideList->ListEntry); // ñîõðàíÿåì îðèãèíàë ôóíêöèè â ñòðóêòóðå pBlockFromPagedLookasideList->EventHandler = ((PTDI_REQUEST_KERNEL_SET_EVENT)&irpStack->Parameters)->EventHandler; // ñîõðàíÿåì îðèãèíàë êîíòåêñòà â ñòðóêòóðå pBlockFromPagedLookasideList->EventContext = ((PTDI_REQUEST_KERNEL_SET_EVENT)&irpStack->Parameters)->EventContext; ((PTDI_REQUEST_KERNEL_SET_EVENT)&irpStack->Parameters)->EventHandler = HookedClientEventReceive; ((PTDI_REQUEST_KERNEL_SET_EVENT)&irpStack->Parameters)->EventContext = pBlockFromPagedLookasideList;
July 2, 2007 at 6:08 pm #6303Ну если так, то я сдаюсь и ошибка все-таки в ДНК 😆
Структура g_pPagedLookasideList аллокирована в NonPagedPool, но сам lookaside list при этом paged (ExInitializePagedLookasideList), другими словами все элеиенты в нем allocated from PagedPool. И использовать их на IRQL_DISPATCH_LEVEL низзя 😈
July 2, 2007 at 6:21 pm #6304И использовать их на IRQL_DISPATCH_LEVEL низзя
Ведь при компиляции в DDK при неверном IRQL на сколько я знаю он должен выдавать ошибку..
Вообще если есть желание, то я могу куда-нибудь залить свой этот драйвер с исходниками.. Просто я не понимаю почему он не работает.. 👿
July 2, 2007 at 6:48 pm #6305Ведь при компиляции в DDK при неверном IRQL на сколько я знаю он должен выдавать ошибку..
С чего бы это? Если бы компилятор вдавался в такие тонкости – цены бы ему не было.
Вообще если есть желание, то я могу куда-нибудь залить свой этот драйвер с исходниками.. Просто я не понимаю почему он не работает.
Я вроде явную ошибку указал, если BSOD был с кодом IRQL_NOT_LESS_OR_EQUAL то это тебе второе подтверждение. Поменяй paged lookaside list на non paged lookaside list и будет тебе счастье.
А вообще, неплохо было бы книжек почитать прежде чем драйвера писать…
-
AuthorPosts
- You must be logged in to reply to this topic.