Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

Как отправить IRP пакет из kernel mode в программу

352  
bars_12 коренной житель08.09.15 22:45
08.09.15 22:45 
Всем привет!
Имеется драйвер из него надо проагрмме отправить пакет (в принципе до фига пакетов илтбо это звуковой поток). Драйвер мой прога тоже моя как лучше сие сделать на винде. Ср-во разработки С++
#1 
AlexNek патриот15.09.15 17:20
AlexNek
NEW 15.09.15 17:20 
в ответ bars_12 08.09.15 22:45
Как лучше в конкретном случае сказать затруднительно но выбор есть..
https://msdn.microsoft.com/en-us/library/windows/desktop/aa365574%28v=vs.85%29.a...
#2 
Murr патриот16.09.15 11:43
Murr
NEW 16.09.15 11:43 
в ответ AlexNek 15.09.15 17:20
То, что описано по линку, описывает обмен между одинаковыми классами
(3-й и 4-й уровень модели) приложений.
При работе ИЗ ядра имеются, как Я помню, дополнительные ограничения.
#3 
AlexNek патриот16.09.15 13:04
AlexNek
NEW 16.09.15 13:04 
в ответ Murr 16.09.15 11:43
А я что то про сервис подумал...
Тогда IOCTLs остается
Типа этого (в самом конце)
http://www.codeproject.com/Articles/9504/Driver-Development-Part-Introduction-to...
#4 
Murr патриот16.09.15 13:22
Murr
NEW 16.09.15 13:22 
в ответ AlexNek 16.09.15 13:04
Увы, на этом уровне Я писал только для <DOS>а...
#5 
bars_12 коренной житель18.09.15 14:51
NEW 18.09.15 14:51 
в ответ AlexNek 15.09.15 17:20
спасибо. делаю через событие EvtIoRead - т е readfile на стороне user mode.
#6 
bars_12 коренной житель18.09.15 22:18
NEW 18.09.15 22:18 
в ответ AlexNek 16.09.15 13:04
В ответ на:
VOID
FileEvtIoRead(
IN WDFQUEUE Queue,
IN WDFREQUEST Request,
IN size_t Length
)
{
// сама проверка запроса readfile
status = WdfRequestRetrieveOutputBuffer(Request, 0, &outBuf, &bufLength);
if (!NT_SUCCESS(status)) {
WdfRequestComplete(Request, status);
return;
}
// если запрос имел место
// получить контекст уст-ва для извлечения буфера с данными - в принципе как писал выше буфер есть но как переслать без изврата и глоб. переменной не знаю
WDFCONTEXT Context = GetDeviceContext();
PEBTH_REPEAT_READER repeatReader = (PEBTH_REPEAT_READER)Context;
// сам буфер
RtlCopyMemory(outBuf, repeatReader->TransferBrb.Buffer, repeatReader->TransferBrb.BufferSize);
// далее не тестированный неправильный код - как сделать правильно? - формирование и пересылка irp
IRP Irp;
PIRP pIrp = &Irp;
// pIrp->UserBuffer = aBuffer;
pIrp->IoStatus.Status = STATUS_SUCCESS;
pIrp->IoStatus.Information = BufferSize;
IoCompleteRequest(pIrp, IO_NO_INCREMENT);
MyTraceFunc(0, TRACE_LEVEL_INFORMATION, DBG_CONT_READER,
"After IoCompleteRequest\n");
NTSTATUS status = pIrp->IoStatus.Status;
if (NT_SUCCESS(status))
{
// to do
}
else
{
// to do
}
}

Пытаюсь таким способом реализовать. По сути ситуация такая - есть буфер уст-ва в который поступает инфа - содержимое данного буфера надо по запросу readfile запихнуть программе которая данный запрос делает. Именно из таких пакетов надо создать поток.
Кто работал на уровне ядра в винде с буфером подскажите пожалуйста.
#7