Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1] 2  Все   Вниз
  Печать  
Автор Тема: Драйвер-фильтр ip  (Прочитано 39071 раз)
0 Пользователей и 1 Гость смотрят эту тему.
lexer666
Гость
« : 14-04-2007 15:59 » 

Здравствуйте. Пишу драйвер-фильтр NDIS, запрещающий пользователю заходить на сайты, заданные списком ip адресов (похожая фукция есть в OutPost'e "содержимое"). В написании драйверов я новичек, много еще не знаю. Возникли следующие вопросы:
1) В том ли я пошел направлении ("NDIS"), может TDI или вообще юзермод?
2) Сейчас общая структура моего драйвера такая: (поправьте, что не так)
-заполняю структуру NDIS_PROTOCOL_CHARACTERISTICS и регистрирую свой протокол функцией NdisRegisterProtocol для работы с адаптером (отсюда вопрос, как автоматический определить его ID?)
-далее открываю адаптер, вызвав функцию NdisOpenAdapter и NdisOpenAdapterComplete
3) Какой функцией (видимо из структуры NDIS_PROTOCOL_CHARACTERISTICS) и как реализовать перехват пакетов с целью блокирования пакетов идущих на хост, входящий в список запрещенных?
Может у кого-нибь есть исходники или статьи по данной тематике?
Заранее спасибо за помощь!
Записан
aks68
Модератор

il
Offline Offline
Пол: Мужской

« Ответ #1 : 15-04-2007 11:22 » 

Добрый день

1. Если Вы хотите делать только то, что заявленно
Цитата
... запрещающий пользователю заходить на сайты, заданные списком ip адресов...
, то можно ограничиться и TDI-ем. Правда потом иногда заказчик хочет расширить функциональность впрлоть до добавления ф-ции варки кофе Ага...
2. Как я понимаю это NDIS-protocol. Я никогда не пробовал фильтровать с его помощю А черт его знает....
3. Больше подходит по теме NDIS.
   Печатное слово
   Windows DDK help - Network Devices and Protocols
   Сорокина, Щербаков. Программирование драйверов и систем безопасности. http://www.books.ru/shop/books/82267
   
   Примеры:
   Windows DDK samples
      NdisProt - conectionless NDIS Protocol driver sample
      Passthru  - NDIS Intermediate driver sample
   
   Статьи:
   Комментарии к Passthru от ШЕЛЕК  Класс!
   https://club.shelek.ru/viewart.php?id=30
   https://club.shelek.ru/viewart.php?id=31
   https://club.shelek.ru/viewart.php?id=32
   https://club.shelek.ru/viewart.php?id=34
   https://club.shelek.ru/viewart.php?id=55

   NDIS.COM
   http://www.ndis.com/papers/ndispacket/ndispacket1.htm
   http://www.ndis.com/papers/ndispacket/ndispacket2.htm
   
   Форумы:
   https://forum.shelek.ru/index.php/board,13.0.html
   http://www.wasm.ru/forum/viewforum.php?id=12

С уважением,
Акс.
« Последнее редактирование: 15-04-2007 11:24 от aks68 » Записан
lexer666
Гость
« Ответ #2 : 15-04-2007 12:50 » 

Большое спасибо за ответ.
Еще такой вопрос, реализация будет проще используя TDI или NDIS?
Записан
lexer666
Гость
« Ответ #3 : 16-04-2007 12:07 » 

Вот еще: на форуме Kife как-то писал про пример passthru: "...что для фильтровки надо разобрать и нужные "отправить", а ненужные "не отправлять"...". Так passthru предназначен для работы с модемом (интернетом) или он может работать только с сетевой картой? Или вообще без разницы?
Записан
lexer666
Гость
« Ответ #4 : 16-04-2007 13:48 » 

в общем немного разобрался, мне просто нужно модифицировать passthru, чтобы он разбирал пакет, смотрел ip и пропускал его или нет..еще я так понял, что без разницы, что у меня - аналоговый модем, сетевая карта или что-то еще, passthru будет везде работать 
Записан
lexer666
Гость
« Ответ #5 : 22-04-2007 10:18 » 

