"> Алгоритм роботи програми працює з драйвером
Для роботи з драйвером додатком користувацького режиму необхідно отримати маніпулятор (хендл) драйвера. Цей маніпулятор можна отримати, використовуючи API-функцію CreateFile або CreateFileA, яка працює з ASCII-символами. Далі використовується API-функція DeviceIoControl, якої, в якості одного з параметрів, передається IOCTL-код. IOCTL-код це керуючий код, за допомогою якого драйвер дізнається про операцію, виконання якої запитує додаток, методі передачі параметрів та правах доступу, які необхідні додатком для виконання цієї операції. Після того як додаток викликало
драйверу відправляється IRP_MJ_DEVICE_CONTROL. Після завершення обробки запити додатком повертається управління та додатком залишається проаналізувати відповідь драйвера і закрити відкриті дескриптори. p align="justify"> Приклад
У наведеному нижче прикладі додаток режиму користувача відправляє запит IOCTL_DISK_GET_PARTITION_INFO_EX драйверу файлової системи, проводить аналіз отриманої інформації і виводить формат розділу жорсткого диска.
# include
# include _tmain (int argc, _TCHAR * argv [])
{
// 1st partdwBytesReturned = 0; cPartitionStyle [64] = {0}; _INFORMATION_EX piPartitionInfo;
// 2nd parthDevice = CreateFileA (
/* 1 */" . c:",
/* 2 */GENERIC_READ | GENERIC_WRITE,
/* 3 */FILE_SHARE_READ | FILE_SHARE_WRITE,
/* 4 */0,
/* 5 */OPEN_EXISTING,
/* 6 */0,
/* 7 */NULL); (hDevice == INVALID_HANDLE_VALUE)
{(NULL, "CreateFileA error!", "Error", 0); 1;
}
// 3rd part (DeviceIoControl (
/* 1 */(HANDLE) hDevice,
/* 2 */IOCTL_DISK_GET_PARTITION_INFO_EX,
/* 3 */NULL,
/* 4 */0,
/* 5 */& piPartitionInfo,
/* 6 */sizeof (piPartitionInfo),
/* 7 */& dwBytesReturned,
/* 8 */NULL
))
{
// 4th part (piPartitionInfo.PartitionStyle == PARTITION_STYLE_MBR)
{(NULL, "PARTITION_STYLE_MBR", "Caption", 0);
} if (piPartitionInfo.PartitionStyle == PARTITION_STYLE_GPT)
{(NULL, "PARTITION_STYLE_GPT", "Caption", 0);
}
{(NULL, "PARTITION_STYLE_RAW", "Caption", 0);
}
}
{(NULL,...