ндартне вікно, чи є він і якого типу, у вигляді тексту. Вказівка. Драйвер передає в зухвалу програму значення з CMOS, а саме з байта по зсуві 10h - наявність і тип дисководів A: (старша 16-ричная цифра) і B: (молодша). Значення: 0 - немає дисковода, 4 - на 1.44Мб
Лістинг shablon.c
# include // various NT definitions
# include
# define IOCTL_GET CTL_CODE (FILE_DEVICE_UNKNOWN, 0x800, METHOD_BUFFERED, FILE_READ_ACCESS + FILE_WRITE_ACCESS) _STRING g_usDeviceName; _STRING g_usSymbolicLinkName; DriverUnload (IN PDRIVER_OBJECT pDriverObject) {(& g_usSymbolicLinkName); (pDriverObject-> DeviceObject);
} DispatchCreateClose (PDEVICE_OBJECT pDeviceObject, PIRP pIrp) {//обробка MJ_CREATE MJ_CLOSE> IoStatus.Status = STATUS_SUCCESS;> IoStatus.Information = 0; (pIrp, IO_NO_INCREMENT); STATUS_SUCCESS;
} DispatchControl (PDEVICE_OBJECT pDeviceObject, PIRP pIrp) {//обробка IRP_MJ_DEVICECONTROLstatus; regEsi;
// беремо покажчик на IO_STACK_LOCATION, в ньому на == IOCTL_GET) {
// Порівнюємо код дії і якщо це таки наш клієнт, то:
_asm {eax, 0al, 10h70h, alal, 71hregEsi, eax
}
// це наша функціональність - беремо вміст регістра esi
// записуємо його в системний буфер
* ((int *) pIrp-> AssociatedIrp.SystemBuffer) = regEsi;> IoStatus.Information = 4;// і задаємо розмір результат = STATUS_SUCCESS;
} else status = STATUS_INVALID_DEVICE_REQUEST;> IoStatus.Status = status; (pIrp, IO_NO_INCREMENT); (status);
} DriverEntry (IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING pusRegistryPath) {Status; _OBJECT pDeviceObject;
// инициализируем Unicode-рядка (& g_usDeviceName, L " Device DevGet"); (& g_usSymbolicLinkName, L "?? sldevGet");
// заповнюємо об'єкт драйвера - дохідливо пояснюємо драйвера яка функція що обробляє> DriverUnload = & DriverUnload;> MajorFunction [IRP_MJ_CREATE] = & DispatchCreateClose;> MajorFunction [IRP_MJ_CLOSE] = & DispatchCreateClose; > MajorFunction [IRP_MJ_DEVICE_CONTROL] = & DispatchControl;
// створюємо логічний об'єкт віртуального пристрою = IoCreateDevice (pDriverObject, 0, & g_usDeviceName, FILE_DEVICE_UNKNOWN, 0, FALSE, & pDeviceObject); (! NT_SUCCESS (Status)) {return Status;}
// створюємо символьне посилання на пристрій = IoCreateSymbolicLink (& g_usSymbolicLinkName, & g_usDeviceName); (! NT_SUCCESS (Status)) {(pDeviceObject); Status;
} Status;
}
Лістинг курсовая2.cpp
# include "stdafx.h"
# include "windows.h"
...