AVC_FUNCTION_COMMAND
Код функции AVC_FUNCTION_COMMAND используется для отправки запроса AV/C и получения ответа в виде одной операции.
Блок состояния ввода-вывода
В случае успешного выполнения драйвер протокола AV/C устанавливает для Irp-IoStatus.Status> значение STATUS_SUCCESS.
Возможные другие возвращаемые значения:
Возвращаемое значение | Описание |
---|---|
STATUS_TIMEOUT | Запрос был сделан, но ответ не получен до завершения обработки времени ожидания и повторных попыток. Целевое устройство игнорирует запросы, если предыдущий запрос по-прежнему обрабатывается. Некоторые устройства AV/C не отвечают требованиям и отказываются отвечать в течение времени ожидания 100 мс даже после нескольких последовательных попыток. Структура AVC_COMMAND_IRB позволяет настраивать элементы времени ожидания и повторных попыток по умолчанию (100 мс и 9 соответственно), но этих параметров по умолчанию было достаточно для всех известных реализаций. |
STATUS_PENDING | Запрос был сделан, и получен промежуточный ответ. Подпрограмма завершения отвечает за обработку окончательного ответа и освобождение ресурсов IRP и IRB. |
STATUS_REQUEST_ABORTED | При отправке запросов AV/C немедленно прерывайте их, когда состояние завершения IRP STATUS_REQUEST_ABORTED. |
СТАТУС_* | Любой другой код возврата указывает, что произошла ошибка или предупреждение, которые не были область протокола AV/C. |
Комментарии
Эта функция использует структуру AVC_COMMAND_IRB, как показано ниже.
typedef struct _AVC_COMMAND_IRB {
AVC_IRB Common;
UCHAR SubunitAddrFlag : 1;
UCHAR AlternateOpcodesFlag : 1;
UCHAR TimeoutFlag : 1;
UCHAR RetryFlag : 1;
union {
UCHAR CommandType;
UCHAR ResponseCode;
};
PUCHAR SubunitAddr;
PUCHAR AlternateOpcodes;
LARGE_INTEGER Timeout;
UCHAR Retries;
UCHAR Opcode;
ULONG OperandLength;
UCHAR Operands[MAX_AVC_OPERAND_BYTES];
NODE_ADDRESS NodeAddress;
ULONG Generation;
} AVC_COMMAND_IRB, *PAVC_COMMAND_IRB;
Требования
Заголовки: Объявлено в avc.h. Включите avc.h.
Ввод AVC_COMMAND_IRB
Common
Вложенная функция этого элемента должна иметь значение AVC_FUNCTION_COMMAND из перечисления AVC_FUNCTION.
SubunitAddrFlag
Задайте для этого параметра значение one, чтобы переопределить адрес подсоединия, который avc.sys связывается с драйвером подсоединия. Причины переопределения: драйвер подсоединений представляет несколько подсоединений в одном экземпляре; должна быть отправлена команда модуля; или драйвер был загружен, так как avc.sys не удалось определить тип или идентификатор подсоединия. Если это значение задано, член SubunitAddr должен указывать на непагрегированную память, содержащую нужный адрес подсоединения.
Если вызывающий объект отправляет запросы непосредственно в avc.sys FDO, необходимо задать значение one (и соответствующий Параметр SubunitAddr).
Примечание
Если этот флаг не задан по запросу, при ответе на успешный запрос этот флаг устанавливается, а член SubunitAddr указывает на фактический адрес подсоединения. Не пытайтесь изменить содержимое или освободить память: она является частью расширения устройства родительского драйвера. Конечно, можно вернуться к нулю, а для указателя SubunitAddr будет снято повторное использование структуры для другого подсоединения.
AlternateOpcodesFlag Задайте для этого параметра значение , если тип команды и код операции этого запроса приводит к получению ответа с другим кодом операции. Без этого принимаются только ответы с соответствующими кодами операций. Если этот параметр задан, член AlternateOpcodes должен указывать на непагрегированную память, содержащую список альтернативных кодов операций.
TimeoutFlag
Задайте для этого параметра значение , если время ожидания по умолчанию не подходит для подсоединия. Если этот параметр задан, для элемента Timeout должно быть задано требуемое время ожидания (в единицах 100 ns).
RetryFlag
Задайте для этого параметра значение , если счетчик повторных попыток по умолчанию не подходит для подсоединия. Если этот параметр задан, для элемента Retries должно быть задано требуемое число повторных попыток.
CommandType По запросу этому элементу необходимо задать один из перечислителей из перечисления AvcCommandType . Это обязательный параметр.
ResponseCode В ответе этому элементу присваивается значение из перечисления AvcResponseCode .
SubunitAddr
Задайте для этого адреса непагрегированной памяти, содержащей нужный адрес подсоединения, закодированный в соответствии с разделом 5.3.3 1394 1394 Trade Association AV/C Digital Interface Command Set, rev 3.0. Длина не требуется, так как это подразумевается при кодировании адреса подсоединия. Этот параметр игнорируется, если subunitAddrFlag равно нулю.
AlternateOpcodes Задайте для этого адреса непагрегированную память, содержащую нужный альтернативный список операционных кодов. Первый байт списка операционных кодов — это число следующих кодов операций (эквивалентное количеству байтов). Общая длина памяти, содержащей список альтернативных кодов операций, — AlternateOpcodes[0]+1. Этот параметр игнорируется, если alternateOpcodesFlag равно нулю.
Timeout
Задайте для этого параметра требуемое время ожидания в единицах 100 ns. Например, значение времени ожидания по умолчанию: Timeout.QuadPart = 1000000 (100 мс в единицах 100ns). Этот параметр игнорируется, если timeoutFlag равно нулю.
Повторных попыток Задайте для этого параметра требуемое количество раз ,avc.sys должны пытаться повторить запросы после каждого тайм-аута без ответа. Обратите внимание, что число повторных попыток, равное нулю, означает, что запрос выполняется один раз. Общее время, затраченное на обработку команды без получения ответа, вычисляется по следующей формуле:
Время ожидания * (повторные попытки+ 1)
Этот параметр игнорируется, если значение RetryFlag равно нулю.
Код Задайте для этого параметра нужный код операции AV/C (соответствующий типу подсоединия). Это обязательный параметр. В ответе, если параметр AlternateOpcodesFlag был задан, а для сопоставления ответа использовался один из альтернативных кодов операций, для этого задается альтернативный код операции.
OperandLength
Задайте для этого параметра количество байтов, используемых для хранения операндов в члене операндов . Это обязательный параметр. В ответе этому параметру присваивается количество байтов в списке операндов, используемом ответом.
Операнды
Присвойте ей список операндов, соответствующий типу подсоединия и коду операции. Это обязательный параметр. В ответе этот параметр содержит список операндов ответа.
NodeAddress Защищены. Значение должно быть равно нулю.
Поколение
Зарезервировано. Значение должно быть равно нулю.
Код функции AVC_FUNCTION_COMMAND не поддерживается виртуальными экземплярами avc.sys. Если вызывающий объект хочет управлять внешним устройством, невиртуальный экземпляр этого устройства можно найти с помощью частного механизма или с помощью некоторого сочетания AVC_FUNCTION_FIND_PEER_DO, AVC_FUNCTION_PEER_DO_LIST и AVC_FUNCTION_GET_SUBUNIT_INFO кодов функций IOCTL_AVC_CLASS кода управления вводом-выводом.
Эта структура определяет общие компоненты запроса команды AV/C. Он содержит код операции и операнды запроса, а также код операции и операнды ответа (после завершения). Размер списка операндов фиксируется на максимально допустимом количестве операндов с учетом однобайтового адреса подсоединения. Если адрес подсоединения каким-либо образом расширен, максимально допустимое число байтов операнда уменьшается соответствующим образом.
Рекомендуется использовать эту структуру, чтобы сначала обнулить структуру (используйте RtlZeroMemory) перед заполнением параметров.
Он должен вызываться по адресу IRQL = PASSIVE_LEVEL.