Можно ли тащить в драйвер обычные linkedlist'ы на Си или юза
От: LimyKurn  
Дата: 22.09.18 04:24
Оценка:
ть лишь NTшные?

Пример ситуации.
Есть код драйвера. Там есть минифильтр с каллбеками, который кладет данные в очередь, и отдельный поток, которые каждые n минут проверяет эту очередь, и если заполнена — то передает ее куда-то далее, и очищает\пересоздает очередь. В качестве очереди автор выбрал никакой не список, а просто PWCHAR фиксированной длины, и это, конечно, тоже решение, но, например, оно почти не поддается масштабированию. Надо бы его заменить списком.

Еще пример. Здесь случай уже несколько иной.
В реестре есть настройка — ключ строкового типа, который содержит список строк через разделитель. Логичнее еще в DriverEntry распарсить эту строку на linked list, чем парсить ее каждый раз снова и снова. Опять же нужен список.

Объединяет эти случаи одно — и там, и тут нужен список.

Но стоит ли торопиться сразу осваивать специальные списки NT, такие, как SINGLE_LIST_ENTRY?
И что, если между тем списки нужны еще на одной платформе — смежной по применению, но в корне отличающейся технически — такой, как микроконтроллеры? Там уж точно не пригодятся знания NT. То есть, тебе всё равно предстоит смотреть самодельные реализации списков на Си с гитхаба, выбирать какую-то из них и допиливать ее.
Приходится всерьез рассмотреть что-то вроде "кроссплатформенности", вернее — переносимости кода.

В основе переделки — замена malloc/free на ExAllocate***/ExFree***.

Менее очевидные нюансы:
— NT обычно требовательно к быстродействию. Ранее уже упоминались каллбеки, так они могут вызываться очень много где и очень много раз подряд. Чем быстрее они будут отрабатывать — тем лучше. Но разве что-то может быть быстрее, чем твоя собственная реализация linkedlist'а, где ты можешь реализовать любые свои хотелки, да и априори ничего дорогого там вроде нет?
— Синхронизация в NT более сложная. В тех же каллбеках иногда доступны лишь спинлоки и InterlockedExchange. Тем не менее, не видится проблем все это приспособить к списку — если уж он вообще годен в сложившейся ситуации как таковой.

Если тащить эти linkedlist'ы в драйвер все-таки решительно нельзя — то я готов с этим согласиться. Но ответ нужен аргументированный, чтобы знать почему, и уметь кому-нибудь объяснить.
Отредактировано 22.09.2018 4:28 LimyKurn . Предыдущая версия . Еще …
Отредактировано 22.09.2018 4:28 LimyKurn . Предыдущая версия .
Отредактировано 22.09.2018 4:26 LimyKurn . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.