ура!!!научился находить пакет, идущий на запрещенный адрес (спасибо форуму Улыбаюсь),только сейчас другая проблема: как "правильно" не пустить его нижележащему адаптеру?

я пробовал для остановки пакета в функции MPSendPackets вызвать   NdisMSendComplete(ADAPT_MINIPORT_HANDLE(pAdapt),Packet,NDIS_STATUS_FAILURE), получал BSoD..
Записан
aks68
Модератор

il
Offline Offline
Пол: Мужской

« Ответ #6 : 22-04-2007 13:18 » 

ура!!!научился находить пакет, идущий на запрещенный адрес (спасибо форуму Улыбаюсь),только сейчас другая проблема: как "правильно" не пустить его нижележащему адаптеру?

я пробовал для остановки пакета в функции MPSendPackets вызвать   NdisMSendComplete(ADAPT_MINIPORT_HANDLE(pAdapt),Packet,NDIS_STATUS_FAILURE), получал BSoD..

Привет!

Даже если пакет должен быть отброшен, NDIS-у надо просигналить NDIS_STATUS_SUCCESS, т.к. это означает "работа с пакетом завершена - можно освобождать ресурсы". А для того, что-бы пакет небыл послан - надо просто не вызывать ф-ю NdisSend  Ага (а так-же все ее обрамление). Тоесть код должен выглядеть наподобие:

было
Код:
...
...
...
VOID
MPSendPackets(
    IN NDIS_HANDLE             MiniportAdapterContext,
    IN PPNDIS_PACKET           PacketArray,
    IN UINT                    NumberOfPackets
    )
....
....
....
        if (pAdapt->MPDeviceState > NdisDeviceStateD0)
        {
            NdisMSendComplete(ADAPT_MINIPORT_HANDLE(pAdapt),
                            Packet,
                            NDIS_STATUS_FAILURE);
            continue;
        }

