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) и как реализовать перехват пакетов с целью блокирования пакетов идущих на хост, входящий в список запрещенных? Может у кого-нибь есть исходники или статьи по данной тематике? Заранее спасибо за помощь!
|
|
|
Записан
|
|
|
|
|
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
|
|
« Ответ #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
|
|
« Ответ #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
|
|
« Ответ #12 : 30-04-2007 07:31 » |
|
1. 30 мегабайт?!!! Ты что весь Интернет перекрыть хочешь? 2. Используй динамически распределяемую память. Чтобы доставать ее из-под IRQL > PASSIVE_LEVEL она должна быть невыгружаемой (nonpaged). - ZwCreaterFile
- ZwQueryInformationFile
- NdisAllocateMemoryWithTag
- ZwReadFile
- ZwClose
3. UCHAR myBuffer[30000000]; Фу!!!! С уважением, Акс.
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #13 : 30-04-2007 10:12 » |
|
UCHAR myBuffer[30000000];
гы))) жесть)))))))) никогда так не делайте) я вообще против статических переменных в драйвере... ибо нефиг)
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
lexer666
Гость
|
|
« Ответ #14 : 30-04-2007 12:03 » |
|
aks68, Ochkarik, спасибо. Жесть-самое подходящее название моему коду...просто не знал как исправить. Теперь все ок. 30 мегабайт?!!! Ты что весь Интернет перекрыть хочешь? переборщил, не более 3-5 метров..
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #15 : 30-04-2007 13:17 » |
|
aks68, я по сетевым драйверам вообще не в зуб ногой... но там вроде как говорилось что рекомендуют только NdisXXXXXXXXX функции использовать? или это только для портабельности между разными платформами? к вопросу о использовании ZwCreateFile...
lexer666, мне спасибо не за что))) я ток по PCI&1394 плавал) к слову единственное где применял статические(даже сказал бы статическУЮ!) переменную - в PCI, там надо было число одинаковых PCI плат считать. она автоматом глобальной-расшаренной получалась, на оба девайса. ну и немного для отладки юзал) а так - все в DevExt структуре...
|
|
« Последнее редактирование: 30-04-2007 13:23 от Ochkarik »
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
aks68
|
|
« Ответ #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
|
|
« Ответ #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 уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
aks68
|
|
« Ответ #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
|
|
« Ответ #19 : 02-05-2007 12:59 » |
|
Сейчас у меня что-то форум глючит, немогу прицепить кусок дампа из IDA с этой ф-ей... Может по позже.
Акс.
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #20 : 02-05-2007 15:22 » |
|
ну... переинициализация например? тех же списков заблокированных сайтов. правда не знаю как там все работает... и есть ли принципиально такая возможность вообще... дапм... да я в общем вряд ли буду смотреть) я ж сам не занимаюсь) остальным если только... кстати а эти функции сохранять вообще позволяют?)
|
|
« Последнее редактирование: 02-05-2007 15:25 от Ochkarik »
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
lexer666
Гость
|
|
« Ответ #21 : 04-05-2007 22:03 » |
|
Привет. Блокирую сайт я не по ip, а по содержанию строчки в адресе (пока ищу только во всем пакете). И тут начинаются сильные тормоза при увеличении кол-ва блокируемых сайтов. Я так понял сначала мне нужно определить тип пакета (есть ли в начале пакета GET или POST). Если запрос на открытие страницы, то нужно искать в нем. Далее нужно как-то добраться до адреса..Тут и начинается проблема..Например при запросе из Opera адрес находится на смещении 135 байт в пакете, из IE на 521 байт и тд. (в аттаче запросы google.ru c трех браузеров). Можно ли добраться до URL, не просматривая весь пакет? Реально ли оптимизировать код так, чтобы без тормозов блокировать около 500 тыс. сайтов?! Может нужно блокировать только по ip в таком случае? Спасибо. Хотелось бы до конца разобраться с памятью. Почему в драйверах обязательно использовать динамические переменные, а не статические? я вообще против статических переменных в драйвере ибо нефиг) Различаются ли они по скорости работы с данными? Сейчас я правильно работаю с памятью? PCHAR myBuffer;//глобальная переменная statusF = NdisAllocateMemoryWithTag(&myBuffer,5000000,'maDN'); Заранее спасибо за помощь.
|
|
« Последнее редактирование: 06-05-2007 08:31 от lexer666 »
|
Записан
|
|
|
|
lexer666
Гость
|
|
« Ответ #22 : 04-05-2007 22:09 » |
|
Хотя, если посмотреть шире, то вообще непонятно для чего драйверу надо иметь длительное время открытый дескриптор файла. Загрузка/сохранение конфигурации при начале/завершении работы это ясно, что-то еще?
Может чтобы не давать его редактировать,удалять и т.д. из юзермода?
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #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 уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
aks68
|
|
« Ответ #24 : 07-05-2007 10:50 » |
|
Хотя, если посмотреть шире, то вообще непонятно для чего драйверу надо иметь длительное время открытый дескриптор файла. Загрузка/сохранение конфигурации при начале/завершении работы это ясно, что-то еще?
Может чтобы не давать его редактировать,удалять и т.д. из юзермода? Оп-па! А ненаходите-ли Вы, что если драйвер должен беспокоится об возможных изменениях его конф. файла помещенного в системную область на диске (!), то что-то нетак в самой системе?
|
|
|
Записан
|
|
|
|
aks68
|
|
« Ответ #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
|
|
« Ответ #27 : 07-05-2007 15:32 » |
|
Можно подробней про системную облать...как его туда поместить?
Пожалуйста c:/>copy c:\MyConfig.txt %WINDIR%\system32\drivers
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #28 : 08-05-2007 06:50 » |
|
aks68, впринципе - логично) хотя мне на первый взгляд не очень нравится, когда такая "смена" конфигурации фактически задублирована; то есть чтобы сохранить ее изменения - необходимо дать IOCTL драйверу с параметрами, потом те же параметры дописать в конф. файл. хотя другого варианта пожалуй и нет...реестр из NDISов скорее всего тоже недоступен? (это так... к слову) а IOCTL в NDISах - есть?) я почему спрашиваю... уж если правильный NDIS драйвер совместим по исходным кодам с другими ОС, то скорее всего он такие функции поддерживать не должен?)
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
aks68
|
|
« Ответ #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 открывает файл только для чтения.
|
|
|
Записан
|
|
|
|
|