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


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

Функция обратного вызова события EvtSpbTargetDisconnect драйвера контроллера SPB закрывает подключение к целевому устройству, которое ранее было открыто вызовом функции обратного вызова события EvtSpbTargetConnect драйвера.

Синтаксис

EVT_SPB_TARGET_DISCONNECT EvtSpbTargetDisconnect;

void EvtSpbTargetDisconnect(
  [in] WDFDEVICE Controller,
  [in] SPBTARGET Target
)
{...}

Параметры

[in] Controller

Дескриптор WDFDEVICE для объекта устройства платформы , представляющего контроллер SPB.

[in] Target

Дескриптор SPBTARGET для закрытия целевого объекта. Целевой объект — это периферийное устройство или порт, подключенный к шине. Расширение платформы SPB (SpbCx) ранее назначило этот дескриптор целевому объекту в обратном вызове EvtSpbTargetConnect , открывшему подключение к целевому объекту.

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

None

Remarks

Реализация этой функции драйвером контроллера SPB является необязательной.

SpbCx управляет очередью ввода-вывода для контроллера SPB. Если драйвер контроллера SPB регистрирует функцию обратного вызова EvtSpbTargetDisconnect , SpbCx вызывает эту функцию, когда клиент (драйвер периферийных устройств) драйвера контроллера отправляет IRP_MJ_CLOSE запрос на закрытие дескриптора SPBTARGET. Этот дескриптор представляет подключение к целевому устройству в шине, открытой клиентом в предыдущем запросе IRP_MJ_CREATE . Если функция EvtSpbTargetDisconnect возвращает код ошибки, SpbCx не выполняет запрос IRP_MJ_CLOSE .

Функция EvtSpbTargetDisconnect вызывается синхронно из контекста закрывающего потока клиента после завершения всех операций ввода-вывода, инициированных клиентом, и после того, как клиент разблокировал контроллер (если клиент ранее блокировал контроллер).

Если драйвер контроллера SPB выделил запросы ввода-вывода и отправил их следующему драйверу в цепочке запросов ввода-вывода для целевого устройства, функция EvtSpbTargetDisconnect должна отменить эти запросы перед возвратом.

Подпрограммы обратного вызова DispatchCleanup и CreateProcessNotifyEx клиентского драйвера можно вызвать в любое время после возврата обратного вызова EvtSpbTargetDisconnect . Когда процесс драйвера клиента завершается, его подпрограмма CreateProcessNotifyEx вызывается непосредственно перед уничтожением последнего потока для выхода из процесса.

Чтобы зарегистрировать функцию обратного вызова EvtSpbTargetDisconnect , вызовите метод SpbDeviceInitialize .

Примеры

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

Например, чтобы определить функцию обратного вызова EvtSpbTargetDisconnect с именем MyEvtSpbTargetDisconnect, используйте тип функции EVT_SPB_TARGET_DISCONNECT, как показано в следующем примере кода:

EVT_SPB_TARGET_DISCONNECT  MyEvtSpbTargetDisconnect;

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

_Use_decl_annotations_
VOID
  MyEvtSpbTargetDisconnect(
    WDFDEVICE Controller,
    SPBTARGET Target
    )
{ ... }

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

Требования

Требование Значение
Минимальная версия клиента Поддерживается начиная с Windows 8.
Целевая платформа Персональный компьютер
Верхняя часть spbcx.h
IRQL Вызывается на PASSIVE_LEVEL.

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

EvtSpbTargetConnect

IRP_MJ_CLOSE

IRP_MJ_CREATE

SPBTARGET

SpbDeviceInitialize