Функция SpbRequestCaptureIoOtherTransferList (spbcx.h)
Метод SpbRequestCaptureIoOtherTransferList извлекает структуру SPB_TRANSFER_LIST во входном буфере настраиваемого запроса IOCTL.
Синтаксис
NTSTATUS SpbRequestCaptureIoOtherTransferList(
SPBREQUEST Request
);
Параметры
Request
Дескриптор SPBREQUEST для настраиваемого запроса IOCTL. Драйвер контроллера SPB ранее получил этот дескриптор через одну из своих зарегистрированных функций обратного вызова событий.
Возвращаемое значение
SpbRequestCaptureIoOtherTransferList возвращает STATUS_SUCCESS, если вызов выполнен успешно. Возможные возвращаемые значения включают следующие коды ошибок.
Возвращаемое значение | Описание |
---|---|
|
Недопустимый параметр SPBREQUEST или структура SPB_TRANSFER_LIST в запросе отформатирована неправильно. |
|
Не удается выделить системные ресурсы, необходимые для этой операции. |
Комментарии
Этот метод должен вызываться в контексте процесса, в котором допустимы адреса буфера. Как правило, драйвер контроллера 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 | См. заметки. |