2 ntldr
1) в DriverEntry пишеш
Код:
NTSTATUS st;
PCWSTR dDeviceName = L"\\Device\\DRVNAME";
PCWSTR dSymbolicLinkName = L"\\DosDevices\\DRVNAME";
RtlInitUnicodeString(&DeviceName, dDeviceName);
RtlInitUnicodeString(&SymbolicLinkName, dSymbolicLinkName);
st = IoCreateDevice(DriverObject, 0, &DeviceName, FILE_DEVICE_UNKNOWN, 0, FALSE, &deviceObject);
if (NT_SUCCESS(st)) st=IoCreateSymbolicLink(&SymbolicLinkName, &DeviceName);
if (!NT_SUCCESS(st)) return STATUS_DRIVER_INTERNAL_ERROR;
DriverObject->DriverUnload=DriverUnload;
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DriverDispatcher;
другими словами регаешь устройство.
DriverDispatcher - функция обработчик запросов к устройству. В ней ты будеш обрабатывать IOCTL запросы
типа
Код:
NTSTATUS DriverDispatcher(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
{
NTSTATUS status=STATUS_SUCCESS;
PIO_STACK_LOCATION irpStack;
irpStack = IoGetCurrentIrpStackLocation (Irp);
Irp->IoStatus.Information=0;
if (irpStack->MajorFunction == IRP_MJ_DEVICE_CONTROL)
{
if (irpStack->Parameters.DeviceIoControl.IoControlCode==IOCTL_QUERY)
{
DPRINT("QUERY");
тут ты делаеш всю обработку. Короче читай работу с дровами
} else status = STATUS_INVALID_DEVICE_REQUEST;
}
Irp->IoStatus.Status = status;
IoCompleteRequest(Irp,IO_NO_INCREMENT);
return status;
}
А в проге открываеш файл
CreateFile("\\\\.\\DRVNAME) и через DeviceIoControl отправляй запросы дрову.
PS - IOCTL_QUERY это моя буфкция обработчик которая строится так:
#define IOCTL_QUERY CTL_CODE(FILE_DEVICE_UNKNOWN, 0x01, METHOD_OUT_DIRECT, FILE_ALL_ACCESS)
METHOD_OUT_DIRECT значит прямой доступ к выходному буферу(без использования промежуточного)
Это всё описано в книге Солдатов В.П. Программирование драйверов Windows.
2) врядли будет пахать int 2eh потому как он устанавливается как дань традициям, но всё равно юзается тока sysenter если винда начиная с XP и проц начиная с P2