C++ C++ C# C# ASP.NET Security ASP.NET Security ASM ASM Скачать Скачать Поиск Поиск Хостинг Хостинг  
  Программа для работы с LPT портом...
Язык: .NET — ©Alexey...
  "ASP.NET Atlas" – AJAX в исполнении Micro...
Язык: .NET — ©legigor@mail.ru...
  "Невытесняющая" Многопоточность...
Язык: C/C++ — ©...
  01.05.2010 — Update World C++: Сборник GPL QT исходников
  15.12.2007 — Весь сайт целиком можно загрузить по ссылкам из раздела Скачать
Хостинг:
Windows 2003, ASP.NET 2.0
бесплатный и от 80 руб./мес


   Отправить письмо
Кулабухов Артем, Беларусь




 167 - Понимание функции DeviceIoControl / Win 32 API / Win32 API

Шаг 167 - Понимание функции DeviceIoControl

Со времен MS DOS не очень много чего изменилось. Как были устройства так они и есть. Как была идея использование прерываний так она и осталась. Сейчас нельзя напрямую получить доступ к устройствам. Для этого существуют VXD драйвера. Подробнее читайте "Шаг 151 - Что такое VXD". Основывается работа на использовании прерываний. Тут бы я посоветовал, если Вы вообще не знаете ассемблера прочитать шаги от "Шаг 1 - Где взять и установка" до "Шаг 19 - Функция 44H подфункция 08H INT 21H проверка носителя". Если ассемблер Вы знаете, то достаточно "Шаг 19 - Функция 44H подфункция 08H INT 21H проверка носителя". Итак, функция DeviceIoControl описанная в прошлом шаге может нам дать доступ к функциям прерывания INT21H 44H. Для этого нужно использовать код операции VWIN32_DIOC_DOS_IOCTL. То есть мы получаем доступ и функция контроля ввода вывода IOCTL по идеологии похожими на ДОС. Подробнее о IOCTL читайте "Шаг 15 - Что такое IOCTL". Смотрим код:

#include "stdafx.h"
#include "windows.h"
#include "iostream.h"

typedef struct DIOCRegs {
	DWORD reg_EBX;
	DWORD reg_EDX;
	DWORD reg_ECX;
	DWORD reg_EAX;
	DWORD reg_EDI;
	DWORD reg_ESI;
	DWORD reg_Flags;      
} DIOC_REGISTERS;

#define VWIN32_DIOC_DOS_IOCTL 1

void main()
{
	HANDLE hDevice;
	hDevice = CreateFile("\\\\.\\vwin32", 0, 0, NULL,
		0,FILE_FLAG_DELETE_ON_CLOSE, NULL);
	if (hDevice != INVALID_HANDLE_VALUE)
	{
		DWORD dw;
		BOOL result;
		for (unsigned int x=15;x>0;x--)
		{
			DIOC_REGISTERS reg;
			reg.reg_EAX = 0x8;
			reg.reg_EBX = x;
			result = DeviceIoControl(hDevice,VWIN32_DIOC_DOS_IOCTL,
				&reg, sizeof(reg), &reg, sizeof(reg), &dw, 0);
			if (result != 0) 
			{
				cout << x << "Ok - " << reg.reg_EAX << endl;
				if (reg.reg_EAX==0)
					cout << " removable   " << endl;
				if (reg.reg_EAX==1)
					cout << " not removable" << endl;
				if (reg.reg_EAX==0x0F)
					cout << " error " << endl;
			}
			else
			{
				cout << GetLastError() << endl;
				cout << "Error" << endl;
			}
		}
		CloseHandle(hDevice);
	}
	else cout << "Error Open " << endl;
}

Мы вызываем функцию 08H которая может нам вернуть является ли диск извлекаемым или нет. Подробнее в шаге Функция 44H подфункция 08H INT 21H проверка носителя. А вот и результат.

167_1.gif (2840 b)

В отличии от версии 16 разрядной созданной на TASM мы смогли узнать что диск 2 (B) это ERROR и правда у меня он не установлен. А дисков у меня и правда 7.

167_2.gif (2152 b)

Диск C или первый жесткий имеет номер 3 а дальше по порядку. Думаю, что теперь смысл этой функции становить понятен. Мы может непосредственно обращаться к драйверам устройств. Для этого нам нужно знать правила, регистры и все прочее. Это оговаривается в документации и спецификациях.


Загрузить проект | | |
Автор Каев Артем.
[AD]