Как предварительно обработать буфер и пройти через него

как отправить запрос следующему драйверу в стеке для дальнейшего завершения?

В моем драйвере драйвера фильтра я регистрирую очередь для EventWrite с обратным вызовом EvtDeviceIoWrite следующим образом:

VOID
EvtDeviceIoWrite(
    IN WDFQUEUE  Queue,
    IN WDFREQUEST  Request,
    IN size_t Length
)
{
    WDFMEMORY memory;
    NTSTATUS status;
    PUCHAR characters;
    UCHAR currentChar;
    UNREFERENCED_PARAMETER(Queue);

    status = WdfRequestRetrieveInputMemory(Request, &memory);
    if (!NT_SUCCESS(status)) {
        KdPrint(("RetreiveInputMemo:  failed 0x%x\n", status));
        return;
    }
    characters = (PUCHAR)WdfMemoryGetBuffer(memory, NULL);
    while (Length != 0) {
        Length--;
        currentChar = *(characters++);
        // Here I would like to edit the buffer
        // copy it to output buffer WdfMemoryCopyFromBuffer
    }
  **// what should be here for send** 
}

Я просто хочу сделать что-то вроде этот, но для запроса.

Извините, я новичок в разработке ядра, и было бы здорово, если бы кто-нибудь мог указать мне правильный способ добиться этого. Любые предложения будут оценены.


person Jak ttt    schedule 01.02.2017    source источник
comment
Или я делаю это совершенно неправильно, пожалуйста, посоветуйте мне   -  person Jak ttt    schedule 02.02.2017


Ответы (1)


в Windows-driver-samples существует огромное количество примеров того, как Пересылка запросов ввода-вывода. возьмем, например, сначала просто код, как в filter.c — здесь это сделано FilterForwardRequest или FilterForwardRequestWithCompletionRoutine - так вообще называется

WdfRequestSend(Request, WdfDeviceGetIoTarget(WdfIoQueueGetDevice(Queue)),WDF_NO_SEND_OPTIONS);
person RbMm    schedule 02.02.2017
comment
Я пробовал это таким образом, но, к сожалению, это не работает. Чтобы проверить это, я настроил это соединение и отправил данные: echo 'a' -> virual machnie com2 <-> host port -com3 <null modem> com4 <- Termite (serial termial), и без драйвера пакеты данных отправляются правильно. Поскольку я установил этот драйвер с вашим предложением, любые пакеты принимаются на com4 - person Jak ttt; 02.02.2017
comment
Я также проверил, что команда WdfRequestSend вызывается при отправке данных на com2. - person Jak ttt; 02.02.2017
comment
WdfRequestSend возвращает false, поэтому я проверил WdfRequestStatus, и статус равен (printf %x, статус) 1f82d524, все было бы здорово, если бы этот номер был в документации Microsoft.... - person Jak ttt; 03.02.2017
comment
@Jakttt - WdfRequestGetStatus никогда не возвращайте этот код 1f82d524. это 100%. при ошибке всегда 0 > status ошибка в вашем коде - person RbMm; 03.02.2017
comment
Хорошо, это была моя ошибка, кстати статус теперь равен STATUS_INVALID_DEVICE_REQUEST. Так что это все еще не работает. - person Jak ttt; 05.02.2017
comment
Хорошо, нужно добавить подпрограмму завершения или WDF_REQUEST_SEND_OPTIONS_INIT(&options, WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET); перед отправкой, как это есть в предоставленном вами filter.c. Спасибо за помощь. - person Jak ttt; 06.02.2017