Добрый день.
У меня есть kmdf-драйвер для PCIe-устройства. Сейчас стоит задача разработать cpp-приложение верхнего уровня для работы с этим драйвером.
Драйвер принимает от cpp-приложения IRP-запросы и обрабатывает их в режиме PIO (взаимодействие через окно BAR0). В частности, запрос на запись обрабатывается так:
...
WdfMemoryCopyToBuffer(
regMemory,
0,
(INT *)devExt->RegsBase, // Указатель на начало окна BAR0
Length);
WdfRequestCompleteWithInformation(Request, STATUS_SUCCESS, Length);
...
Запрос на запись посылается из cpp-приложения командой:
WriteFile(
hDevice,
WriteBuffer,
WriteBufferSize,
&bytes,
NULL);
После выполнения этой команды содержимое буфера WriteBuffer действительно помещается в начало окна BAR0, а bytes становится равным значению WriteBufferSize.
ВОПРОС. Как сделать произвольный доступ к окну BAR0?
Попробовал перед WriteFile выполнить функцию SetFilePointer:
SetFilePointer(
hDevice,
offset, // Младший адрес смещения относительно начала файла (пробовал разные значения)
NULL, // Окно BAR0 всего 2КБ, так что длинный указатель тут не нужен (делаем старший адрес - NULL)
FILE_BEGIN);
но содержимое буфера всё равно пишется в начало окна BAR0.
Более того, если я два раза подряд выполняю функцию WriteFile, то второй вызов функции приводит к тому, что перезаписываются данные, записанные первым вызовом. Т.е. указатель после WriteFile почему-то не перемещается