Студопедия

КАТЕГОРИИ:

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


Теоретичні відомості. Універсальність функції полягає в тому, що вона працює з усіма драйверами, які підтримують операцію вводу-виводу




Універсальність функції полягає в тому, що вона працює з усіма драйверами, які підтримують операцію вводу-виводу. Функція DeviceIoControl має 8 аргументів: 1-й вказує ім’я драйвера, через який здійснюється управління портами; 2-й представляє ідентифікатор коду необхідної операції в даний момент; 3-й і 4-й дозволяють вказати буфер для даних передачі і його розмір, його застосовують для операції запису, в інших випадках надають значення NULL; 5-й і 6-й аргументи служать для отримання даних від пристрою (вказівник на буфер даних і розмір буфера), якщо не використовуються то обертаємо в NULL; 7-й вказує на кількість отриманих даних; 8-й вказує на структуру OVERLAPPED, яка використовується при асинхронному вводі-виводі. Розглянемо приклади з даною функцією для читання сектора з диску.

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

1. Підключаємо в програму h-файл "stdafx.h", який повинен знаходитись в нашій робочій директорії.

2. Визначаємо код функції драйвера VWIN32_DIOC_DOS_DRIVEINFO 6 черездирективу процесора С++.

3. Визначаємо прапор переносу CF_FLAG 1.

4. Задаємо додаткові структури:

5. Визначаємо структуру як доступ до класової структури _DIOC_REGISTERS. Початок структури.

6. Задаємо змінну reg_EBX типу DWORD.

7. Задаємо змінну reg_EDX типу DWORD.

8. Задаємо змінну reg_ECX типу DWORD.

9. Задаємо змінну reg_EAX типу DWORD.

10. Задаємо змінну reg_EDI типу DWORD.

11. Задаємо змінну reg_ESI типу DWORD.

12. Зразок структури DIOC_REGISTERS.Кінець задання структури.

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

14. Визначаємо структуру _DATABLOCK як доступ до класової. Початок структури:

15. Номер початкового сектору dwStartSector типу DWORD.

16. Кількість секторів wNumSectors типу WORD.

17. Вказівник на буфер даних pBuffer типу DWORD.

18. Зразок структури DATABLOCK. Кінець задання структури.

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

20. Пишемо функцію для читання секторів з диска:

21. Функція ReadSector типу bool з параметрами: uDrive типу unsigned int, dwStartSector типу DWORD, wNumSectors типу WORD і lpBuffer типу LPBYTE.

22. Назва для файла драйвера hDriver типу HANDLE.

23. Ініціалізуємо структуру reg={0} типу DIOC_REGISTERS по зразку заданої структури.

24. Ініціалізуємо структуру data = {0} типу DATABLOCK по зразку другої структури.

25. Створюємо логічну змінну для результату bResult.

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

27. Ініціалізуємо сам драйвер системним викликом CreateFile з переметрами \\\\.\\vwin32, 0, 0, NULL, 0, FILE_FLAG_DELETE_ON_CLOSE, 0 і присвоюємо файловій змінній hDriver.

28. Якщо драйвер hDriver недоступний, тобто системний виклик повернув значення INVALID_HANDLE_VALUE – виходимо з функції і повертаємо значення falce.

29. Заповнюємо структуру даних DATABLOCK:

30. Елементу dwStartSector структури data присвоюємо значення dwStartSector через операцію з’єднання з елементом структури (крапка).

31. Елементу wNumtSector структури data присвоюємо значення wNumSector через операцію з’єднання з елементом структури (крапка).

32. Елементу pBuffer структури data присвоюємо значення lpBuffer типу DWORD через операцію з’єднання з елементом структури (крапка).

33. Заповнюємо структуру управління reg:

34. Елементу reg_EAX структури reg присвоюємо значення функції 0x7305 переривання 21h через операцію з’єднання з елементом структури (крапка).

35. Елементу reg_EВX структури reg присвоюємо структуру data (операція &-взяття адреси початку структури) типу DWORD через операцію з’єднання з елементом структури (крапка).

36. Елементу reg_EСX структури reg присвоюємо -1 через операцію з’єднання з елементом структури (крапка).

37. Елементу reg_EDX структури reg присвоюємо значення uDrive - номер логічного диску через операцію з’єднання з елементом структури (крапка).

38. Викликаємо функцію DeviceIoControl:

39. Організовуємо зчитування і передачу інформації функцією DeviceIoControl при взаємодії з драйвером з відомими параметрами функції: hDriver, VWIN32_DIOC_DOS_DRIVEINFO, &reg, sizeof (reg), &reg, sizeof (reg), &dwResult, 0; де в параметрах 3-5 організована операція взяття адреси по посиланню на тип даних і присвоюємо результат змінній bResult.

