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


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

Функция обратного вызова события EvtSpbControllerUnlock драйвера контроллера SPB разблокирует контроллер SPB, который был заблокирован предыдущим вызовом функции обратного вызова события EvtSpbControllerLock .

Синтаксис

EVT_SPB_CONTROLLER_UNLOCK EvtSpbControllerUnlock;

void EvtSpbControllerUnlock(
  [in] WDFDEVICE Controller,
  [in] SPBTARGET Target,
  [in] SPBREQUEST UnlockRequest
)
{...}

Параметры

[in] Controller

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

[in] Target

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

[in] UnlockRequest

Дескриптор SPBREQUEST для запроса элемента управления вводом-выводом для разблокировки контроллера. Драйвер контроллера SPB должен выполнить этот запрос, выполнив запрошенную операцию или возвратив состояние ошибки. Дополнительные сведения см. в разделе Примечания.

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

None

Remarks

SpbCx управляет очередью ввода-вывода для контроллера SPB. SpbCx вызывает эту функцию, когда клиент (драйвер периферийного устройства) контроллера отправляет запрос IOCTL_SPB_UNLOCK_CONTROLLER целевому объекту в шине. Значение параметра UnlockRequest — это дескриптор, который инкапсулирует этот запрос.

Функции EvtSpbControllerLock и EvtSpbControllerUnlock выполняют дополнительные операции. Обе функции являются необязательными. Если драйвер контроллера SPB реализует функцию EvtSpbControllerUnlock , драйвер не требуется для реализации функции EvtSpbControllerLock , но может это сделать. Однако если драйвер контроллера SPB реализует функцию EvtSpbControllerLock , он также должен реализовывать функцию EvtSpbControllerUnlock . Дополнительные сведения см. в разделе Примечания в SPB_CONTROLLER_CONFIG.

Если драйвер контроллера SPB должен изменить режим своего контроллера, чтобы восстановить обычный выбор целевого объекта, он может сделать это во время обратного вызова EvtSpbControllerUnlock . Если это изменение режима связано с длительной задержкой или требует от драйвера ожидания прерывания устройства, драйвер должен инициировать изменение режима, а затем вернуться из обратного вызова без задержки. Позже драйвер может выполнить запрос на разблокировку в прерывании DPC или DPC таймера.

Обратный вызов EvtSpbControllerUnlock не должен завершать запрос на разблокировку. Если средство проверки драйверов включено, такой сбой вызовет ловушку средства проверки, которая сообщит диспетчеру Plug and Play о сбое контроллера. SpbCx игнорирует сбой запроса разблокировки и не пытается обработать или устранить сбой.

Функция EvtSpbControllerUnlock не возвращает значение. Вместо этого драйвер контроллера SPB указывает состояние операции разблокировки в состоянии завершения запроса ввода-вывода, определяемого параметром UnlockRequest . Задайте состояние завершения STATUS_SUCCESS.

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

Дополнительные сведения о функции EvtSpbControllerUnlock см. в разделе Обработка последовательностей Client-Implemented.

Примеры

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

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

EVT_SPB_CONTROLLER_UNLOCK  MyEvtSpbControllerUnlock;

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

_Use_decl_annotations_
VOID
  MyEvtSpbControllerUnlock(
    WDFDEVICE Controller,
    SPBTARGET Target,
    SPBREQUEST UnlockRequest
    )
{ ... }

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

Требования

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

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