#ifdef NDIS51

        //
        // Use NDIS 5.1 packet stacking:
        //
        {
            PNDIS_PACKET_STACK        pStack;
            BOOLEAN                   Remaining;

            //
            // Packet stacks: Check if we can use the same packet for sending down.
            //
            pStack = NdisIMGetCurrentPacketStack(Packet, &Remaining);
            if (Remaining)
...
...
...


стало
Код:
...
...
...
VOID
MPSendPackets(
    IN NDIS_HANDLE             MiniportAdapterContext,
    IN PPNDIS_PACKET           PacketArray,
    IN UINT                    NumberOfPackets
    )
....
....
....
        if (pAdapt->MPDeviceState > NdisDeviceStateD0)
        {
            NdisMSendComplete(ADAPT_MINIPORT_HANDLE(pAdapt),
                            Packet,
                            NDIS_STATUS_FAILURE);
            continue;
        }

        if (<YOUR_FILTERING_CONDITIONS>) {
            NdisMSendComplete(ADAPT_MINIPORT_HANDLE(pAdapt),
                            Packet,
                            NDIS_STATUS_SUCCESS);
            continue;

        }
#ifdef NDIS51

        //
        // Use NDIS 5.1 packet stacking:
        //
        {
            PNDIS_PACKET_STACK        pStack;
            BOOLEAN                   Remaining;

            //
            // Packet stacks: Check if we can use the same packet for sending down.
            //
            pStack = NdisIMGetCurrentPacketStack(Packet, &Remaining);
            if (Remaining)
...
...
...


С уважением,
Акс.
Записан
lexer666
Гость
« Ответ #7 : 22-04-2007 17:22 » 

aks68 спасибо,теперь все ок! Я же по наивности полагал, что раз пакет отсылаться не будет, то и статус должен быть "ошибка".
Записан
lexer666
Гость
« Ответ #8 : 24-04-2007 21:29 » 

Всем привет еще раз! Сейчас возникла другая проблема. При отправке пакета, мне нужно проверить, идет ли он на запрещенных хост или нет. Для этого я считываю список хостов из файла (построчно) с помощью ZwReadFile и каждый раз получаю BSoD, непонятно по какой причине (
Вот кусок моего кода, посмотрите что не так:   
Код:
VOID MPSendPackets(...)
{
...
NTSTATUS          StatusF;
UNICODE_STRING    fullFileName;
IO_STATUS_BLOCK   iostatus;
OBJECT_ATTRIBUTES oa;
HANDLE            fileHandle;

...   
      RtlInitUnicodeString( &fullFileName,
                            L"\\??\\C:\\test.txt");
InitializeObjectAttributes( &oa,
    &fullFileName,
                                  OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
    NULL,
    NULL );
StatusF = ZwCreateFile (&fileHandle,         
GENERIC_READ,
&oa,
&iostatus,
0,
FILE_ATTRIBUTE_NORMAL,
FILE_SHARE_READ,
FILE_OPEN,
0,
NULL,
0);
 
    for (i = 0; i < NumberOfPackets; i++)
    {
    Packet = PacketArray[i];
    ...
    if(NT_SUCCESS (StatusF) )
    { 
    //похоже ошибка где-то тут: 
    StatusF=ZwReadFile( fileHandle,
NULL,
NULL,
NULL,
&iostatus,
fBuffer,
50,
NULL,
NULL);
    ZwClose(fileHandle);
    }
...
}
« Последнее редактирование: 25-04-2007 15:14 от lexer666 » Записан
aks68
Модератор

il
Offline Offline
Пол: Мужской

« Ответ #9 : 25-04-2007 16:38 » 


Сто тысяч почему:

1. А зачем считывать содержимое файла каждый раз, когда отправляется пакет?
2. А в каком месте валится процедура (точно)?
3. А какой багчек у BSOD? (блин, ребята, не ленитесь добавлять больше информации об BSOD-ах!!!!)
4. А что там вместо многоточия между  Packet = PacketArray[\i] и  if(NT_SUCCESS (StatusF)? (это я к тому, что ZwReadFile должен выполняться на  IRQL = PASSIVE_LEVEL)

С уважением Акс.

PS: ZwReadFile не читает построчно  Ага
Записан
lexer666
Гость
« Ответ #10 : 26-04-2007 10:43 » 

Правильно, буду считывать один раз при инициализации минипорта..исправил код, теперь корректно считывает первую строчку до первого пробела:
Код:
NDIS_STATUS MPInitialize()
{
NTSTATUS          statusF;
UNICODE_STRING    fullFileName;
HANDLE            fileHandle;
IO_STATUS_BLOCK   iostatus;
OBJECT_ATTRIBUTES oa;
UCHAR myBuffer[50];
UINT i;

    //++++++++ReadFile
    RtlInitUnicodeString( &fullFileName,L"\\??\\C:\\testfile.txt");

    InitializeObjectAttributes( &oa,
  &fullFileName,
                                OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
  NULL,
  NULL );

    statusF = ZwCreateFile ( &fileHandle,
     GENERIC_READ,
     &oa,
     &iostatus,
     0, 
     FILE_ATTRIBUTE_NORMAL,
     FILE_SHARE_READ,
     FILE_OPEN,
     FILE_SYNCHRONOUS_IO_ALERT,
     NULL,
     0);

if( NT_SUCCESS(statusF))
{
DbgPrint("Open: success");

for(i=0; i<sizeof(myBuffer); i++)
{
statusF = ZwReadFile(fileHandle,
                                 NULL,
                                 NULL,
                                 NULL,
                                 &iostatus,
                                 &myBuffer[i],
                                 1,   
                                 NULL,     
                                 NULL);
        if(myBuffer[i] == ' ')
        {
         break;
        }
}
if(NT_SUCCESS(statusF))
{
DbgPrint("Reading: success. Read: %s",myBuffer);
}
ZwClose(fileHandle);
}
    //--------ReadFile
 
Вопрос: как переместить курсор на следующую строчку? (это если считывать каждый раз..)
Можно как-нибудь считать весь файл в глобальный список, чтобы потом брать по одному элементу(одна строчка) из списка и искать его в пакете?
« Последнее редактирование: 26-04-2007 20:01 от lexer666 » Записан
lexer666
Гость
« Ответ #11 : 27-04-2007 21:59 » 

Привет!
Цитата
это я к тому, что ZwReadFile должен выполняться на  IRQL = PASSIVE_LEVEL
получается во время отправки пакета читать файл не получится, остается только чтение всего файла сразу во время инициализации минипорта..
Считываю файл в массив, только тут такая проблема: сам файл(откуда считываю) может весить метров 30..получается, если я объявляю массив как глобальную переменную
Код:
UCHAR myBuffer[30000000];
то после компиляции сам драйвер весит эти 30 метров..( Думаю это неправильно. Можно как-нибудь по-другому читать файл, чтобы размер драйвера не был таким огромным?
ps
То, что ZwReadFile читает не построчно это я понял, для разделения слов буду использовать какой-нибуть спецсимвол, например ";" и брать слова из массива только между этими символами.
Записан
aks68
Модератор

il
Offline Offline
Пол: Мужской

« Ответ #12 : 30-04-2007 07:31 » 

1. 30 мегабайт?!!! Ты что весь Интернет перекрыть хочешь?

2. Используй динамически распределяемую память. Чтобы доставать ее из-под IRQL > PASSIVE_LEVEL она должна быть невыгружаемой (nonpaged).
  • ZwCreaterFile
  • ZwQueryInformationFile
  • NdisAllocateMemoryWithTag
  • ZwReadFile
  • ZwClose

3.
Код:
UCHAR myBuffer[30000000];
Не может быть... Не надо Я зол! С ума сойти...  Фу!!!!

С уважением,
Акс.
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #13 : 30-04-2007 10:12 » 

UCHAR myBuffer[30000000];

гы))) жесть))))))))
никогда так не делайте) я вообще против статических переменных в драйвере... ибо нефиг)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
lexer666
Гость
« Ответ #14 : 30-04-2007 12:03 » 

