ВУЗ:
Составители:
void ReadFirstSector(void)
{
HANDLE hDev;
BYTE buf[512];
// получаем дескриптор виртуального драйвера
hDev = CreateFileA("\\\\.\\VWIN32", 0, 0, 0, 0, FILE_FLAG_DELETE_ON_CLOSE, 0);
if (hDev != INVALID_HANDLE_VALUE)
{
ReadWriteSectors (hDev, 1, 0, 1, buf, TRUE);
…
CloseHandle(hDev); // закрываем драйвер
}
}
Кроме того, в ОС направления Windows Me для чтения блока параметров BIOS
можно использовать прерыванием 21h функцией 440Dh с минор кодом 60h.
#include <windows.h>
#define VWIN32_DIOC_DOS_IOCTL 1
typedef struct _DIOC_REGISTERS {
DWORD reg_EBX;
DWORD reg_EDX;
DWORD reg_ECX;
DWORD reg_EAX;
DWORD reg_EDI;
DWORD reg_ESI;
DWORD reg_Flags;
} DIOC_REGISTERS, *PDIOC_REGISTERS;
#define CARRY_FLAG 0x1
#pragma pack(1)
typedef struct tagEA_DEVICEPARAMS
{
BYTE bSpecFunc; // специальная функция
BYTE bDevType; // тип устройства
WORD wDevAttr; // атрибуты устройства
WORD wCylinders; // количества цилиндров
BYTE bMediaType; // тип среды
// блок параметров BIOS (BPB)
WORD wBytesPerSec; // байтов в секторе
BYTE bSecPerClust; // секторов в кластере
WORD wResSectors; // количество зарезервированных секторов
BYTE bFATs; // количества FAT
WORD wRootDirEnts; // количества элементов корневой директории
WORD wSectors; // всего секторов
BYTE bMedia; // описатель среды
WORD wFATsecs; // количество секторов, занятых FAT
WORD wSecPerTrack; // количество секторов на дорожке
WORD wHeads; // количество головок
LONG dwHiddenSect; // количество скрытых секторов
LONG dwBigTotalSectors; // всего секторов на томе
LONG dwBigSectorsPerFat; // количество секторов, занятых FAT
WORD dwExtFlags; // флаг описания драйвера
WORD dwFS_Version; // номер версии файловой системы
LONG dwRootDirStrtClus; // начальный кластер корневой директории