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


Функция SpbRequestCaptureIoOtherTransferList (spbcx.h)

Метод SpbRequestCaptureIoOtherTransferList извлекает структуру SPB_TRANSFER_LIST во входном буфере настраиваемого запроса IOCTL.

Синтаксис

NTSTATUS SpbRequestCaptureIoOtherTransferList(
  SPBREQUEST Request
);

Параметры

Request

Дескриптор SPBREQUEST для настраиваемого запроса IOCTL. Драйвер контроллера SPB ранее получил этот дескриптор через одну из своих зарегистрированных функций обратного вызова событий.

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

SpbRequestCaptureIoOtherTransferList возвращает STATUS_SUCCESS, если вызов выполнен успешно. Возможные возвращаемые значения включают следующие коды ошибок.

Возвращаемое значение Описание
STATUS_INVALID_PARAMETER
Недопустимый параметр SPBREQUEST или структура SPB_TRANSFER_LIST в запросе отформатирована неправильно.
STATUS_INSUFFICIENT_RESOURCES
Не удается выделить системные ресурсы, необходимые для этой операции.

Комментарии

Этот метод должен вызываться в контексте процесса, в котором допустимы адреса буфера. Как правило, драйвер контроллера SPB вызывает этот метод из функции обратного вызова события EvtIoInCallerContext , которую драйвер предоставляет в качестве входного параметра методу SpbControllerSetIoOtherCallback .

Максимальное значение IRQL, при котором драйвер контроллера SPB может вызывать этот метод, зависит от того, выполняется ли инициатор запроса ввода-вывода в пользовательском режиме или в режиме ядра. Если запрос поступил из пользовательского режима, драйвер должен вызвать этот метод в PASSIVE_LEVEL. Если запрос поступил из режима ядра, драйвер должен вызвать этот метод в IRQL <= DISPATCH_LEVEL. Драйвер может вызвать метод WdfRequestGetRequestorMode , чтобы определить режим инициатора. Однако этот вызов обычно не требуется, так как драйвер может полагаться на расширение платформы SPB (SpbCx) для вызова функции EvtIoInCallerContext драйвера в соответствующем IRQL.

Примеры

В следующем примере кода показано, как функция обратного вызова события EvtIoInCallerContext драйвера контроллера SPB может использовать метод SpbRequestCaptureIoOtherTransferList для получения буфера ввода-вывода или буферов из настраиваемого запроса IOCTL.

VOID
EvtIoInCallerContext(
    _In_  WDFDEVICE   SpbController,
    _In_  WDFREQUEST  FxRequest
    ) 
{
    NTSTATUS status;

    //
    // NOTE: The driver should check for custom IOCTLs that this
    // driver handles. If an IOCTL is not recognized, mark the
    // request as STATUS_NOT_SUPPORTED, and complete the request.
    //

    status = SpbRequestCaptureIoOtherTransferList((SPBREQUEST)FxRequest);

    //
    // If the preceding call fails, the driver must complete the
    // request instead of queueing the request.
    //

    if (!NT_SUCCESS(status))
    {
        goto exit;
    }

    status = WdfDeviceEnqueueRequest(SpbController, FxRequest);

    if (!NT_SUCCESS(status))
    {
        goto exit;
    }

exit:

    if (!NT_SUCCESS(status))
    {
        WdfRequestComplete(FxRequest, status);
    }
}

Требования

Требование Значение
Минимальная версия клиента Доступно начиная с Windows 8.
Целевая платформа Универсальное
Верхняя часть spbcx.h
Библиотека Spbcxstubs.lib
IRQL См. заметки.

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

EvtIoInCallerContext

SPBREQUEST

SPB_TRANSFER_LIST

SpbControllerSetIoOtherCallback

WdfRequestGetRequestorMode