И что потом делать с этим драйвером на BASIC'е? Все-равно если понадобится потом написать настоящий драйвер для устройства, то лучше выбирать Си (ИМХО).
Ну зачем использовать Basic?! Я не против языка, но C проще и понятней, тем более в случае системного программирования. А некоторые директивы вообще вводят меня в шок :)
И откуда вы решили — что сейчас начинающие пишут на Basic?
Я не заставляю использовать бейсик или др. язык. Выбирать вам.
Не все, но некоторые начинают с бейсика. Он ИМХО намного проще чем Си, как для понимания так и для разработки.
Проблема в том, что у BASIC'а я не вижу никакого достойного продолжения. Ненавистный мне Pascal и то позволяет программистам в дальнейшем рисовать окошечки и делать еще кучу всякой фигни в Delphi.
Разве вы не смотрели код?
Разве это не создание окна OpenWindow()?
Поэтому вы очень сильно заблуждаетесь насчет возможностей современных диалектов бейсика. Можно не только создавать окошки, но и разрабатывать кроссплатформенные приложения, компилируемые под Windws, Linux, MacOS X, AmigaOS и т. д.
Хорошо, а что насчет моего другого аргумента — где взять программистов?
Вот я, допустим, не скрою, знал BASIC. И не знал тогда еще ничего ни о системеном программировании, ни об ООП, ни вообще об устройстве больших и серьезных программ. Сейчас я могу и драйвер на Си написать (под Linux, правда) и ООП хоть на том же Си не проблема (ага, без плюсов :-). Но без Google'а я не напишу даже HelloWorld'а на BASIC'е.
И так со многими людьми, кто хоть когда-то знал BASIC.
Разве я писал об создании драйверов на профессиональном уровне и призывал всех с Сей и асма переходить на бейсик?
Я извиняюсь, вы на каком диалекте бейсика когда-то кодили?
Судя по всему, это QBasic или сродни ему. PureBasic намного продвинутее его. Релиз данной версии был буквально месяц назад.
И на PureBasic есть относительно серьезные программы, к примеру, торрент клиент — pbTorrent.
Этот материал в первую очередь предназначен для обучения. Нужно ведь с чего-то начинать и при этом по возможности все должно быть не очень сложно. Помните как вы пошли в первый класс в школе? Что вы там учили? Высшую математику или таблицу умножения? Так же и здесь.
Если человек решил написать драйвер, то ему пара взрослеть и завязывать с BASIC'ом. ИМХО, конечно.
Аналогично со школой — если ребенок уже учится в старших классах и изучает математику на более высоком уровне, чем в первом, то абсурдно считать на цветных палочках.
Я поддержу автора статьи. Нет ничего плохого в том, что человек разузнал и попробовал какой-то инструмент. Вдвойне хорошо, что он поделился своим опытом. Теперь и я знаю, что есть некая «хрень», которая позволяет писать драйверы на бейсике. Ну мало ли что, вдруг пригодится? И пусть автор никогда не будет использовать BASIC в рабочих системах (а я надеюсь что это так), опыт всё равно полезен.
Я не отрицаю, что автор молодец в этом плане. Я ему и за топик, и в карму плюсик поставил. Я лишь пытаюсь предостеречь остальных от этого пагубного дела (писать драйвер на BASIC'е).
Мне кажется, что С знают больше людей, чем Basic, и в этом проблема (с точки зрения «статья для обучения)». Я вот, например, начинал с Pascal, а с Basic ничего общего не имел, и таких как я может быть много. Грустно, что эта статья обходит меня стороной.
Драйвера на C проще, т.к. есть готовые декларации функций, поставляемые с WDK.
На другом языке программирования Вам пришлось писать декларации импортируемых функций вручную, и вручную же гарантировать их корректность.
Кстати, стоит упомянуть еще о статическом анализаторе PREFast, который заточен под C.
Хотя… Беру свою насмешку обратно. Прочитал по про ru.wikipedia.org/wiki/PureBasic и подумал, что использовать Васик не так уж и странно в данном случае — не надо ставить многотонные компиляторы и среды разработки. Рабочая среда легко развертывается и не менее легко сносится с компьютера. Для написания примера на тему «да, я смог сделать драйвер» — самое то.
Ага, лучше писать на ассемблере, да?
И если нужно будет перенести его с 32 на 64 бита, ох уж и попотеете при этом! Вот это точно извращение ИМХО!
А выложенный мной пример драйвера, компилируется как под x86, так и под x64 без модификации кода.
Ага, а теперь мы попробуем написать хоть немного функционально нагруженный драйвер и с учетом того, что нам необходимо будет узнать что такое UM-KM transition, IRQL, memory model, I/O model, всякие IDT, GDT, LDT, TSS, как раз и выходит «что-то на грани фантастики». Особенно весело это будет смотреться на бейсике :)
Что-то бейсик всех пугает=) Я знаю одну очень крупную систему в Швеции, которая пишется на VB.Net, причем на Vb.Net пишется не только клиент, но и сервер. Вот так исторически сложилось и НИКАКИХ проблем нет, все работает.
По сути современный Васик от МС может не меньше C#.
Замечательно. Только драйвера ОС немного отличаются от «крупных систем на VB.NET» тем, что они обычно пишутся на С c вставками на ASM. Написать драйвер на диалекте бейсика не проблема, но это всё равно что есть суп шумовкой. Приноровиться можно, но смысл?
В процессе компиляции задействован FASM, поэтому допустимы не только асм. вставки, но и директивы и макросы FASM'а.
Например, в начале кода драйвера есть строка для FASM'а.
Трюк в том, что реальный драйвер, который что-то делает, допустим вводит или выводит какие-то данные с устройства — на Си будет проще. Почему? Потому что там внутре у функций ядра все данные представлены в виде структур Си с указателями, адресной арифметикой и прочими прелестями. К ним можно сделать обертку на Бейсике, Паскале, да хоть JavaScript-e, но это всё равно будет оберткой над чужеродными данными.
После компиляции — да.
Проблема в коде, который ДО компиляции.
Если, условно, в Бейсике нет понятия «указатель» и «адресная арифметика», а они нужны для работы драйвера, то программисту всё равно придется разобраться с этой адресной арифметикой, а потом пользоваться ей через какие-то кривые функции-обертки, предоставленные библиотеками языка.
Как нет указателей?
Найдите в процедуре DeviceIoControl() драйвера строку *Stack = *pIrp\Tail\Overlay\CurrentStackLocation а чуть выше строка Protected *Stack.IO_STACK_LOCATION
Если не поняли, то это доступ к структуре IO_STACK_LOCATION по указателю, хранимому в поле *pIrp\Tail\Overlay\CurrentStackLocation
Все просто.
Если разобраться то ИМХО даже проще и логичнее чем в VB. Работа с памятью и указателями более развита и дает больше свободы действий. Вообще, область решаемых задач шире чем у VB.
Но синтаксис отличается от того, что в VB.
Эх… 10 лет назад мы писали курсач «wmd драйвер для перехвата сетевого трафика на wasm». Сколько же было бессонных ночей, сколько нулевых колец, сколько синих экранов, сколько перезагрузок (про виртуальные машины мы тогда и не мечтали). Отладка, естественно, на той же машине, где и разрабатывали. Скучаю по тем дням)
Хм… Такое ощущение, что самплы из ddk глянуть нельзя, на васме нет тутов four-f'а, который проводит их на основе тех же самплов… Очередная копипаста материала, которым и так заполнена сеть. лол, товарищи.
Мессадж не получен. Я имел ввиду, что материал по содержанию отнюдь не свеж. И я не понимаю, какой смысл писать то, что есть в том же ddk на другом языке и выкладывать на хабре.
Может вы гордитесь тем, что написали… даже не велосипед, а спицу от колеса велосипеда на «не си». Я не понимаю, что этот материал делает на хабре.
Драйвер — это просто