aks68,Ochkarik, спасибо. Жесть-самое подходящее название моему коду...просто не знал как исправить.А черт его знает... Теперь все ок. 
Цитата
30 мегабайт?!!! Ты что весь Интернет перекрыть хочешь?
переборщил, не более 3-5 метров..
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #15 : 30-04-2007 13:17 » 

aks68,
я по сетевым драйверам вообще не в зуб ногой... но там вроде как говорилось что рекомендуют только NdisXXXXXXXXX функции использовать? или это только для портабельности между разными платформами? к вопросу о использовании ZwCreateFile...

lexer666,
мне спасибо не за что))) я ток по PCI&1394 плавал) к слову единственное где применял статические(даже сказал бы статическУЮ!) переменную - в PCI, там надо было число одинаковых PCI плат считать. она автоматом глобальной-расшаренной получалась, на оба девайса. ну и немного для отладки юзал) а так - все в DevExt структуре...
« Последнее редактирование: 30-04-2007 13:23 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
aks68
Модератор

il
Offline Offline
Пол: Мужской

« Ответ #16 : 01-05-2007 15:09 » 

aks68,
я по сетевым драйверам вообще не в зуб ногой... но там вроде как говорилось что рекомендуют только NdisXXXXXXXXX функции использовать? или это только для портабельности между разными платформами? к вопросу о использовании ZwCreateFile...

Здравствуйте!

Вы сударь меня смутили однако...  А черт его знает... Ползовался я ф-циями ZwXxx в IM драйвере и типа все работало. Даже через утилиты HCT-лаборатории пролезло, и цифровой сертификат получило  Скромно так...(правда я необращал внимания на warnings, а только на errors), однако Вы абсолютно правы - есть в наборе NdisXXX ф-я NdisOpenFile!

Короче провел я маленькое исследование и вот что получилось. Заранее оговорюсь, все нижесказанное сугубо IMHO, полученное путем рассуждений, толкования DDK и дизассемблирования кусков кода из NDIS.SYS.

Итак:
1. Microsoft экспортирует через NdisXXX только ту функциональность, которая по их мнению понадобится программеру драйверов

