Функция NdisMRegisterDevice (ndis.h)
Примечание NDIS 5. X является нерекомендуемым и заменен NDIS 6. x. Сведения о разработке новых драйверов NDIS см. в статье Сетевые драйверы, начиная с Windows Vista. Сведения о переносе NDIS 5. x драйверы для NDIS 6. x, см. раздел Перенос драйверов NDIS 5.x в NDIS 6.0.
Функция NdisMRegisterDevice создает именованный объект устройства и символьную связь между объектом устройства и именем, видимым пользователем для этого устройства.
Синтаксис
NDIS_STATUS NdisMRegisterDevice(
[in] NDIS_HANDLE NdisWrapperHandle,
[in] PNDIS_STRING DeviceName,
[in] PNDIS_STRING SymbolicName,
[in] PDRIVER_DISPATCH *MajorFunctions,
[in] PDEVICE_OBJECT *pDeviceObject,
[out] NDIS_HANDLE *NdisDeviceHandle
);
Параметры
[in] NdisWrapperHandle
Указывает дескриптор, возвращаемый NdisMInitializeWrapper.
[in] DeviceName
Указатель на тип NDIS_STRING, содержащий строку Юникода с пустым завершением, которая называет объект устройства. Строка должна быть полным путем, например \Device\DeviceName. Для Windows 2000 и более поздних версий NDIS определяет тип NDIS_STRING как тип UNICODE_STRING .
[in] SymbolicName
Указатель на тип NDIS_STRING, содержащий строку Юникода, которая является видимым в Win32 именем регистрируемого устройства. Как правило, символьное имя имеет следующий формат: \DosDevices\SymbolicName.
[in] MajorFunctions
Указатель на массив из одной или нескольких точек входа для подпрограмм диспетчеризации драйвера устройства. Драйвер должен задать столько отдельных точек входа диспетчеризации, сколько кодов IRP_MJ_XXX , обрабатываемых драйвером для объекта устройства. Каждая подпрограмма диспетчеризации объявляется следующим образом:
NTSTATUS
(*PDRIVER_DISPATCH) (
IN PDEVICE_OBJECT Device Object,
IN PIRP Irp
) ;
Драйвер не должен предоставлять точки входа для обработчиков Plug and Play или управления питанием, так как созданный объект устройства не предназначен для физического устройства и поэтому не получает Plug and Play или irP управления питанием.
[in] pDeviceObject
Указатель на созданный объект устройства, если вызов выполнен успешно.
[out] NdisDeviceHandle
Указатель на переменную, предоставленную вызывающим объектом, в которой эта функция при успешном выполнении возвращает дескриптор объекту устройства. Этот дескриптор является обязательным параметром для функции NdisMDeregisterDevice , которую впоследствии вызывает драйвер.
Возвращаемое значение
NdisMRegisterDevice возвращает STATUS_SUCCESS в случае успеха, NDIS_STATUS_NOT_SUPPORTED, если вызывающий объект не является драйвером мини-порта NDIS, или код сбоя в случае сбоя.
Комментарии
Для промежуточного драйвера или драйвера мини-порта может потребоваться отдельный автономный объект устройства. Например, драйверу промежуточного мини-порта может потребоваться автономный объект устройства для отслеживания состояния базовой сетевой карты, когда драйвер мини-порта сетевой карты не работает. Чтобы получить состояние сетевой карты в таком случае, приложение или подсистема среды пользовательского режима отправляет IRP объекту устройства. IRP обрабатывается промежуточным драйвером. Без автономного объекта устройства состояние сетевого адаптера доступно только в том случае, если драйвер мини-порта сетевой карты запущен и работает.
Промежуточный драйвер или драйвер мини-порта создает объект устройства, вызывая NdisMRegisterDevice из функции DriverEntry после того , как DriverEntry вызвал NdisMInitializeWrapper. NdisMRegisterDevice создает именованный объект устройства, а также символьную связь между именем объекта устройства и именем, видимым пользователем для этого устройства. Если вызов NdisMRegisterDevice завершается успешно, диспетчер ввода-вывода выделяет хранилище в непагрегированном пуле для самого объекта устройства и для всех других структур данных, связанных с объектом устройства, включая расширение устройства драйвера. Расширение устройства для объекта, созданного с помощью NdisMRegisterDevice , зарезервировано для использования NDIS и не может использоваться драйвером.
Объект устройства, созданный с помощью функций NdisMRegisterDevice , так же, как объект устройства и символьная ссылка, созданные с помощью IoCreateDevice и IoCreateSymbolicLink соответственно. Драйвер мини-порта отвечает за обработку всех irP, получаемых для объекта устройства. (NDIS обрабатывает все Plug and Play и irP управления питанием, отправленные объекту устройства.) Драйвер обрабатывает irp, отправленные объекту устройства, с помощью подпрограмм диспетчеризации, которые он зарегистрировал при указании указателя MajorFunctions на NdisMRegisterDevice. Дополнительные сведения об объектах устройств, irP и подпрограммах диспетчеризации см. в разделах Объекты устройств и стеки устройств, Обработка irP и Написание подпрограмм диспетчеризации.
Драйверы NDIS miniport и промежуточные драйверы никогда не должны вызывать IoCreateDevice или IoCreateSymbolicLink. Вместо этого, если драйвер NDIS должен создать объект устройства, он должен вызвать NdisMRegisterDevice. Драйверы miniport и промежуточные драйверы никогда не должны пытаться сложить объект устройства поверх физического объекта устройства путем вызова IoAttachDevice.
Объект устройства, созданный с помощью NdisMRegisterDevice, не является физическим объектом устройства и поэтому не получает Plug and Play или irP управления питанием. Поэтому вызывающие элементы NdisMRegisterDevice должны пропускать точки входа для обработчиков Plug and Play или управления питанием в массиве, на который указывает MajorFunctions.
Обратите внимание, что если открыт дескриптор объекта устройства, созданного с помощью NdisMRegisterDevice , драйвер, создавший объект устройства, не может быть выгружен. Поэтому приложение в пользовательском режиме должно выполнять одно из следующих действий:
Когда приложение регистрирует уведомление о событиях устройства на базовом устройстве путем вызова функции RegisterDeviceNotification , укажите фильтр уведомлений типа DBT_DEVTYP_HANDLE. (Дополнительные сведения о функции RegisterDeviceNotification см. в документации по Microsoft Windows SDK.) Если приложение впоследствии получает событие DBT_DEVICEQUERYREMOVE для устройства, приложение должно закрыть открытый дескриптор.
Когда приложение регистрируется для уведомления о событиях устройства на базовом устройстве путем вызова функции RegisterDeviceNotification , укажите фильтр уведомлений типа DBT_DEVTYP_DEVICEINTERFACE и GUID_NDIS_LAN_CLASS в качестве GUID класса интерфейса. Если впоследствии приложение получает событие DBT_DEVICEREMOVECOMPLETE для интерфейса устройства, которому соответствует дескриптор, приложение должно закрыть открытый дескриптор.
Если вызов драйвера к NdisMRegisterDevice завершается сбоем, драйвер может продолжать загружаться или нет в зависимости от того, насколько важен автономный объект устройства для работы драйвера.
- Целевая платформа: универсальная
- Версия: не поддерживается для драйверов NDIS 6.0 в Windows Vista. Вместо этого используйте NdisRegisterDeviceEx. Поддерживается для драйверов NDIS 5.1 в Windows Vista и Windows XP.
Требования
Требование | Значение |
---|---|
Заголовок | ndis.h (включая Ndis.h) |
Библиотека | Ndis.lib |
IRQL | PASSIVE_LEVEL |