Windows драйвер с или без INF-файла - PullRequest
0 голосов
/ 09 апреля 2020

Я видел два способа установки Windows драйверов.
a. Использование файла SYS и INF-файла. (например, драйвер NDIS)
b. Используйте только файл SYS, драйвер будет загружен службой. (например, драйверы в C: \ Windows \ System32 \ drivers)

Итак, мой вопрос:
1. Для каких драйверов или ситуаций требуется INF-файл?
2. Что является root причиной этой разницы?

1 Ответ

2 голосов
/ 10 апреля 2020

На Windows есть различные виды драйверов. Каждый тип драйвера имеет свою собственную историю установки драйвера. Вот несколько распространенных типов драйверов.

Драйвер устройства PNP . Драйвер устройства PNP управляет устройством в дереве устройств. Драйверы PNP загружаются PNP, когда устройство перечисляется его родительской шиной. Чтобы PNP знал, какой тип устройства поддерживает ваш драйвер (и кучу других вещей), вам нужен INF-стиль в формате PNP, который описывает ваш драйвер.

Драйвер, управляемый SCM (иногда называемый «устаревшим водителем»). SCM загружает эти драйверы на основе тех же правил, которые используются для запуска служб NT. СКМ не требует никаких INF. Вы можете зарегистрировать новый драйвер в SCM, просто запустив sc.exe create my_cool_driver type=kernel binPath=c:\my\driver.sys start=auto или вызвав CreateService API. Но если у вас уже есть INF по другим причинам, вы можете использовать любой стиль INF, чтобы сделать то же самое с помощью директивы AddService.

Облегченный фильтр NDIS (LWF) водитель . LWF не загружаются NDIS; NDIS не волнует, как они загружены. Большинство LWF выбирают для загрузки SCM, так как это легко контролировать. Однако INF-стиль NetCfg по-прежнему требуется, поскольку NDIS необходимо знать, к каким типам сетевых адаптеров подключать фильтр (например, Ethe rnet против WLAN).

Драйвер экспорта . Драйвер экспорта загружается диспетчером памяти, когда Mm пытается загрузить другой драйвер, который импортирует из него функции. Драйвер экспорта - это просто ядро, эквивалентное DLL - он просто предоставляет API для других драйверов. Драйверы экспорта не нуждаются в INF; их просто нужно поместить в правильный каталог на диске. Если у вас уже есть INF по другим причинам, вы можете использовать для этого директиву CopyFiles.

Драйвер WinUSB . WinUSB - это встроенный драйвер, который делегирует большую часть обязанностей по управлению USB-устройством API-интерфейсам пользовательского режима, поэтому любое приложение может легко выполнять простые действия с устройством. Это означает, что практически любое приложение может быть драйвером для устройства. Если устройство USB помещает определенные данные в свой аппаратный дескриптор, Windows будет знать, как автоматически настроить WinUSB, поэтому INF не требуется. Но если оборудование не сообщает о том, что ему нужен WinUSB, то вам понадобится INF в WinUSB-стиле, чтобы сообщить Windows о настройке WinUSB для вас. Кроме того, вам не нужен INF для вызова WinUSB API из вашего приложения.

Если вы просто экспериментируете и хотите для удовольствия вызвать несколько API-интерфейсов ядра, вы можете выбрать любой тип драйвера. Большинство людей считают, что драйвер, управляемый SCM, является самым простым, так как вам не нужен никакой INF, и вы получаете полный контроль над запуском и остановкой драйвера. Но в любой другой ситуации выбор типа драйвера во многом определяется проблемой, которую вы пытаетесь решить. Например, если вы пишете драйвер для PCI GPU, вы должны использовать драйвер PNP и, следовательно, иметь INF-стиль в стиле PCI.

...