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


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

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

Синтаксис

EVT_SPB_CONTROLLER_OTHER EvtSpbControllerOther;

void EvtSpbControllerOther(
  [in] WDFDEVICE Controller,
  [in] SPBTARGET Target,
  [in] SPBREQUEST Request,
  [in] size_t OutputBufferLength,
  [in] size_t InputBufferLength,
  [in] ULONG IoControlCode
)
{...}

Параметры

[in] Controller

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

[in] Target

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

[in] Request

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

[in] OutputBufferLength

Длина выходного буфера в байтах, если с запросом предоставлен выходной буфер.

[in] InputBufferLength

Длина входного буфера (в байтах), если входной буфер предоставлен вместе с запросом.

[in] IoControlCode

Код элемента управления вводом-выводом (IOCTL) для запроса. Это значение является IOCTL, которое не распознается расширением платформы SPB (SpbCx). Дополнительные сведения см. в подразделе "Примечания".

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

None

Remarks

SpbCx управляет очередью ввода-вывода для контроллера SPB. Если драйвер контроллера SPB регистрирует функцию обратного вызова EvtSpbControllerIoOther , spbCx вызывает эту функцию, когда запрос управления вводом-выводом устройства, который не поддерживает spbCx, поступает в очередь ввода-вывода контроллера. Значение параметра Request — это дескриптор, который инкапсулирует этот запрос. Драйвер контроллера SPB должен выполнить этот запрос, выполнив запрошенную операцию или возвратив состояние ошибки. Если драйвер не поддерживает указанный IOCTL, драйвер должен вернуть состояние ошибки STATUS_NOT_SUPPORTED. Список ioCTL, поддерживаемых SpbCx, см. в разделе Коды управления вводом-выводом SpbCx.

Обратный вызов EvtSpbControllerIoOther позволяет отправлять зависящие от шины или драйвера команды в драйвер контроллера SPB в виде ioCTLs. Например, клиенты (периферийные драйверы) могут использовать эти ioCTL для координации операций, относящихся к шине, таких как полнодуплексный обмен данными с целевым устройством в шине SPI. Такие ioCTL подлежат тому же управлению потоком, что и ioCTL, поддерживаемые SpbCx.

Функция обратного вызова EvtSpbControllerIoOther аналогична функции EvtIoDeviceControl и обрабатывает ioCTLs аналогичным образом. Общие сведения о том, как драйверы WDF обрабатывают запросы ввода-вывода, см. в разделе Объекты запросов платформы.

Обратный вызов EvtSpbControllerIoOther не возвращает значение состояния. Вместо этого драйвер контроллера SPB указывает состояние запрошенной операции в состоянии завершения запроса ввода-вывода.

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

Функция EvtSpbControllerIoOther должна проверять значения параметров в запросах элементов управления вводом-выводом, которые она получает от клиентов пользовательского режима. Для всех функций обратного вызова EvtSpbXxx, отличных от EvtSpbControllerIoOther, SpbCx проверяет параметры пользовательского режима перед вызовом функции.

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

Примеры

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

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

EVT_SPB_CONTROLLER_OTHER  MyEvtSpbControllerIoOther;

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

_Use_decl_annotations_
VOID
  MyEvtSpbControllerIoOther(
    WDFDEVICE Controller,
    SPBTARGET Target,
    SPBREQUEST Request,
    size_t OutputBufferLength,
    size_t InputBufferLength,
    ULONG IoControlCode
    )
{ ... }

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

Требования

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

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

EvtIoDeviceControl

EvtSpbTargetConnect

SPBREQUEST

SPBTARGET

SpbControllerSetIoOther