40. Якщо виникла помилка – виходимо із функції:

41. Якщо bResult або reg.reg_Flags &CF_FLAG (через посилання на елемент і побітове додавання) пусті величини, то:

42. Функцією CloseHandle закриваємо драйвер hDriver.

43. Повертаємо значення false.

44. Повертаємо значення true.

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

 

1. Приклад функції ReadSector для читання двох секторів диска: номер секторів може бути: 0- по замовчуванню, 1- А, 2- В, 3- С, 4-D, 4-E, і т.д.

2. Виділяємо пам’ять buffer через посилання на тип char* для двох секторів жорсткого диску і пока присвоюємо значення NULL.

3. Змінній buffer присвоюємо величину зарезервованої командою new пам’яті типу char [512*2] – для 2-х сегментів.

4. Викликаємо функцію читання секторів ReadSector (3, 0, 2, (LPBYTE) buffer) з номерами секторів та побайтового завантаження в буфер пам’яті.

5. Звільняємо пам’ять [] buffer командою delete.

 

Слід відмітити, що в професійних системах (NT, XP i 2000) використовувати функцію DeviceIoControl не потрібно, достатньо тільки відкрити функцією CreateFile логічний диск (навіть CD-ROM) і за допомогою функції ReadFile прочитати дані з диску. Розглянемо приклад запису даних на логічний диск, використовуючи вищезгадані функції.

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

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

2. Створюється логічна функція WriteSector з параметрами uDrive (сектор) типу unsigned int, dwStartSector (початок сектора) типу DWORD, wNumSectors (кількість секторів) типу WORD і lpBuffer (побайтова операція) типу LPBYTE.

3. Об’являємо змінну hDriver для драйвера типу HANDLE.

4. Ініціалізуємо структуру reg = {0} управління регістром системного типу DIOC_REGISTERS

5. Ініціалізуємо структуру даних data = {0} типу DATABLOCK.

6. Об’являємо змінну bResult для логічного завершення.

7. Ініціалізуємо змінну результату проміжного запису dwResult = 0 типу DWORD.

8. Ініціалізуємо драйвер:

9. Ініціалізуємо сам драйвер системним викликом CreateFile з переметрами \\\\.\\vwin32, 0, 0, NULL, 0, FILE_FLAG_DELETE_ON_CLOSE, 0 і присвоюємо файловій змінній hDriver.

10. Якщо драйвер hDriver недоступний, тобто передалося системне значення при відкритті INVALID_HANDLE_VALUE, виходимо з функції і повертаємо значення falce.

11. Заповнюємо структуру даних DATABLOCK:

12. Елементу dwStartSector структури data присвоюємо значення dwStartSector через операцію з’єднання з елементом структури (крапка).

13. Елементу wNumtSector структури data присвоюємо значення wNumSector через операцію з’єднання з елементом структури (крапка).

14. Елементу pBuffer структури data присвоюємо значення lpBuffer типу DWORD через операцію з’єднання з елементом структури (крапка).

15. Заповнюємо структуру управління:

16. Елементу reg_EAX структури reg присвоюємо значення функції 0x7305 переривання 21h через операцію з’єднання з елементом структури (крапка).

17. Елементу reg_EВX структури reg присвоюємо структуру data (операція &-взяття адреси початку структури) типу DWORD через операцію з’єднання з елементом структури (крапка).

18. Елементу reg_EСX структури reg присвоюємо -1 через операцію з’єднання з елементом структури (крапка).

19. Елементу reg_EDX структури reg присвоюємо значення uDrive - номер логічного диску через операцію з’єднання з елементом структури (крапка).

20. Елементу reg_ESI структури reg присвоюємо значення адреси 0x6001 через операцію з’єднання з елементом структури (крапка).

21. Викликаємо функцію DeviceIoControl:

22. Організовуємо зчитування і передачу інформації для запису функцією DeviceIoControl при взаємодії з драйвером з відомими параметрами функції: hDriver, VWIN32_DIOC_DOS_DRIVEINFO, &reg, sizeof (reg), &reg, sizeof (reg), &dwResult, 0; де в параметрах 3-5 організована операція взяття адреси по посиланню на тип даних і присвоюємо результат змінній bResult.

23. Якщо виникла помилка – виходимо із функції:

24. Якщо bResult або reg.reg_Flags &CF_FLAG (через посилання на елемент і побітове додавання) пусті величини, то:

25. Функцією CloseHandle закриваємо драйвер hDriver.

26. Повертаємо значення false.

27. Повертаємо значення true.

 

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

 

 

Варіант 1 Варіант 2
Написати програму функціїдля читання сектора з диску Написати програму функції для запису сектора диску.

 

 


 


Поделиться:

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





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