Поделиться через


функция обратного вызова PROTOCOL_CM_CLOSE_CALL (ndis.h)

Функция ProtocolCmCloseCall является обязательной функцией, которая завершает существующий вызов и освобождает все ресурсы, выделенные для вызова диспетчером вызовов.

Примечание Функцию необходимо объявить с помощью типа PROTOCOL_CM_CLOSE_CALL . Дополнительные сведения см. в следующем разделе Примеры.
 

Синтаксис

PROTOCOL_CM_CLOSE_CALL ProtocolCmCloseCall;

NDIS_STATUS ProtocolCmCloseCall(
  [in]           NDIS_HANDLE CallMgrVcContext,
  [in, optional] NDIS_HANDLE CallMgrPartyContext,
  [in, optional] PVOID CloseData,
  [in, optional] UINT Size
)
{...}

Параметры

[in] CallMgrVcContext

Указывает дескриптор для области контекста, выделенной диспетчером вызовов, в которой диспетчер вызовов сохраняет свое состояние по каждому VC. Этот дескриптор был предоставлен NDIS из функции ProtocolCmMakeCall диспетчеров вызовов.

[in, optional] CallMgrPartyContext

Указывает дескриптор , если таковой имеется, для области контекста, выделенной диспетчером вызовов, в которой диспетчер вызовов хранит сведения о стороне в многоточечных VC. Этот дескриптор имеет значение NULL , если закрываемый вызов не является многоточечным.

[in, optional] CloseData

Указатель на буфер, содержащий данные клиента, ориентированные на подключение, которые должны быть отправлены через соединение перед завершением вызова. Этот параметр имеет значение NULL , если базовая сетевая среда не поддерживает передачу данных при закрытии подключения.

[in, optional] Size

Указывает длину (в байтах) буфера в CloseData, ноль, если CloseData имеет значение NULL.

Возвращаемое значение

ProtocolCmCloseCall возвращает состояние своих операций как одно из следующих:

Код возврата Описание
NDIS_STATUS_SUCCESS
Указывает, что диспетчер вызовов успешно завершил вызов.
NDIS_STATUS_PENDING
Указывает, что диспетчер вызовов выполнит запрос на асинхронное завершение вызова. Когда диспетчер вызовов завершит все операции, необходимые для завершения подключения, он должен вызвать NdisCmCloseCallComplete , чтобы сообщить NDIS о закрытии вызова.
NDIS_STATUS_INVALID_DATA
Указывает, что параметр CloseData был указан, но базовый сетевой носитель не поддерживает отправку данных одновременно с завершением вызова.
NDIS_STATUS_XXX
Указывает, что диспетчеру вызовов не удалось завершить вызов. Фактически возвращенная ошибка может быть состоянием, распространяемым из другой подпрограммы библиотеки NDIS.

Комментарии

ProtocolCmCloseCall обменялся данными с устройствами управления сетью или другими субъектами, зависящими от носителя, в зависимости от того, требуется его носитель, чтобы завершить подключение между локальным узлом и удаленным узлом. Если диспетчер вызовов требуется для взаимодействия с сетевыми устройствами управления (например, сетевым коммутатором), он должен использовать виртуальное подключение к устройству управления сетью, установленное в функции ProtocolBindAdapterEx . Автономные диспетчеры звонков взаимодействуют с такими сетевыми устройствами, вызывая NdisCoSendNetBufferLists. Драйверы минипорта с встроенной поддержкой управления звонками никогда не вызывают NdisCoSendNetBufferLists. Вместо этого они передают данные непосредственно по сети.

Если значение CloseData не равно NULL и отправка данных при завершении подключения поддерживается носителем, который обрабатывает этот диспетчер вызовов, диспетчер вызовов должен передать данные, указанные в CloseData , на удаленный узел перед завершением вызова. Если отправка данных одновременно с прерываемым подключением не поддерживается, диспетчеры вызовов должны возвращать NDIS_STATUS_INVALID_DATA.

Если protocolCmCloseCall передается явным образом CallMgrPartyContext, то прерываемый вызов является многоточечный VC, и диспетчер вызовов должен выполнить все необходимые сетевые подключения со своим сетевым оборудованием в соответствии с типом носителя, чтобы завершить вызов как многоточечный вызов. Диспетчер вызовов также должен освободить память, выделенную ранее в ProtocolCmMakeCall, для состояния стороны, на которое указывает CallMgrPartyContext . Сбой правильного освобождения, освобождения или отключения этих ресурсов приводит к утечке памяти.

После завершения вызова в сети, отправки всех близких данных и освобождения всех ресурсов в CallMgrPartyContext диспетчер вызовов должен вызвать NdisCmDeactivateVc. Это уведомляет NDIS и базовый драйвер минипорта, если таковые есть, о том, чтобы не ожидать дальнейших передач на данный VC.

Примеры

Чтобы определить функцию ProtocolCmCloseCall , необходимо сначала предоставить объявление функции, определяющее тип определяемой функции. Windows предоставляет набор типов функций для драйверов. Объявление функции с помощью типов функций помогает анализу кода для драйверов, средству проверки статических драйверов (SDV) и другим средствам проверки находить ошибки, и это требование для написания драйверов для операционной системы Windows.

Например, чтобы определить функцию ProtocolCmCloseCall с именем MyCmCloseCall, используйте тип PROTOCOL_CM_CLOSE_CALL , как показано в этом примере кода:

PROTOCOL_CM_CLOSE_CALL MyCmCloseCall;

Затем реализуйте функцию следующим образом:

_Use_decl_annotations_
NDIS_STATUS
 MyCmCloseCall(
    NDIS_HANDLE  CallMgrVcContext,
    NDIS_HANDLE  CallMgrPartyContext,
    PVOID  CloseData,
    UINT  Size
    )
  {...}

Тип функции PROTOCOL_CM_CLOSE_CALL определен в файле заголовка Ndis.h. Чтобы более точно определить ошибки при запуске средств анализа кода, обязательно добавьте заметку Use_decl_annotations в определение функции. Заметка Use_decl_annotations гарантирует использование заметок, применяемых к типу функции PROTOCOL_CM_CLOSE_CALL в файле заголовка. Дополнительные сведения о требованиях к объявлениям функций см. в разделе Объявление функций с помощью типов ролей функций для драйверов NDIS.

Сведения о Use_decl_annotations см. в статье О поведении функции.

Требования

Требование Значение
Минимальная версия клиента Поддерживается для драйверов NDIS 6.0 и NDIS 5.1 (см. ProtocolCmCloseCall (NDIS 5.1)) в Windows Vista. Поддерживается для драйверов NDIS 5.1 (см. ProtocolCmCloseCall (NDIS 5.1)) в Windows XP.
Целевая платформа Windows
Header ndis.h (включая Ndis.h)
IRQL <= DISPATCH_LEVEL

См. также раздел

NdisClMakeCall

NdisCmDeactivateVc

NdisCoSendNetBufferLists

ProtocolCmMakeCall