Розробка dll-бібліотеки для взаємодії з драйвером

Якщо говорити по-російськи, то це означає: в будь-який момент часу програма може завантажити dll-бібліотеку. отримати покажчики на функції і дані цієї бібліотеки. Потім додаток якось використовує функції і дані бібліотеки, і коли вони більше не потрібні - вивантажує бібліотеку.

Dll-бібліотека містить два види функцій: зовнішні (External) і внутрішні (Internal). Внутрішні функції можуть викликатися тільки самої dll, а зовнішні може також викликати додаток, підключити бібліотеку. У цьому випадку говорять, що dll-бібліотека експортує функції і дані.

Як було згадати вище, в даний час для зв'язку з драйвером використовується схема Додаток -> Бібліотека dll -> Драйвер. При використанні такої архітектури запит додатки на операцію введення-виведення надходить в dll-бібліотеку, проходить там попередню обробку і передається драйверу. Результат, повернутий драйвером бібліотеці dll. також обробляється і передається з додатком. Переваги такого підходу очевидні:

  • Випускається величезна кількість різних периферійних пристроїв, і, відповідно, для кожного пристрою розробляється свій драйвер. Програмісту буде важко розбиратися у всіх тонкощах роботи драйвера пристрою: формат даних для читання / запису, запам'ятовувати незрозумілі IOCTL-коди. Набагато краще - надати для нього зрозумілий інтерфейс API-функцій для роботи з пристроєм. Ще краще, якщо такий інтерфейс буде уніфікованим для всіх пристроїв даного типу. Завдання dll-бібліотеки. поставляється з драйвером - зв'язати стандартні інтерфейси, що надаються прикладній програмі, зі специфічними алгоритмами роботи драйвера.
  • якщо в майбутньому змінитися алгоритм взаємодії додатка з драйвером, то користувачеві для роботи з новим драйвером буде необхідно оновити тільки бібліотеку dll. Всі раніше розроблені програми залишаться колишніми.

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

У нашому випадку нам необхідно розробити dll-бібліотеку, яка надаватиме додатком три функції: читання пам'яті, запис в пам'ять і здобуття загальної кількості пам'яті пристрою. Природно, dll - бібліотеку ми також будемо проектувати в середовищі Visual C ++.

Запустіть середу VC ++ та створіть новий проект з назвою XDSPInter. В якості типу проекту виберіть Win32 Dynamic-Link Library. Далі в якості типу проекту виберіть A Simple DLL (проста dll-бібліотека). Середа VC ++ створить для Вас порожній проект з однією-єдиною функцією DllMain ().

Функція DllMain () викликається при підключенні і відключенні dll процесом. DllMain () має значення, що повертається BOOL APIENTRY (фактично, вона повертає значення типу BOOL) і три параметра - HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved.

  • HANDLE hModule - дескриптор (хендл) нашої dll;
  • DWORD ul_reason_for_call - прапор, який показує, чому була викликана функція. Може приймати значення:
    • DLL_PROCESS_ATTACH або DLL_THREAD_ATTACH - бібліотека підключається до процесу;
    • DLL_PROCESS_DETACH або DLL_THREAD_DETACH - бібліотека відключається від процесу.
  • LPVOID lpReserved - зарезервовано.

Функція DllMain () - єдина функція, яка обов'язково має бути присутня в бібліотеці. Решта функцій і змінні додає програміст відповідно до розв'язуваної завданням.

У нашому випадку dll - бібліотека буде експортувати такі функції: bool IsDriverPresent (void). Функція буде визначати, чи присутній в системі необхідний драйвер і спробувати підключитися до нього. Якщо це вдасться - функція поверне true, в іншому випадку - false.

Тепер розглянемо видалити оригінальне срр - файлу бібліотеки.

Таким чином, наша бібліотека експортує всього чотири функції для роботи з пристроєм. Всі вони мають простий синтаксис і прості у використанні. Використання dll в нашому випадку дозволяє програмісту не думати про складні системних викликах, необхідних для спілкування з драйвером, про формат переданих йому даних, а зосередиться на вирішенні прикладних задач.

2.5 Підключення dll-бібліотеки до додатка.

Після того, як написаний драйвер і dll-бібліотека для роботи з ним, прийшов час написати додаток пользоваеля, що працює з пристроєм. Воно буде взаємодіяти з драйвером через dll-бібліотеку. Природно, написано воно також буде в середовищі Visual C ++. В принципі, його можна було б реалізувати в середовищі Visual Basic, Delphi або CВuilder, але це призведе до деяких труднощів, перш за все у використанні системних викликів і структур даних. В даному розділі, на відміну від попередніх, не розглядається яке-небудь конкретне додаток, а даються загальні рекомендації з написання такої програми.

Підключення бібліотеки до додатка не вимагає особливих зусиль. Бібліотека під- ключается за допомогою системного виклику HMODULE LoadLibrary (char * LibraryName), де LibraryName - рядок з ім'ям файлу dll-бібліотеки. Значення, що повертається - хендл (дескриптор) бібіліотека. Якщо функція повернула NULL, то сталася помилка при підключенні бібліотеки.

Після підключення бібліотеки можна з неї імпортувати функції. Імпорт функції проводиться за допомогою системного виклику

  • hModule - хендл бібліотеки, повернутий LoadLibrary;
  • ProcName - рядок з ім'ям імпортованої функції.

