функция обратного вызова PROTOCOL_CM_OPEN_AF (ndis.h)
Требуется функция ProtocolCmOpenAf . Эта функция выделяет открытые ресурсы для диспетчера вызовов для взаимодействия с клиентом NDIS, ориентированным на подключение, который открывает семейство адресов.
Синтаксис
PROTOCOL_CM_OPEN_AF ProtocolCmOpenAf;
NDIS_STATUS ProtocolCmOpenAf(
[in] NDIS_HANDLE CallMgrBindingContext,
[in] PCO_ADDRESS_FAMILY AddressFamily,
[in] NDIS_HANDLE NdisAfHandle,
[out] PNDIS_HANDLE CallMgrAfContext
)
{...}
Параметры
[in] CallMgrBindingContext
Для неинтегрированного диспетчера вызовов CallMgrBindingContext задает дескриптор области контекста, выделенной диспетчером вызовов, в которой диспетчеры вызовов сохраняют сведения о состоянии привязки. Диспетчер вызовов предоставил этот дескриптор при вызове NdisOpenAdapterEx.
Для интегрированного диспетчера вызовов (MCM) CallMgrBindingContext указывает дескриптор области контекста, выделенной минипортом, в которой минипорт сохраняет сведения о состоянии каждого адаптера. Мини-порт предоставил этот дескриптор в вызове NdisMSetAttributesEx (для драйверов 5.x) или вызове NdisMSetMiniportAttributes (для драйверов 6.x).
[in] AddressFamily
Указывает семейство адресов, которое открывает клиент. Это семейство адресов было зарегистрировано диспетчером вызовов при вызове NdisCmRegisterAddressFamilyEx.
[in] NdisAfHandle
Указывает дескриптор, предоставляемый NDIS, который однозначно идентифицирует этот экземпляр семейства адресов. Этот дескриптор непрозрачн для диспетчера вызовов и зарезервирован для использования системой.
[out] CallMgrAfContext
Указывает дескриптор для области контекста, предоставляемой диспетчером вызовов, в которой диспетчер вызовов сохраняет состояние этого открытого семейства адресов, которое он предоставляет.
Возвращаемое значение
ProtocolCmOpenAf возвращает состояние своих операций как одно из следующих:
Код возврата | Описание |
---|---|
|
Указывает, что диспетчер вызовов успешно выделил и инициализировал все ресурсы, необходимые для приема запросов от клиента к этому семейству адресов. |
|
Указывает, что запрошенная операция обрабатывается асинхронно. Диспетчер вызовов должен вызвать NdisCmOpenAddressFamilyComplete , когда он завершил все операции open-AF, чтобы указать NDIS (и клиенту), что операции были завершены. |
|
Указывает, что диспетчеру вызовов не удалось выполнить необходимые операции из-за нехватки доступных системных ресурсов, таких как память. |
|
Указывает, что диспетчеру вызовов не удалось установить состояние, в котором он может принимать запросы от клиента для работы с этим семейством адресов. Это может быть состояние ошибки, распространяемое из другой функции библиотеки NDIS, или любое состояние ошибки, определенное соответствующим модулем записи драйвера. |
Комментарии
ProtocolCmOpenAf выполняет все необходимые выделения динамических ресурсов и структур, которые модуль записи вызовов считает необходимыми для выполнения операций от имени клиента, который открывает экземпляр этого семейства адресов. К таким ресурсам относятся, помимо прочего, буферы памяти, структуры данных, события и другие подобные ресурсы. Диспетчер вызовов также должен инициализировать все соответствующие данные для каждого открытия перед возвратом управления в NDIS.
Если диспетчер вызовов выделил свою область состояния для каждого открытого состояния, адрес области состояний должен быть задан в дескрипторе CallMgrAfContext перед возвратом управления в NDIS. Для этого разыменуйте CallMgrAfContext и сохраните указатель на область данных в качестве значения дескриптора. Пример:
*CallMgrAfContext = SomeBuffer;
Если ProtocolCmOpenAf не может выделить ресурсы, необходимые для выполнения последующих запросов от имени клиента, открывающего это семейство адресов, он должен освободить все ресурсы, выделенные для открытия, и вернуть управление в NDIS с NDIS_STATUS_RESOURCES.
Если протокол ProtocolCmOpenAf завершил необходимые операции и CM готов принимать запросы от клиента, ProtocolCmOpenAf должен как можно быстрее вернуть управление с состоянием NDIS_STATUS_SUCCESS.
Примеры
Чтобы определить функцию ProtocolCmOpenAf , необходимо сначала предоставить объявление функции, определяющее тип определяемой функции. Windows предоставляет набор типов функций для драйверов. Объявление функции с помощью типов функций помогает анализу кода для драйверов, средству проверки статических драйверов (SDV) и другим средствам проверки находить ошибки, и это требование для написания драйверов для операционной системы Windows.Например, чтобы определить функцию ProtocolCmOpenAf с именем MyCmOpenAf, используйте тип PROTOCOL_CM_OPEN_AF , как показано в следующем примере кода:
PROTOCOL_CM_OPEN_AF MyCmOpenAf;
Затем реализуйте функцию следующим образом:
_Use_decl_annotations_
NDIS_STATUS
MyCmOpenAf(
NDIS_HANDLE CallMgrBindingContext,
PCO_ADDRESS_FAMILY AddressFamily,
NDIS_HANDLE NdisAfHandle,
PNDIS_HANDLE CallMgrAfContext
)
{...}
Тип функции PROTOCOL_CM_OPEN_AF определяется в файле заголовка Ndis.h. Чтобы более точно определить ошибки при запуске средств анализа кода, обязательно добавьте заметку Use_decl_annotations в определение функции. Заметка Use_decl_annotations гарантирует использование заметок, которые применяются к типу функции PROTOCOL_CM_OPEN_AF в файле заголовка. Дополнительные сведения о требованиях к объявлениям функций см. в разделе Объявление функций с помощью типов ролей функций для драйверов NDIS.
Сведения о Use_decl_annotations см. в статье О поведении функции.
Требования
Требование | Значение |
---|---|
Минимальная версия клиента | Поддерживается для драйверов NDIS 6.0 и NDIS 5.1 (см. ProtocolCmOpenAf (NDIS 5.1)) в Windows Vista. Поддерживается для драйверов NDIS 5.1 (см. ProtocolCmOpenAf (NDIS 5.1)) в Windows XP. |
Целевая платформа | Windows |
Header | ndis.h (включая Ndis.h) |
IRQL | <= DISPATCH_LEVEL |