NDIS, !ndiskd и DML

На работе понадобилось написать драйвер для сетевой карты. Я этого раньше никогда не делал и вообще с NDIS дела не имел. А тут такая возможность! Делюсь впечатлениями.

В общем и целом NDIS мне понравился. Интерфейсы довольно логичны, хотя и многочисленны. Взаимосвязь между разными компонентами в большинстве случаев после недолгой медитации становится довольно очевидной. Все структуры снабжены заголовком с сигнатурой, версией и размером, что, помимо заботы об обратной совместимости, означает меньше проблем с отладкой. При необходимости нужную структуру можно просто найти в памяти.

Не обошлось и без темного угла в чулане в виде кучи OID-ов. Их как-то очень много и не совсем понятно, на какие нужно отзываться, а какие можно игнорировать. Не смотря на то, что эта информация в MSDN есть. Сводная табличка, описывающая что нужно, а что нет, не помешала бы. Вроде вот этой: http://msdn.microsoft.com/en-us/library/ff557139(VS.85).aspx, только по всем OID-ам, сгруппированным по категориям: обязательные для всех, для Ethernet устройств, для TCP/IP Checksum Offloading, отдельно для TCP/IP Chimney Offloading и т.д.

Некоторые структуры запутаны. В том же TCP/IP Checksum Offloading используется несколько разных структур для описания фактически одного и того же: NDIS_TCP_IP_CHECKSUM_OFFLOAD, NDIS_OFFLOAD_PARAMETERS, NDIS_OFFLOAD_ENCAPSULATION.

Порадовало расширение для отладчика, написанное специально для NDIS: !ndiskd. Вот пример вывода информации по загруженным miniport-ам:

Пример вывода команды !ndiskd.miniport.

А вот – по конкретному miniport-у:

Другой пример вывода команды !ndiskd.miniport.

Активно и к месту используется DML. На подсвеченные ссылки можно кликать – расширение выведет более подробную информацию об этом элементе. Более того, к месту выводятся всякие полезные подсказки. Например, вот что выводит !ndiskd.miniport если .sympath не задан:

Подсказка про неверно настроенные символы.

Вообще DML крайне полезная штука. Очень жаль, что он практически не используется.

comments powered by Disqus