Ми імпортуємо з бібліотеки чотири функції, тому необхідно визначити їх типи: параметри, що передаються в функцію, що повертає значення. Це можна зробити за допомогою директиви typedef:

Тепер прийшов час створити самі покажчики на функції:

Тепер розглянемо функцію, що включає dll-бібліотеку до додатка. Вона буде підключати dll-бібліотеку до додатка і намагатися встановити зв'язок з драйвером. Функція поверне true у разі успіху і false при невдачі. Оскільки VC ++ - об'єктно среда, то ця функція буде методом одного з класів додатки (в нашому випадку - класу уявлення).

Виклик методу ConnectToDriver () доцільно зробити в конструкторі класу. Там же треба реалізувати і перевірку, чи присутній в системі драйвер. Тоді вся необхідна ініціалізація буде проведена ще під час запуску програми.

Метод, що виробляє читання пам'яті пристрою може виглядати наступним чином:

Аналогічно може виглядати метод запису в пам'ять пристрій:

Також введемо ще один метод, який може бути корисним. Він буде очищати пам'ять пристрою.

Звичайно, написані нами додаток і dll-бібліотека дуже недосконалі. Наприклад, збої будуть відбуватися, якщо будуть заущени кілька додатків. Тоді вони будуть одночасно звертатися до однієї і тієї ж dll і обновременно працювати з пристроєм. Це може породити безліч збоїв. У кращому випадку дані, одержувані кожним з них будуть неадекватними. У гіршому - система зависне. Втім, цей недолік можна усунути, модифікувавши драйвер способом, описаним вище. Також в нашому додатку проводиться робота тільки з першими 1024 байти пам'яті пристрою.

Звичайно, комерційна цінність такої системи дорівнює нулю. Але вона може бути хорошим навчальним прикладом для ознайомлення з програмуванням WDM - драйверів в Windows і DriverStudio.

2.6 Налагодження драйверів

Розмова про драйвери був би неповним, якщо не згадати про налагодження драйверів. Оскільки драйвера працюють в нульовому кільці захисту процесора з усіма витікаючими наслідками, то звичайні отладчики призначених для користувача додатків не придатні для налагодження драйверів.

Якщо, наприклад, розробляти драйвер під ОС Linux. то ситуація там може бути трохи гірше: в цій ОС взагалі немає будь-якої можливості налагоджувати драйвера, крім як скористатися отладчиком gdb. Але в такому випадку треба перекомпілювати ядро ​​системи спеціальним чином і станцювати ще кілька подібних танців з бубном. Тому часто налагодження зводиться до виклику функцій printk, які у великій кількості розкидані по всьому ядру системи.

Будучи встановленим в Win98, SoftIce прописує в Autoexec.bat рядок виду: c: \ Progra

Тобто SoftIce завантажується після завантаження DOS і сам вантажить Windows. При роботі Windows SoftIce активізується лише при якомусь системному виключення або в точці зупинки, заданої програмістом в драйвері. Також викликати SoftIce можна, натиснувши Ctrl + D. На екрані з'являється вікно відладчика.

Поки вікно SoftIce активно, вся діяльність ОС завмирає; саме зараз можна безболісно налагоджувати драйвера.

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

У самому низу вікна SoftIce розташована командний рядок. SoftIce не має графічного інтерфейсу, і всі команди управління отладчиком вводяться в командному рядку. SoftIce має досить непогану систему допомоги. Перелік команд видається по команді help. Напевно, найважливіша команда - це команда виходу з SoftIce. Для цього потрібно натиснути клавішу F5 або дати команду Х (реєстр не має значення).

Уважно вивчивши вікно повідомлень, ми там побачимо різноманітні системні повідомлення і ті повідомлення, які наш драйвер виводить через об'єкт трасування. Таким чином, можна переглядати всі важливі відомості, які драйвер хоче повідомити нам. Якщо ми хочем, щоб драйвер не виводив якісь повідомлення або виводив інші повідомлення, нам треба відредагувати текст драйвера, додавши нові або видаливши існуючі трасувальні повідомлення. Після цього треба перекомпілювати драйвер і перезавантажити його.

Універсальної точкою зупинки є використання переривання INT 3. Як і в ОС MS-DOS. в Windows INT 3 також є перериванням налагодження. Для цього в тексті драйвера, де необхідно встановити breakpoint, необхідно вставити наступний код:

При цьому присходит виклик переривання INT 3.

Але за умовчанням SoftIce не реагує на INT 3. Для того, щоб з цього переривання активізувався відладчик, необхідно викликати SoftIce і дати команду:

Тепер при виклику INT 3 станеться <всплывание> цього коду в відладчик. Для відключення режиму відладки по INT 3 слід дати команду SET I3HERE OFF.

Після того, як наш драйвер <всплыл> в SoftIce, ми можемо контролювати виконання програми за допомогою команд:

Якщо драйвер був скомпільований в отладочной конфігурації, то на екрані буде видно текст драйвера, написаний на С ++.

Це основні команди. застосовувані для налагодження драйверів пристроїв в SoftIce. А в загальному, цей відладчик має величезну кількість функціональних можливостей і його пів- ве опис пославляется з програмою і займає близько двохсот сторінок. Сподіваюся, це керівництво було для Вас цікаво. Якщо навіть не цікаво - то, сподіваюся, Ви дізналися щось нове для себе.

Схожі статті