Показать сообщение отдельно

  #7  
Старый 27.08.2009, 23:33
slesh
Познавший АНТИЧАТ
Регистрация: 05.03.2007
Сообщений: 1,985
Провел на форуме:
3288241

Репутация: 3349


Отправить сообщение для slesh с помощью ICQ
По умолчанию

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
 
Ответить с цитированием