минипорта
Цитата
A miniport driver communicates with its NIC and with higher-level drivers through the NDIS library. The NDIS library exports a full set of functions (NdisXxx functions) that encapsulate all the operating system functions that a miniport driver needs to call.

и протокола
Цитата
The protocol driver calls NdisXxx functions to send packets, read and set information maintained by lower-level drivers, and use operating system services

2. В NDIS API есть ф-я для доступа к содержимому файла NdisOpenFile.
Однако меня там смутили коментарии, которые говорили только про использование этой ф-и в минипорте для загрузки информации в "умные сетевые карты". Попытка открыть файл из IM спомощю этой ф-и у меня обомилась, сообщение которое я получил (используя отладочную версию NDIS.SYS) показало, что система пытается открыть файл в %WINDIR%\system32\drivers\<file>. А в дизасемблере я увидел, что ф-я приделывает к имени файла этот самый префикс! Т.е. NdisOpenFile позволяет читать только из системной области диска. А это в свою очередь согласуется с рекомендациями Майкрософта про конфигурирование "умных сетевых карт" - типа INF файл копирует некий файл данных в системную область диска и потом спомощю него инициализируется сетевая карта. Правда про это в DDK нислова, а может я поверхностно искал...

3. Значит использовать NdisOpenFile для чтения произвольного файла (как минимум с наскока)  неполучается Жаль.


Хотя ,например, моя практика показывает, что ZwXxx пользоватся можно, однако для нашего случая (загрузка правил в драйвер-фильтр) можно этого избежать, слегка подправив архитектуру. Поскольку в любом случае для фильтра надо будет писать управляющую программу в user mode, можно в ней считать из файла в память и передать этот указатель драйверу. Это к тому-же добавит очков продукту, т.к. позволит перегружать правила "на лету", использовать подстановки в адресах итд.

Вот в кратце и все.

 Улыбаюсь

С уважением,
Акс.

Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #17 : 01-05-2007 16:24 » 

а кроме того  NdisOpenFile  может быть вызвана только из MiniportInitialize как там написано... и перед выходом из нее надо NdisCloseFile. хм) то есть доступ к файлу только при инициализации? или это полюбому будет?

уж не помню где я обрывком слышал... что мол вся эта суета с Ndis функциями была сделана для возможности портирования драйвера в другие операционки... там же половина функций повторяет обычные) только вот не помню откуда я это...)

а в описании на нее - вроде не сказано что путь только %WINDIR%\system32\drivers\?...

PS да, посерчил по нету... действительно путь такой должен быть http://www.osronline.com/lists_archive/ntdev/thread3031.html

а вообще NDIS функции затеяны чтобы портировать сам драйвер между различными ОС. видимо поэтому и путь жестко задали)
в общем - опачки)

PPS
lexer666,
докучи пример типа http://union2.ru/forum/index.php?showtopic=4788&st=60 походу тоже какая то фильтрация трафика.
« Последнее редактирование: 02-05-2007 12:02 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
aks68
Модератор

il
Offline Offline
Пол: Мужской

« Ответ #18 : 02-05-2007 12:49 » 

а кроме того  NdisOpenFile  может быть вызвана только из MiniportInitialize как там написано... и перед выходом из нее надо NdisCloseFile. хм) то есть доступ к файлу только при инициализации? или это полюбому будет?

уж не помню где я обрывком слышал... что мол вся эта суета с Ndis функциями была сделана для возможности портирования драйвера в другие операционки... там же половина функций повторяет обычные) только вот не помню откуда я это...)

а в описании на нее - вроде не сказано что путь только %WINDIR%\system32\drivers\?...

PS да, посерчил по нету... действительно путь такой должен быть http://www.osronline.com/lists_archive/ntdev/thread3031.html

а вообще NDIS функции затеяны чтобы портировать сам драйвер между различными ОС. видимо поэтому и путь жестко задали)
в общем - опачки)

PPS
lexer666,
докучи пример типа http://union2.ru/forum/index.php?showtopic=4788&st=60 походу тоже какая то фильтрация трафика.

