Студопедия

КАТЕГОРИИ:

АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника


Теоретичні відомості. Існують два драйвери: віртуальний драйвер пристрою VxD (Windows 98/ME) i системний драйвер SYS (Windows NT/2000/XP)




Існують два драйвери: віртуальний драйвер пристрою VxD (Windows 98/ME) i системний драйвер SYS (Windows NT/2000/XP), які можна знайти в обновленому варіанті на сайтах: http://aspi32.narod.ru i http://hardopen.narod.ru відповідно. Для прикладу використання даних драйверів напишемо два класи. Перший клас (файл IO32.h) написаний нижче для роботи в Windows 98/ME.

Покроковий хід роботидля написання програми класу з використанням драйвера для запису даних в порт:

1. Клас CIO32 з використанням драйвера для запису даних в порт:

2. Включаємо O32.h: інтерфейс, який знаходиться в бібліотечному файлі winioctl.h для класу CIO32.

3. Визначаємо коди функцій для читання і запису:

4. Створюємо прототип функції CTL_CODE типу IO32_WRITEPORT з параметрами: FILE_DEVICE_UNKNOWN – для знаходження файлу, 1 – для запису в порт, \METHOD_NEITHER, FILE_ANY_ACCESS - розташування).

5. Створюємо прототип функції CTL_CODE типу IO32_READPORT з параметрами FILE_DEVICE_UNKNOWN – для знаходження файлу, 2– для читання з порту, \METHOD_NEITHER, FILE_ANY_ACCESS - розташування).

6. Об’являємо клас CIO32

7. Загальнодоступні конструктори і функції - public:

8. Конструктор CIO32 ().

9. Деструктор ~CIO32 ().

10. Загальні функції:

11. Ініціалізуємо драйвер функцією InitPort () значення повернення типу bool.

12. Функція для зчитування значення із порту:

13. Функція inPort типу bool з параметрами: wPort типу WORD, pdwValue типу PDWORD, bSize типу BYTE для читання в порт.

14. Функція для запису значення в порт:

15. Функція outPort типу bool з параметрами: wPort типу WORD, pdwValue типу PDWORD, bSize типу BYTE для читання в порт.

16. Недоступні функції – private тобто закрита частина класу:

17. Дескриптор драйвера hVxD типу HANDLE.

18. Структура управління:

19. Реалізація дії pack (1) як константи чи макроса через директиву #pragma.

20. Об’явлення структури tagPort32 типу strukt.

21. Змінна порта wPort системного типу unsigned short – USHORT.

22. Змінна значення порта dwValue типу ULONG.

23. Змінна розміру порта bSize типу UCHAR.

24. Реалізація дії pack () як константи чи макроса через директиву #pragma.

25. Закінчення класу.

Покроковий хід роботидля написання програми файлу ІО32.срр:

 

1. Включення файла бібліотеки "stdafx.h".

2. Включення попереднього файла класу"IO32.h".

3. Реалізація класу CIO32:

4. Конструктор CIO32 на функцію конструктора класу CIO32 ().

5. Адресі hVxD надаємо значення NULL і виконуємо функцію класу.

6. Деструктор CIO32 на функцію деструктора ~CIO32 ().

7. Якщо hVxD не рівна 0 то закриваємо hVxD – дескриптор драйвера функцією CloseHandle.

8. hVxD присвоюємо значення NULL.

Покроковий хід роботидля написання програми функцій класу:

1. Функція ініціалізації порту InitPort () типу bool для класу CIO32.

2. Завантажуємо драйвер функцією CreateFile з параметрами\\\\.\\io32port.vxd для активізації порту, 0, 0, NULL, 0, FILE_FLAG_DELETE_ON_CLOSE, NULL і присвоюємо його дескриптор змінній hVxD.

3. Якщо драйверу hVxD передано системне значення INVALID_HANDLE_VALUE - не доступний, виходимо і повертаємо значення falce.

4. Повертаємо значення falce.

5. Функція читання inPort типу bool з параметрами wPort типу WORD, pdwValue типу PDWORD і bSize типу BYTE для класу CIO32.

6. Якщо драйвер hVxD рівний значенню NULL - не доступний, виходим і повертаємо значення falce.

