Со времен 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, ®, sizeof(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 а дальше по порядку. Думаю, что теперь смысл этой функции становить понятен. Мы может непосредственно обращаться к драйверам устройств. Для этого нам нужно знать правила, регистры и все прочее. Это оговаривается в документации и спецификациях.