По поводу самой ф-и, как я понимаю, нет ничего страшного использовать ее и в других местах кода, лишь бы текущий IRQL соответствовал. Тоесть требования MS, ограничивающие область применения IMHO введены для дисциплинирования программиста, и  принуждения оного делать так, как положенно, а не так как ему хочется...

Хотя, если посмотреть шире, то вообще непонятно для чего драйверу надо иметь длительное время открытый  дескриптор файла. Загрузка/сохранение конфигурации при начале/завершении работы это ясно, что-то еще?

С уважением Акс.
Записан
aks68
Модератор

il
Offline Offline
Пол: Мужской

« Ответ #19 : 02-05-2007 12:59 » 

Сейчас у меня что-то форум глючит, немогу прицепить кусок дампа из IDA с этой ф-ей...
Может по позже.

Акс.
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #20 : 02-05-2007 15:22 » 

ну... переинициализация например? тех же списков заблокированных сайтов. правда не знаю как там все работает... и есть ли принципиально такая возможность вообще...
дапм... да я в общем вряд ли буду смотреть) я ж сам не занимаюсь) остальным если только...
кстати а эти функции сохранять вообще позволяют?)

« Последнее редактирование: 02-05-2007 15:25 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
lexer666
Гость
« Ответ #21 : 04-05-2007 22:03 » 

Привет.Ага Блокирую сайт я не по ip, а по содержанию строчки в адресе (пока ищу только во всем пакете). И тут начинаются сильные тормоза при увеличении кол-ва блокируемых сайтов. Я так понял сначала мне нужно определить тип пакета (есть ли в начале пакета GET или POST). Если запрос на открытие страницы, то нужно искать в нем. Далее нужно как-то добраться до адреса..Тут и начинается проблема..Например при запросе из Opera адрес находится на смещении 135 байт в пакете, из IE на 521 байт и тд. (в аттаче запросы google.ru c трех браузеров). Можно ли добраться до URL, не просматривая весь пакет? Реально ли оптимизировать код так, чтобы без тормозов блокировать около 500 тыс. сайтов?! Не понял Может нужно блокировать только по ip в таком случае?

PPS
lexer666,
докучи пример типа http://union2.ru/forum/index.php?showtopic=4788&st=60 походу тоже какая то фильтрация трафика.
Спасибо.

Хотелось бы до конца разобраться с памятью. Почему в драйверах обязательно использовать динамические переменные, а не статические?
Цитата
я вообще против статических переменных в драйвере ибо нефиг)
Различаются ли они по скорости работы с данными? Сейчас я правильно работаю с памятью?
Код:
PCHAR myBuffer;//глобальная переменная
statusF = NdisAllocateMemoryWithTag(&myBuffer,5000000,'maDN');

Заранее спасибо за помощь.

* google.ru_IE.txt (0.48 Кб - загружено 986 раз.)
* google.ru_mozilla.txt (0.5 Кб - загружено 944 раз.)
* google.ru_opera.txt (0.56 Кб - загружено 957 раз.)
« Последнее редактирование: 06-05-2007 08:31 от lexer666 » Записан
lexer666
Гость
« Ответ #22 : 04-05-2007 22:09 » 

Хотя, если посмотреть шире, то вообще непонятно для чего драйверу надо иметь длительное время открытый  дескриптор файла. Загрузка/сохранение конфигурации при начале/завершении работы это ясно, что-то еще?
Может чтобы не давать его редактировать,удалять и т.д. из юзермода?
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #23 : 05-05-2007 11:33 » 

lexer666,
да нет, в принципе никто конечно не запрещиет статические переменные использовать, но надо ясно понимать зачем они вообще нужны в конкретном случае, и нужны ли вобоще:

1. если вам необходима их инициализация определенными значениями при старте: при старте эти переменные инициализируются указанными значениями(по умолчанию нулями кажется). поэтому все это должно хранится фактически в то же модуле. при больших объемах - как-то некрасиво получается) а если необходима инициализация нулями - тогда вообще смешно - гораздо эффективнее выделить и обнулить необходимое количество памяти чем хранить уйму нулей. но если массив большой - опять же, хранить в отдельном файле..  изящнее) и перекомпиляция не нужна если что то поменять требуется.

