Чето я запутался. Когда дровина обрабатывает IRP_MJ_READ, IRP_MJ_WRITE то данные передаются в irp->MdlAddress (если флаг установлен в DO_DIRECT_IO). Размер этого буфера можно узнать с помощью MmGetMdlByteCount(irp->MdlAddress), а MmGetMdlByteOffset(irp->MdlAddress) возвращает смещение. Зачем нужно это смещение и нужно ли его использовать?