Технологии доступа к данным в информационных системах: Файловая система NTFS. Павлов А.Ю. - 24 стр.

UptoLike

Составители: 

В буфер, адрес которого передается через параметр lpOutBuffer, будет записан
результат выполнения операции. Формат этого буфера также зависит от кода
операции.
При необходимости с помощью функции DeviceIoControl вы можете выполнять
асинхронные операции, подготовив структуру типа OVERLAPPED и передав ее
адрес через параметр lpOverlapped.
#include <windows.h>
#include <stdio.h>
#include <winioctl.h> // Windows NT IOCTL коды
// Регистры
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;
// Intel x86 флаг состояния процессора
#define CARRY_FLAG 0x1
// Функция получения информации об устройстве
DWORD GetDriveFormFactor(int iDrive)
{
HANDLE h;
TCHAR tsz[8];
DWORD dwRc;
// Преобразуем введенный параметр к форматированной строке
wsprintf(tsz, TEXT("\\\\.\\%c:"), TEXT('@') + iDrive);
// Открываем требуемое устройство
h = CreateFile(tsz, 0, FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);
// Если открытие успешно
if (h != INVALID_HANDLE_VALUE)
{
DISK_GEOMETRY Geom[20];
DWORD cb;
// Если вызов функции с кодом, позволяющим получить информацию о среде, которую
//можно использовать для хранения данных в устройстве, прошел успешно
if (DeviceIoControl (h, IOCTL_DISK_GET_MEDIA_TYPES, 0, 0,
Geom, sizeof(Geom), &cb, 0) && cb > 0)
{
// Можем выполнить
требуемые действия с определенным носителем
switch (Geom[0].MediaType)
{
case F5_1Pt2_512: // 5.25 1.2MB floppy
case F5_360_512: // 5.25 360K floppy
case F5_320_512: // 5.25 320K floppy
case F5_320_1024: // 5.25 320K floppy
case F5_180_512: // 5.25 180K floppy
case F5_160_512: // 5.25 160K floppy