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

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

#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 проверка носителя. А вот и результат.

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

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


Загрузить проект | Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 29.11.2001