7. Задаємо величину dwReturn типу DWORD.

8. Формуємо тег порту port типу tagPort32.

9. Елементу bSize структури port присвоюємо значення bSize.

10. Елементу wPort структури port присвоюємо значення wPort.

11. Читаємо значення з указаного порту:

12. Через функцію DeviceIOControl з параметрами: hVxD, IO32_READPORT, &port, sizeof (tagPort32), pdwValue, sizeof (DWORD), &dwReturn, NULL читаємо і повертаємо значення у функцію класу.

13. Функція запису outPort типу bool з параметрами wPort типу WORD, pdwValue типу PDWORD і bSize типу BYTE для класу CIO32.

14. Якщо драйвер hVxD рівний значенню NULL - не доступний, виходим і повертаємо значення falce.

15. Задаємо величину dwReturn типу DWORD.

16. Формуємо тег порту port типу tagPort32.

17. Елементу bSize структури port присвоюємо значення bSize.

18. Елементу dwValue структури port присвоюємо значення dwValue.

19. Елементу wPort структури port присвоюємо значення wPort.

20. Записуємо значення у вказаний порт:

21. Через функцію DeviceIOControl з параметрами: hVxD, IO32_WRITEPORT, &port, sizeof (tagPort32), pdwValue, sizeof (DWORD), &dwReturn, NULL - читаємо і повертаємо значення у функцію класу.

Тепер ми маємо повноцінний клас роботи з портами. Спочатку потрібно викликати функцію Init Port для завантаження віртуального драйвера пристрою. Після неї можна читати любі існуючі в системі порти вводу-виводу. Кожна із функцій inPort outPort має по три аргументи: перший вказує номер порту; другий – призначений для передачі і отримання значень із порту; третій - визначає розмір даних передавання. Драйвер підтримує 4 типи даних: байт (1), слово (2), трьохбайтове значення (3) і подвійне слово (4). Наведемо приклад роботи з класом CIO32.

Покроковий хід роботидля написання програми роботи з класом CIO32:

1. Об’являємо клас CIO32 системного типу io.

2. Ініціалізуємо драйвер функцією initPort () як елемент класу io (через операцію «.» як посилання на елемент класу).

3. Тепер можна працювати з портом:

4. для прикладу включимо системний динамік і після 4 секунд виключимо:

5. Ініціалізуємо змінну dwResult типу DWORD.

6. Читаємо стан порту функцією inPort з параметрами: 0x61 – код порту, &dwResult – посилання на змінну результату і параметром 1 – 1байт, як елемент класу io.

7. Включаємо до змінної dwResult код 0x03 через операцію «|=».

8. Записуємо значення в порт функцією outPort з параметрами 0x61 – код порту, dwResult – посилання на змінну результату і параметром 1 – 1байт, як елемент класу io.

9. Пауза 4 секунди командою Sleep з параметром 4000.

10. Читаємо стан порту функцією inPort з параметрами: 0x61 – код порту, &dwResult – посилання на змінну результату і параметром 1 – 1байт, як елемент класу io.

11. Включаємо до змінної dwResult код 0x03 через операцію «|=».

12. Записуємо значення в порт функцією outPort з параметрами: 0x61 – код порту, &dwResult – посилання на змінну результату і параметром 1 – 1байт, як елемент класу io.

 

Варіанти практичних завдань: Написати фрагменти програм і функцій на мові С++.

 

Варіант Завдання
Варіант 1 Клас CIO32 з використанням драйвера для запису даних в порт.
Варіант 2 Програма файлу ІО32.срр
Варіант 3 Функція ініціалізації порту InitPort () для класу CIO32.
Варіант 4 Функція читання з порту inPort() для класу CIO32.
Варіант 5 Функція запису в порт outPort() для класу CIO32.
Варіант 6 Програма роботи із класом CIO32.

 


 


Поделиться:

Дата добавления: 2015-08-05; просмотров: 50; Мы поможем в написании вашей работы!; Нарушение авторских прав





lektsii.com - Лекции.Ком - 2014-2024 год. (0.008 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав
Главная страница Случайная страница Контакты