Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей.
Здесь обсуждаются безопасность, программирование, технологии и многое другое.
Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
 |
|
Проблемы с написанием драйвера |

25.09.2007, 15:45
|
|
Reservists Of Antichat - Level 6
Регистрация: 05.03.2007
Сообщений: 1,985
Провел на форуме: 3288241
Репутация:
3349
|
|
Проблемы с написанием драйвера
Вот сталкнулся с такой проблемой:
Програма должна постоянно считывать
через из драйвера через:
ReadFile струткуру следующего типа:
typedef struct _TMySTRUC // структура описывающая запрос к драйверу
{
HANDLE z1;
HANDLE z2;
} TMySTRUC, *PMySTRUC;
ВОт не могу написать как именно осуществить запись со стороны драйвера.
к примеру:
Код:
TMySTRUC mystruc;
mystruc->z1=11111;
mystruc->z2=22222;
irpStack = IoGetCurrentIrpStackLocation (Irp);
if (irpStack->MajorFunction == IRP_MJ_READ)
{
ВОт что сюда вставить, чтобы передаться струкруру
mystruc?????
}
Irp->IoStatus.Status = STATUS_SUCCESS;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return STATUS_SUCCESS;
Еще чуть запустался с IRP_MJ_READ и IRP_MJ_WRITE
КАк я понял irpStack->MajorFunction == IRP_MJ_READ
будет тогда когда програма будет читать данные из драйвера т.е. readfile, а IRP_MJ_WRITE - когда будет писать чтото драйверу.
Перебрал кучу документаций так толком и не понял как осуществить чтение и запись.
|
|
|

25.09.2007, 16:19
|
|
Флудер
Регистрация: 27.12.2005
Сообщений: 2,372
Провел на форуме: 5339610
Репутация:
4360
|
|
какой тип ввода-вывода?
1) если buffered (DO_BUFFERED_IO), тогда Irp->AssotiatedIrp.SystemBuffer указывает на системный буффер, который потом будет скопирован в пользовательский выходной (если это IRP_MJ_READ) или в который уже скопирован входной (если это IRP_MJ_WRITE)
другие типы тебе пока не нужны.. запутаешься нафиг.
тебе нужно лишь проверить длину буффера и скопировать туда структуру
|
|
|

27.09.2007, 16:58
|
|
Reservists Of Antichat - Level 6
Регистрация: 05.03.2007
Сообщений: 1,985
Провел на форуме: 3288241
Репутация:
3349
|
|
Чтото начал делать в этоге при копировании идет BSOD
Вообще драйвер должен перехватывать запуск процессов.
И потом по требованию возвращать PID и PARENT последнего запущенного процесса.
Код функции обработчика:
Код:
if (irpStack->MajorFunction == IRP_MJ_READ)
{
DPRINT("READ");
if (irpStack->Parameters.Read.Length < 8)
{
DPRINT("LENGTH < 8");
Irp->IoStatus.Status = status = STATUS_BUFFER_TOO_SMALL;
Irp->IoStatus.Information = 0;
IoCompleteRequest (Irp, IO_NO_INCREMENT);
return status;
} else
{
DPRINT("LENGTH OK");
Еcли раскоментировать, то BSOD >>> //RtlCopyMemory(Irp->AssociatedIrp.SystemBuffer, &RUNPROC, 8);
Irp->IoStatus.Status = status = STATUS_SUCCESS;
IoCompleteRequest (Irp, IO_NO_INCREMENT);
return status;
}
}
где
TRUNPROC RUNPROC
typedef struct _TRUNPROC
{
HANDLE parent;
HANDLE PID;
} TRUNPROC, *PRUNPROC;
И вот вопрос еще один. Как мне получать то, что выводится через DbgPrint?
Юзаю WinDbg. Т.е. я запускаю через него прогу, которая общается с драйвером, но почемуто сообщения от DbgPrint на экране они не появляются 
|
|
|

27.09.2007, 17:12
|
|
Постоянный
Регистрация: 27.08.2006
Сообщений: 367
Провел на форуме: 2009677
Репутация:
472
|
|
Путаешь. Для просмотра сообщений от DbgPrint тебе нужен DebugView от Sysinternals.
Сейчас посмотрю код.
|
|
|

27.09.2007, 21:33
|
|
Постоянный
Регистрация: 03.02.2007
Сообщений: 520
Провел на форуме: 1777536
Репутация:
932
|
|
Если я не ошибаюсь, то для передачи информации драйвер<->программа драйвер должен создать устройство, через которое будет передаваться инфа. Вот тебе:
http://www.wasm.ru/article.php?article=apihook_3 (см.Взаимодействие драйвера с приложением)
И вот: http://wasm.ru/article.php?article=drvw2k04
|
|
|

27.09.2007, 22:27
|
|
Reservists Of Antichat - Level 6
Регистрация: 05.03.2007
Сообщений: 1,985
Провел на форуме: 3288241
Репутация:
3349
|
|
не с устройсвом всё ок. всё создано отлично. И пашет отлично. А вот тока как именно драйвер должен передать ответ - хз.
На счет васма - процел всё - толком там не описано.
|
|
|

27.09.2007, 22:51
|
|
Постоянный
Регистрация: 27.08.2006
Сообщений: 367
Провел на форуме: 2009677
Репутация:
472
|
|
Да сделай ты через DeviceIoControl, проще будет, один из аргументов функции - буфер для обратного ответа. Будешь передавать драйверу IOCTL коды.
Код:
#define IOCTL_GETPID CTL_CODE(FILE_DEVICE_UNKNOWN, 0x01, \
METHOD_BUFFERED, \
FILE_READ_DATA | FILE_WRITE_DATA)
А драйвер будет обрабатывать их.
Код:
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = MyIrp;
...
NTSTATUS MyIrp(IN PDEVICE_OBJECT dev, IN PIRP pirp)
{
...
switch (ioctl_code)
{
case IOCTL_GETPID:
GetPid();
break;
default:
ns = STATUS_INVALID_DEVICE_REQUEST;
}
...
|
|
|

27.09.2007, 23:12
|
|
Reservists Of Antichat - Level 6
Регистрация: 05.03.2007
Сообщений: 1,985
Провел на форуме: 3288241
Репутация:
3349
|
|
с DbgPrint разобрался +
----------
Суть в том, что я юзаю DeviceIoControl для чуть другйо функции.
а именно - защита процесса. Чтобы его не могли выкинуть стандартными методами.
у меня он заюзан вот так:
if (irpStack->MajorFunction == IRP_MJ_DEVICE_CONTROL)
ProtectedPid = (HANDLE)irpStack->Parameters.DeviceIoControl.IoControlCode;
Последний раз редактировалось slesh; 27.09.2007 в 23:19..
|
|
|

27.09.2007, 23:26
|
|
Reservists Of Antichat - Level 6
Регистрация: 05.03.2007
Сообщений: 1,985
Провел на форуме: 3288241
Репутация:
3349
|
|
2 Ni0x В принципе можно былобы и сделать как ты говоришь, но тогда таже проблема - чтение и запись.
|
|
|

27.09.2007, 23:27
|
|
Постоянный
Регистрация: 27.08.2006
Сообщений: 367
Провел на форуме: 2009677
Репутация:
472
|
|
И в чем проблема использовать DeviceIoControl для всего?
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|