Вход на сайт
Как отправить IRP пакет из kernel mode в программу
352
08.09.15 22:45
Всем привет!
Имеется драйвер из него надо проагрмме отправить пакет (в принципе до фига пакетов илтбо это звуковой поток). Драйвер мой прога тоже моя как лучше сие сделать на винде. Ср-во разработки С++
Имеется драйвер из него надо проагрмме отправить пакет (в принципе до фига пакетов илтбо это звуковой поток). Драйвер мой прога тоже моя как лучше сие сделать на винде. Ср-во разработки С++
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...
https://msdn.microsoft.com/en-us/library/windows/desktop/aa365574%28v=vs.85%29.a...
NEW 16.09.15 13:04
в ответ Murr 16.09.15 11:43
А я что то про сервис подумал...
Тогда IOCTLs остается
Типа этого (в самом конце)
http://www.codeproject.com/Articles/9504/Driver-Development-Part-Introduction-to...
Тогда IOCTLs остается
Типа этого (в самом конце)
http://www.codeproject.com/Articles/9504/Driver-Development-Part-Introduction-to...
NEW 18.09.15 22:18
Пытаюсь таким способом реализовать. По сути ситуация такая - есть буфер уст-ва в который поступает инфа - содержимое данного буфера надо по запросу readfile запихнуть программе которая данный запрос делает. Именно из таких пакетов надо создать поток.
Кто работал на уровне ядра в винде с буфером подскажите пожалуйста.
в ответ 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
}
}
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 запихнуть программе которая данный запрос делает. Именно из таких пакетов надо создать поток.
Кто работал на уровне ядра в винде с буфером подскажите пожалуйста.