Регистрация и открытие семейства адресов
Диспетчер звонков должен зарегистрировать семейство адресов для каждого сетевого адаптера, на котором он предоставляет службы диспетчера вызовов клиентам, ориентированным на подключение. Аналогичным образом драйвер MCM должен зарегистрировать семейство адресов для управляемого сетевого адаптера.
Регистрируя семейство адресов, диспетчер вызовов или драйвер MCM приводит к тому, что NDIS объявляет службы диспетчера вызовов или драйвера MCM всем клиентам, ориентированным на подключение, которые привязываются к адаптеру.
Если клиент, ориентированный на подключение, может использовать службы, объявленные диспетчером вызовов или драйвером MCM, он может открыть семейство адресов с помощью диспетчера вызовов или драйвера MCM.
Регистрация семейства адресов из диспетчера вызовов
После того как функция ProtocolBindAdapterEx привязывается к базовому драйверу минипорта с помощью NdisOpenAdapterEx, диспетчер вызовов вызывает NdisCmRegisterAddressFamilyEx , чтобы зарегистрировать семейство адресов для привязки (см. следующий рисунок).
Вызов NdisCmRegisterAddressFamilyEx объявляет конкретные службы сигнализации диспетчера вызовов. Диспетчер вызовов должен регистрировать семейство адресов каждый раз, когда его функция ProtocolBindAdapterEx вызывается и успешно привязывается к сетевому адаптеру с помощью NdisOpenAdapterEx.
Диспетчер звонков может поддерживать несколько семейств адресов для всех водителей минипорта, к которым он привязан. Диспетчер звонков также может поддерживать несколько семейств адресов на одном сетевом адаптере, к которому он привязан. Диспетчер вызовов должен зарегистрировать одни и те же точки входа для каждого семейства адресов в привязке. Только один диспетчер звонков может поддерживать определенный тип семейства адресов для клиентов, привязанных к какому-либо конкретному драйверу мини-порта. Дополнительные сведения о регистрации точек входа для диспетчера вызовов см. в разделе Регистрация CoNDIS.
Регистрация семейства адресов из драйвера MCM
Драйвер MCM вызывает NdisMCmRegisterAddressFamilyEx из функции MiniportInitializeEx после регистрации точек входа драйвера miniport в NdisMRegisterMiniportDriver. Дополнительные сведения о точках входа regsitering см. в разделе Регистрация CoNDIS. Драйвер MCM вызывает NdisMCmRegisterAddressFamilyEx один раз, чтобы объявить свои службы клиентам, ориентированным на подключение (см. следующий рисунок).
Драйвер минипорта сетевого адаптера с поддержкой встроенной сигнализации, ориентированной на подключение, может зарегистрировать себя в качестве драйвера MCM, даже если диспетчер вызовов может быть доступен. Таким образом, такой драйвер MCM вытесняет диспетчера вызовов в качестве диспетчера вызовов для этой сетевой карты.
Открытие семейства адресов
Вызов диспетчера вызовов или драйвера MCM к Ndis(M)CmRegisterAddressFamily приводит к тому, что NDIS вызывает функцию ProtocolCoAfRegisterNotify каждого клиента, ориентированного на подключение, в привязке (как показано на двух предыдущих рисунках).
ProtocolCoAfRegisterNotify проверяет данные семейства адресов, чтобы определить, может ли клиент использовать службы конкретного драйвера CM или MCM. Может ли клиент вносить изменения в предоставленные (M)CM данные семейства адресов, зависит от конкретной поддержки протокола сигнализации диспетчера вызовов или драйвера MCM.
Если клиент считает предлагаемые службы управления вызовами приемлемыми, ProtocolCoAfRegisterNotify выделяет для клиента область контекста по af и вызывает NdisClOpenAddressFamilyEx. NdisClOpenAddressFamilyEx не регистрирует клиентские точки входа, ориентированные на подключение, в NDIS. Дополнительные сведения о регистрации точек входа, ориентированных на подключение, с помощью NDIS см. в разделе Регистрация CoNDIS.
Вызов NdisClOpenAddressFamilyEx вызывает функцию ProtocolCmOpenAf диспетчера вызовов или драйвера MCM (как показано уже на двух предыдущих рисунках). ProtocolCmOpenAf обеспечивает передачу клиентом допустимого семейства адресов и выделение и инициализацию ресурсов, необходимых для выполнения операций от имени клиента, который открывает этот экземпляр семейства адресов. ProtocolCmOpenAf также хранит предоставленный NDISAfHandle , представляющий связь между диспетчером вызовов и клиентом для открытого семейства адресов.
ПротоколCmOpenAf может выполняться синхронно или асинхронно. Для асинхронного выполнения функция ProtocolCmOpenAf диспетчера вызовов вызывает NdisCmOpenAddressFamilyComplete; Функция ProtocolCmOpenAf драйвера MCM вызывает NdisMCmOpenAddressFamilyComplete. Вызов Ndis(M)CmOpenAddressFamilyComplete вызывает функцию ProtocolOpenAfComplete клиента, которая изначально называлась NdisClOpenAddressFamilyEx.
Если вызов клиента к NdisClOpenAddressFamilyEx выполнен успешно, NDIS возвращает клиенту объект NdisAfHandle , представляющий связь между диспетчером вызовов и клиентом для открытого семейства адресов.
Если клиент принимает входящие вызовы, он обычно регистрирует один или несколько SSP из своей функции ProtocolClOpenAfCompleteEx , вызывая NdisClRegisterSap после успешного вызова NdisClOpenAddressFamilyEx.
Если клиент выполняет исходящие вызовы, он может создать один или несколько виртуальных машин в своей функции ProtocolClOpenAfCompleteEx в ожидании запроса от одного или нескольких своих клиентов на исходящий вызов.