для KMDF не подскажу, но поскольку они базируются на WDM...
общая идея для WDM драйверов такая:
существуют три вида передачи данных.
1. через промежуточный буфер организуемый ОС. в этом случае буфер один его размер - равен MAX размеру входного/выходного буфера.
при входе туда копируется исходная информация, перед выходом из драйвера вы комируете туда выходную.
при входе вам отдается входной размер, перед выходом вы обязаны установить объем который скопировали туда на отдачу.
2. через MDL - тут в двух словах не расскажешь, надо читать глазами. на русском - есть, так что повторяться не буду.
3. напрямую через указатель ring-3. тоже читать глазами. много нюансов.
для начала подойдет первый - как самый простой он называется METHOD_BUFFERED или как-то так...
определить вы должны его тоже правильно
#define IOCTL_TEST_SMTH CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 300,
METHOD_NEITHER, FILE_ANY_ACCESS) // READ_USN_JOURNAL_DATA, USN
METHOD_NEITHER - это третий метод.
далее вы должны извлечь адрес входного буфера (лежит в irp), ОБЯЗАТЕЛЬНО проверить его длинну. и работать.
в случаях (2-3) предстоят промежуточные действия - в примерах все должно быть.
не забывать что в случае буферизации - буфер общий, поэтому писать в него ТОЛЬКО после того как все прочитали и обработали.
перед выходом записать выходные данные и установить в поле статуса выходную длинну.
после этого завершить обработку IRP. и выставить статус обработки.
как-то так)
PS приобретите книгу по KMFD Пенни Орвик. она во-первых качественно переведена на русский, а во вторых очень подробная. даже слишком)
на ваше счастье нужный отрывок выложили
http://www.bhv.ru/books/get_pdf_data.php?id=184059PPS посмотрите здесь
http://download.microsoft.com/download/f/0/5/f05a42ce-575b-4c60-82d6-208d3754b2d6/Porting-WDM-Drvs-to-KMDF.ppt#330,52,Read/Write/IOCTL Callbacksи следующие страницы там очень наглядно и структурно. и как раз по KMDF. в общем ответ на ваш вопрос)