Вход на сайт
Как отправить IRP пакет из kernel mode в программу
352 просмотров
Перейти к просмотру всей ветки
в ответ 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 запихнуть программе которая данный запрос делает. Именно из таких пакетов надо создать поток.
Кто работал на уровне ядра в винде с буфером подскажите пожалуйста.