2. необходимость иметь расшаренные переменные для доступа из любого контекста. например у меня такие переменные используются для подсчета числа одинаковых PCI плат которые обслуживаются одним драйвером. тут понятно: больше негде хранить. DevExt - свой для кажого устройства, поэтому не подходит, работать через реестр не всегда возможно...

3. необходимость хранения каких либо констант...

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

в общем использование явной инициализации более... короче расслабится не дает)) во всех случаях) и рефлекторно проверяешь переменную на предмет инициализации перед тем как ее использовать)

конечно все это мое корявое ИМХО... мож кто поправит, но думаю не сильно)

PS да, по скорости - разницы нет. память она и есть память)

PPS
PCHAR myBuffer;//глобальная переменная
statusF = NdisAllocateMemoryWithTag(&myBuffer,5000000,'maDN');
так лучше) хотя я бы, myBuffer поместил в DevExt))))
но это от задачи зависит)
« Последнее редактирование: 05-05-2007 11:36 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
aks68
Модератор

il
Offline Offline
Пол: Мужской

« Ответ #24 : 07-05-2007 10:50 » 

Хотя, если посмотреть шире, то вообще непонятно для чего драйверу надо иметь длительное время открытый  дескриптор файла. Загрузка/сохранение конфигурации при начале/завершении работы это ясно, что-то еще?
Может чтобы не давать его редактировать,удалять и т.д. из юзермода?
Оп-па!
А ненаходите-ли Вы, что если драйвер должен беспокоится об возможных изменениях его конф. файла помещенного в системную область на диске (!), то что-то нетак в самой системе?
Записан
aks68
Модератор

il
Offline Offline
Пол: Мужской

« Ответ #25 : 07-05-2007 11:08 » 

ну... переинициализация например? тех же списков заблокированных сайтов. правда не знаю как там все работает... и есть ли принципиально такая возможность вообще...
дапм... да я в общем вряд ли буду смотреть) я ж сам не занимаюсь) остальным если только...
кстати а эти функции сохранять вообще позволяют?)



Для переинициализации лучше использовать функции инициализации  Ага , а если хотим поменять лишь часть данных, то давайте посмотрим откуда они (изменения) как правило в системе берутся? Наверное из UserMode? Т.е. по всякому - IOCTL. А в самом UserMode есть API для работы с файлами побогаче, чем эти дохленькие ZwXxxFile.

Разнообразие Kernel Mode API под Windows может сыграть отрицательную роль Курилка. Люди перешедшие из User Mode неразобравшись продолжат писать по-своему (по юсермодному), что чревато...

Вон в Линуксе  Я ужас, летящий на крыльях ночи например код ядра неможет достучатся до файловой системы (точнее с ай-нодами работать конечно можно, но это ведь не тоже самое, что и десриптор файла) и ничего  Улыбаюсь
Записан
lexer666
Гость
« Ответ #26 : 07-05-2007 13:22 » 

Цитата
Оп-па!
А ненаходите-ли Вы, что если драйвер должен беспокоится об возможных изменениях его конф. файла помещенного в системную область на диске (!), то что-то нетак в самой системе?
Можно подробней про системную облать...как его туда поместить?
Записан
aks68
Модератор

il
Offline Offline
Пол: Мужской

« Ответ #27 : 07-05-2007 15:32 » 

Можно подробней про системную облать...как его туда поместить?

Пожалуйста   Ага
Код:
c:/>copy c:\MyConfig.txt %WINDIR%\system32\drivers

Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #28 : 08-05-2007 06:50 » 

aks68,
впринципе - логично) хотя мне на первый взгляд не очень нравится, когда такая "смена" конфигурации фактически задублирована; то есть чтобы сохранить ее изменения - необходимо дать IOCTL драйверу с параметрами, потом те же параметры дописать в конф. файл. хотя другого варианта пожалуй и нет...реестр из NDISов скорее всего тоже недоступен? (это так... к слову)
а IOCTL в NDISах - есть?)
я почему спрашиваю... уж если правильный NDIS драйвер совместим по исходным кодам с другими ОС, то скорее всего он такие функции поддерживать не должен?)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
aks68
Модератор

