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


AVCSTRM_CLOSE

Код функции AVCSTRM_CLOSE закрывает указанный поток и освобождает все ресурсы, выделенные в AVCSTRM_OPEN.

Блок состояния ввода-вывода

В случае успеха avcstrm.sys присваивает Irp-IoStatus.Status> значение STATUS_SUCCESS.

Возможные возвращаемые значения ошибок:

Состояние ошибки Описание
STATUS_DEVICE_REMOVED Устройство, соответствующее операции AVCSTRM_READ , больше не существует.
STATUS_CANCELLED Не удалось выполнить запрос.
STATUS_INVALID_PARAMETER Параметр, указанный в IRP, является неправильным.
STATUS_INSUFFICIENT_RESOURCES Недостаточно системных ресурсов для выполнения запроса.
STATUS_PENDING Запрос получен, но требует дальнейшей обработки. Подпрограмма завершения ввода-вывода будет обрабатывать окончательный ответ.

Входные данные AVC_STREAM_REQUEST_BLOCK

SizeOfThisBlock, версия и функция
Используйте макрос INIT_AVCSTRM_HEADER для инициализации этих элементов. Передайте AVCSTRM_CLOSE в аргументе Request макроса.

AVCStreamContext
Указывает контекст потока (дескриптор) закрываемого потока. Если AVCSTRM_CLOSE возвращается успешно, это значение больше не является допустимым.

Ниже приведен пример указания закрываемого потока.

    pAVCStrmReq = &pStrmExt->AVCStrmReq;
    RtlZeroMemory(pAVCStrmReq, sizeof(AVC_STREAM_REQUEST_BLOCK));
    INIT_AVCSTRM_HEADER(pAVCStrmReq, AVCSTRM_CLOSE);

    pAVCStrmReq->AVCStreamContext = pStrmExt->AVCStreamContext;

    Status = 
        AVCStrmReqSubmitIrpSynch ( 
            pDevExt->pBusDeviceObject,
            pStrmExt->pIrpReq,
            pAVCStrmReq
            );

Драйвер подсоединения должен сначала выделить IRP и структуру AVC_STREAM_REQUEST_BLOCK .

Затем он должен использовать макрос INIT_AVCSTRM_HEADER для инициализации структуры AVC_STREAM_REQUEST_BLOCK, передав AVCSTRM_CLOSE в качестве аргумента Request в макрос.

Затем драйвер подсоединия задает для элемента AVCStreamContext закрываемый поток.

Чтобы отправить этот запрос, подсоединительная единица отправляет IRP_MJ_INTERNAL_DEVICE_CONTROL IRP с элементом IoControlCode IRP, который имеет значение IOCTL_AVCSTRM_CLASS , а член Argument1 набора IRP — в структуру AVC_STREAM_REQUEST_BLOCK, описывающую операцию закрытия.

Драйвер подсоединия может ожидать, что эта команда будет выполняться синхронно. Результат возвращается немедленно без ожидающих операций в avcstrm.sys.

Этот код функции должен вызываться по адресу IRQL = PASSIVE_LEVEL.

Комментарии

Эта функция использует элемент AVCStreamContext объединения CommandData в структуре AVC_STREAM_REQUEST_BLOCK, как показано ниже.

typedef struct _AVC_STREAM_REQUEST_BLOCK {
  ULONG  SizeOfThisBlock;
  ULONG  Version;
  AVCSTRM_FUNCTION  Function;
  .
  .
  PVOID AVCStreamContext;
  .
  .
} AVC_STREAM_REQUEST_BLOCK, *PAVC_STREAM_REQUEST_BLOCK;

Требования

Заголовки: Объявлен в avcstrm.h. Включите avcstrm.h.

См. также:

AVC_STREAM_REQUEST_BLOCK

INIT_AVCSTRM_HEADER

IRP_MJ_INTERNAL_DEVICE_CONTROL

IOCTL_AVCSTRM_CLASS

AVCSTRM_FUNCTION