TDI FILTER driver

Home Forums Discussions General TDI FILTER driver

Viewing 15 posts - 16 through 30 (of 62 total)
  • Author
    Posts
  • #6291
    Vadim Smirnov
    Keymaster

      SerpentFly, помоги пожалуйста.. Все что я смог сделать я отобразил это в коде.. Я реально зашел в тупик.. Помоги пожалуйста..

      ClientEventReceive это не единственный event handler, который нужно перехватить, есть еще ClientEventReceiveExpedited, ClientEventChainedReceive.

      И подскажите пожалуйста как вытащить принятые пакеты и от куда их вообще нужно вытаскивать, из Tsdu?

      Да, вообще повнимательней читай DDK, там все написано в комментариях к event handler’ам.

      #6292
      Dmitry_177
      Participant

        Я понимаю что несколько Event-ов нужно перехватывать.. Но у меня этот код почему-то постоянно синий экран выдает… никак не могу понять почему..=(

        #6293
        Vadim Smirnov
        Keymaster

          Но у меня этот код почему-то постоянно синий экран выдает… никак не могу понять почему.

          А отладчик на что?

          #6294
          Dmitry_177
          Participant

            Soft-ICE у меня не запускается почему-то.. Что я только не делал.. И разные версии ставил и саму DriverStudio полную.. И на всяких форумах искал ответа и в гугле, не работает почему-то он у меня и все.. 🙁 Может из за того что у меня ноут..

            А для WinDBG нужен второй комп.. И еще, везде пишут что он входит в состав DDK, у меня его почему-то нету.. Еще искал файл windbg.exe(точно не помню сейчас его название, но на каком-то форуме видел его правильное название) ничего не нашлось.. 🙁

            Других отладчиков под ring0 я не знаю..

            А сдавать мне уже совсем скоро.. Скорей всего у меня перехват как-то неправильно устанавливается.. SerpentFly, помоги пожалуйста, очень надо..

            #6295
            Vadim Smirnov
            Keymaster

              WinDBG:

              http://www.microsoft.com/whdc/devtools/debugging/default.mspx

              Конфигурирование для работы с VMWare (вместо второй машины используем виртуальную):

              http://silverstr.ufies.org/lotr0/windbg-vmware.html

              Для SoftIce нужно скачать последний osinfo.dat, хотя если он перестал обновляться то может и не заработает.

              #6296
              Dmitry_177
              Participant

                Я как понимаю нужно VMWare скачать для создания виртуальной машины.. Зашел на сайт http://www.vmware.com/products/ и суда http://www.vmware.com/download/home.html а там много разных программ.. а какая мне нужна?

                #6297
                Vadim Smirnov
                Keymaster

                  Лучше использовать VMWare Workstation, 30 дневная триал лицензия к ней прилагается.

                  #6298
                  Dmitry_177
                  Participant

                    Установил, VMware Workstation, создал там виртуальный комп, установил там ось.. Потом установил VMWare Tools, расшарил полностью диск С, так мне проще.. А вот как отлаживать драйвер? На ВМ нужно установить WinDBG и что дальше?

                    Из той статьи не понятно где искать этот “Configuration Editor” написано что Settings->Configuration Editor, но что-то нигде в настройках не найду его что-то..

                    #6299
                    Dmitry_177
                    Participant

                      нашел..=) оказывается это при выключенной винде на ВМ есть..

                      #6300
                      Dmitry_177
                      Participant

                        Разобрался я немного с отладчиком… Из него я как понял драйвер валится на этом:
                        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 не понимаю…

                        #6301
                        Vadim Smirnov
                        Keymaster

                          Первым делом, я бы проверил валидность сохраненных обработчика и контекста, а вообще смотреть нужно почему оригинап выпетает.

                          Не вижу всего кода, но если pBlockFromPagedLookasideList действительно аппокирован из paged pool, то падает вполне закономерно, так как ClientEventReceive вызывается на IRQL_DISPATCH_LEVEL.

                          #6302
                          Dmitry_177
                          Participant

                            Я выкладывал код в своем посте: 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;
                            #6303
                            Vadim Smirnov
                            Keymaster

                              Ну если так, то я сдаюсь и ошибка все-таки в ДНК 😆

                              Структура g_pPagedLookasideList аллокирована в NonPagedPool, но сам lookaside list при этом paged (ExInitializePagedLookasideList), другими словами все элеиенты в нем allocated from PagedPool. И использовать их на IRQL_DISPATCH_LEVEL низзя 😈

                              #6304
                              Dmitry_177
                              Participant

                                И использовать их на IRQL_DISPATCH_LEVEL низзя

                                Ведь при компиляции в DDK при неверном IRQL на сколько я знаю он должен выдавать ошибку..

                                Вообще если есть желание, то я могу куда-нибудь залить свой этот драйвер с исходниками.. Просто я не понимаю почему он не работает.. 👿

                                #6305
                                Vadim Smirnov
                                Keymaster

                                  Ведь при компиляции в DDK при неверном IRQL на сколько я знаю он должен выдавать ошибку..

                                  С чего бы это? Если бы компилятор вдавался в такие тонкости – цены бы ему не было.

                                  Вообще если есть желание, то я могу куда-нибудь залить свой этот драйвер с исходниками.. Просто я не понимаю почему он не работает.

                                  Я вроде явную ошибку указал, если BSOD был с кодом IRQL_NOT_LESS_OR_EQUAL то это тебе второе подтверждение. Поменяй paged lookaside list на non paged lookaside list и будет тебе счастье.

                                  А вообще, неплохо было бы книжек почитать прежде чем драйвера писать…

                                Viewing 15 posts - 16 through 30 (of 62 total)
                                • You must be logged in to reply to this topic.