il
Offline Offline
Пол: Мужской

« Ответ #29 : 08-05-2007 11:09 » 

to Ochkarik:

Цитата
впринципе - логично) хотя мне на первый взгляд не очень нравится, когда такая "смена" конфигурации фактически задублирована; то есть чтобы сохранить ее изменения - необходимо дать IOCTL драйверу с параметрами, потом те же параметры дописать в конф. файл.
Давайте сначала посмотрим немного шире. Не на драйвер как таковой, а на драйвер, как часть системы (в нашем случае - системы фильтрации). Так вот если проанализировать все use cases то обнаружится, что практически любой запрос на изменение конфигурации ( в нашем случае изменения списка блокированных адресов) приходит снаружи - т.е. от актанта (в нашем случае это руководство, администрация, тех. персонал - кто угодно, но все это ЛЮДИ, т.е. внешние обьекты по отношению к системе) через систему взаимодействия с актантом - сиречь приложением из User Mode. При этом вызова IOCTL нам никак не избежать.

Но при этом в Вашем случае надо вызывать 2 аппликации:

Код:
1)user : file editor -> read(f,m) -> update(m) -> write(f,m)
2) user : mgmt_app -> IOCTL -> driver -> read(f,m) -> use(m)

А в моем только одну:

Код:
User : mgmt_app -> update(m) -> save(f,m) -> IOCTL(m) ->driver-> use(m)

Где m – это память в которую считали правила фильтрации

Ну и кроме того в рантайме используются данные загруженные в память, а в файл они не дублируются, а сохраняются для первичной- (после выключения питания) или пере- инициализации (в случае если рантайм конфигурацию необходимо обнулить). Так что никакого оверхеда...

Цитата
хотя другого варианта пожалуй и нет...реестр из NDISов скорее всего тоже недоступен? (это так... к слову)

Все доступно через описатель обьектов (object handle) и ф-ции ZwXxxXxx, и, хотя это не рекомендуемый подход, вполне себе работает.

Цитата
а IOCTL в NDISах - есть?) я почему спрашиваю... уж если правильный NDIS драйвер совместим по исходным кодам с другими ОС, то скорее всего он такие функции поддерживать не должен?)

IOCTL - стандартная функция драйвера, независимо от OS. Более того, он именно для этого и предназначается (чтобы управлять работой драйвера в рантайм), а все остальные возможности, IMHO, от лукавого...
Пример из Пастру DriverEntry -> MPInitialize -> PtRegisterDevice:
 
Код:
       DispatchTable[IRP_MJ_CREATE] = PtDispatch;
        DispatchTable[IRP_MJ_CLEANUP] = PtDispatch;
        DispatchTable[IRP_MJ_CLOSE] = PtDispatch;
        DispatchTable[IRP_MJ_DEVICE_CONTROL] = PtDispatch;

А в PtDispatch:

Код:
NTSTATUS
PtDispatch(
    IN PDEVICE_OBJECT    DeviceObject,
    IN PIRP              Irp
    )
{
    PIO_STACK_LOCATION  irpStack;
    NTSTATUS            status = STATUS_SUCCESS;

    UNREFERENCED_PARAMETER(DeviceObject);
   
    DBGPRINT(("==>Pt Dispatch\n"));
    irpStack = IoGetCurrentIrpStackLocation(Irp);
     

    switch (irpStack->MajorFunction)
    {
        case IRP_MJ_CREATE:
            break;
           
        case IRP_MJ_CLEANUP:
            break;
           
        case IRP_MJ_CLOSE:
            break;       
           
        case IRP_MJ_DEVICE_CONTROL:
            //
            // Add code here to handle ioctl commands sent to passthru.
            //
            break;       
        default:
            break;
    }

    Irp->IoStatus.Status = status;
    IoCompleteRequest(Irp, IO_NO_INCREMENT);

    DBGPRINT(("<== Pt Dispatch\n"));

    return status;

}
С уважением,
Акс.

PS: NdisOpenFile открывает файл только для чтения.
Записан
Страниц: [1] 2  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines