Свежие обсуждения
Компьютеры

C++ и DDK (написание драйверов)

По служебной необходимости приходиться разбираться с проектированием драйверов под виндовс.(Готовлю соответствующий курс для чтения студентам, надо самому сначала разобраться )
Драйвера пишу на Визуал С 2005, компилирую утилитой Build из Driver Developement Kit (для ХP) от Майкрософт.
Сейчас застрял на компиляции расширенного драйвера GiveIOEx, предоставляющего старим ДОС/Вин98 программам прямой доступ к портам компютера с NT-системами(NT, 2000, XP и т.д.). Исходный текст драйвера взят из книги "Последовательные интерфейсы ПК. Практика программирования. Агуров. 2004". Прилагаемого диска к этой книге у меня нет, так что исходник файнридером распознавался из книги. Было много ошибок, все исправил, осталась одна, которую не могу побороть пока. (Кстати, может у кого есть диск к этой книге?)

Ошибка следующего вида:
giveioex.cpp(123) : error C2440: '=' : cannot convert from 'PVOID' to 'IOPM (*)'
Видно, что проблема с преобразованиями типов.
Вот соответствующие строки исходника:


122:// Выделим буфер для локальной IOPM и обнулим его.
123:IOPM_local = MmAllocateNonCachedMemory(sizeof(IOPM));

Вот так описана IOPM_local:

/*
Это "структура" IOPM. Это просто массив байт размером 0x2000. Он содержит
8К * 8 бит = 64 Кбит IOPM, которые покрывают все 64-килобайтное адресное
пространство в/в х86 процессора. Каждый нулевой бит предоставляет доступ
к соответствующему порту для user-mode процесса. Каждый единичный бит
запрещает доступ к в/в через ссответствузсаций порт.
*/
#define IOPM_SIZE 0x2000
typedef UCHAR IOPM[IOPM_SIZE];
/*
Зто будет содержать просто массив нулей, который будет копироваться в
настоящую IOPM в TSS через Ke386SetIoAccessMap(). Память выделяется во
время загрузки драйвера.
*/
IOPM *IOPM_local = 0;

Вот как раз в строчке (123), где выделяется память, компилятор и не пропускает
Кто что посоветует?

Под виндовс (с использованием специфики ОС) на Си я писал не очень много, на "визуал си" в основном консольные приложения и на С++ Билдере с окошками. Много писал на Си для DOS. Так что могу споткнуться через какую нибудь чепуху.

 

В приложении исходный текст драйвера полностью.

147161.cpp

 

IOPM_local = (IOPM *)MmAllocateNonCachedMemory(sizeof(IOPM));

При пользовании любым функциями, выделяющими память, будь то malloc или эта, требуется такое явное проеобразование, потому что все они возвращают "указатель на что-нибудь".

PS. Написал в свое время один драйвер под винду - проклял все на свете. Искренне сочувствую Будут вопросы - пишите, постараюсь вспомнить

 

Арс: исходник файнридером распознавался из книги.

Какой кошмар "Вас на гугле забанили?" ©

вот исходник

 

AHTOXA: Какой кошмар "Вас на гугле забанили?" ©
Как ни странно, но там я искал, не нашёл Наверное неправильно спрашивал...
Спасибо за исходник, хотя это и не тот, но его я тоже не нашёл. По вашей ссылке исходный исходник драйвера GiveIO, у меня же модифицированный (расширенный) GiveIOEx

 

chav1961: требуется такое явное проеобразование
Спасибо, чуть позже буду пробовать. Получаеться, в книге ошибка?
Да и по ссылке, найденной АНТОХА-ой, тоже написано как у меня:
136: IOPM_local = MmAllocateNonCachedMemory(sizeof(IOPM));

 

Проверил, откомпилировалось. Но появилось 14 ошибок линковщика....
После плясок с бубном и чтения интернета, прописал в файле драйвера в некоторых местах extern "С"
И вот оно, чудо, готовый .sys файл драйвера.

Как оказалось, можно было всё сделать быстрее и проще....
Моя ошибка была в том, что я дал расширение исходнику *.сpp (т.е. он обрабатывался, как файл , написанный на языке С++), а надо было просто *.С.
Тогда проходит и конструкция: IOPM_local = MmAllocateNonCachedMemory(sizeof(IOPM)); (без явного приведения типов),
и не надо по файлу раставлять extern "С" .

Но зато я поимел опыт
Удалось успешно откомпилировать и собрать драйвер как на С++, так и просто на С.

Теперь буду писать приложение для теста драйвера. Не факт, что он ещё правильно заработает...

PS:
В своё оправдание хочу сказать, что в Агурове не упоминается, какое расширение должно быть у файла-исходника драйвера, а в Солдатове исходники написаны на C++. Это я теперь посмотрел и вижу, что в Солдатове стоит перед некоторыми функциями extern "С"