![]() |
Проблемы с написанием драйвера
Вот сталкнулся с такой проблемой:
Програма должна постоянно считывать через из драйвера через: ReadFile струткуру следующего типа: typedef struct _TMySTRUC // структура описывающая запрос к драйверу { HANDLE z1; HANDLE z2; } TMySTRUC, *PMySTRUC; ВОт не могу написать как именно осуществить запись со стороны драйвера. к примеру: Код:
TMySTRUC mystruc;КАк я понял irpStack->MajorFunction == IRP_MJ_READ будет тогда когда програма будет читать данные из драйвера т.е. readfile, а IRP_MJ_WRITE - когда будет писать чтото драйверу. Перебрал кучу документаций так толком и не понял как осуществить чтение и запись. |
какой тип ввода-вывода?
1) если buffered (DO_BUFFERED_IO), тогда Irp->AssotiatedIrp.SystemBuffer указывает на системный буффер, который потом будет скопирован в пользовательский выходной (если это IRP_MJ_READ) или в который уже скопирован входной (если это IRP_MJ_WRITE) другие типы тебе пока не нужны.. запутаешься нафиг. тебе нужно лишь проверить длину буффера и скопировать туда структуру |
Чтото начал делать в этоге при копировании идет BSOD
Вообще драйвер должен перехватывать запуск процессов. И потом по требованию возвращать PID и PARENT последнего запущенного процесса. Код функции обработчика: Код:
if (irpStack->MajorFunction == IRP_MJ_READ)TRUNPROC RUNPROC typedef struct _TRUNPROC { HANDLE parent; HANDLE PID; } TRUNPROC, *PRUNPROC; И вот вопрос еще один. Как мне получать то, что выводится через DbgPrint? Юзаю WinDbg. Т.е. я запускаю через него прогу, которая общается с драйвером, но почемуто сообщения от DbgPrint на экране они не появляются :( |
Путаешь. Для просмотра сообщений от DbgPrint тебе нужен DebugView от Sysinternals.
Сейчас посмотрю код. |
Если я не ошибаюсь, то для передачи информации драйвер<->программа драйвер должен создать устройство, через которое будет передаваться инфа. Вот тебе:
http://www.wasm.ru/article.php?article=apihook_3 (см.Взаимодействие драйвера с приложением) И вот: http://wasm.ru/article.php?article=drvw2k04 |
не с устройсвом всё ок. всё создано отлично. И пашет отлично. А вот тока как именно драйвер должен передать ответ - хз.
На счет васма - процел всё - толком там не описано. |
Да сделай ты через DeviceIoControl, проще будет, один из аргументов функции - буфер для обратного ответа. Будешь передавать драйверу IOCTL коды.
Код:
#define IOCTL_GETPID CTL_CODE(FILE_DEVICE_UNKNOWN, 0x01, \Код:
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = MyIrp; |
с DbgPrint разобрался +
---------- Суть в том, что я юзаю DeviceIoControl для чуть другйо функции. а именно - защита процесса. Чтобы его не могли выкинуть стандартными методами. у меня он заюзан вот так: if (irpStack->MajorFunction == IRP_MJ_DEVICE_CONTROL) ProtectedPid = (HANDLE)irpStack->Parameters.DeviceIoControl.IoControlCode; |
2 Ni0x В принципе можно былобы и сделать как ты говоришь, но тогда таже проблема - чтение и запись.
|
И в чем проблема использовать DeviceIoControl для всего?
|
| Время: 19:33 |