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


AVC_FUNCTION_GET_REQUEST

Код функции AVC_FUNCTION_GET_REQUEST используется для регистрации для получения запросов единиц AV/C и вложенных единиц.

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

Эта функция всегда присваивает Irp-IoStatus.Status> значение STATUS_PENDING.

Комментарии

Эта функция использует структуру 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_GET_REQUEST из перечисления AVC_FUNCTION.

SubunitAddrFlag
Используется только при регистрации для получения команд единиц. Задайте для этого параметра значение 1 и укажите адрес единицы в параметре SubunitAddr . Обратите внимание, что для запросов к вложенным подразделениям по завершении устанавливается значение 1, а параметр SubunitAddr указывает на память, содержащую адрес подсоединения для этого экземпляра виртуальной подсоединения. Вызывающий объект может получить доступ к этой непагрегированной памяти, но не должен пытаться освободить ее.

AlternateOpcodesFlag
Используется только при регистрации для получения команд единиц. Задайте для этого параметра значение 1 и предоставьте список кодов операций, поддерживаемых вызывающим элементом, в параметре AlternateOpcodes .

TimeoutFlag
Не обрабатывается.

RetryFlag
Не обрабатывается.

Тип команды
Игнорируется во входных данных. В выходных данных элементу CommandType присваивается одно из значений перечисления AvcCommandType .

ResponseCode
Игнорируется для запросов.

SubunitAddr
Используется только при регистрации для получения команд единиц. Задайте для этого адреса непагрегированной памяти, содержащей адрес единицы измерения, закодированный в соответствии с разделом 5.3.3 1394 1394 1394 1394 1394. Общая спецификация набора команд цифрового интерфейса AV/C , ред. 3.0 (0xff). Обратите внимание, что для запросов к вложенным подразделениям по завершении это указывает на память, содержащую адрес подсоединения для этого виртуального экземпляра подсоединения. Вызывающий объект может получить доступ к этой непагрегированной памяти, но не должен пытаться освободить ее.

AlternateOpcodes
Используется только при регистрации для получения команд единиц. Задайте для этого адреса непагрегированную память, содержащую список кодов операций единиц, поддерживаемых вызывающим элементом. Первый байт списка операционных кодов — это число следующих кодов операций (эквивалентное количеству байтов). Общая длина памяти, содержащей список альтернативных кодов операций, — AlternateOpcodes[0]+1.

Timeout
Не обрабатывается.

Повторы
Не обрабатывается.

Код операции
Игнорируется во входных данных. В выходных данных он содержит код операции единицы AV/C. Это один из кодов операций, указанных в AlternateOpcodes.

OperandLength
Игнорируется во входных данных. В выходных данных устанавливается количество байтов в списке операндов, используемом запросом.

Операнды
Игнорируется во входных данных. В выходных данных этот параметр содержит список операндов запроса.

NodeAddress
Игнорируется во входных данных. В выходных данных устанавливается адрес узла источника запроса. Этот параметр используется при отправке ответа (дополнительные сведения см. в разделе AVC_FUNCTION_SEND_RESPONSE).

Поколение
Игнорируется во входных данных. В выходных данных для этого параметра задано число поколений, действующее, когда адрес узла считался допустимым. Этот параметр используется при отправке ответа (дополнительные сведения см. в разделе AVC_FUNCTION_SEND_RESPONSE).

В контексте интерфейса устройства GUID_AVC_CLASS код функции AVC_FUNCTION_GET_REQUEST используется для регистрации только для получения запросов единиц AV/C (не вложенных запросов). Эта функция обычно используется драйвером верхнего фильтра ( avc.sys FDO) для поддержки функций одноранговых устройств (то есть для обработки модульных запросов от целевого устройства из невиртуального стека). Хотя ничто не препятствует регистрации драйверов подсоединений для обработки запросов единиц, экземпляры драйверов подсоединения, регистрируются для поддержки одних и того же кода операций единиц, должны взаимодействовать друг с другом для обмена сведениями о состоянии. Avc.sys не поддерживает несколько регистраций для одного и того же кода операции единицы.

Эта функция использует структуру AVC_COMMAND_IRB. Эта структура определяет общие компоненты запроса команды AV/C. Единственными допустимыми входными параметрами являются SubunitAddrFlag, AlternateOpcodesFlag, AlternateOpcodes и SubunitAddr, и все они являются обязательными. AlternateOpcodes должен указывать на буфер, содержащий список кодов операций единиц, поддерживаемых вызывающим объектом. SubunitAddr должен указывать на буфер, содержащий адрес единицы (0xff).

В случае виртуальных экземпляров avc.sys (то есть экземпляров, регистрирующих интерфейс устройства GUID_VIRTUAL_AVC_CLASS), AVC_FUNCTION_GET_REQUEST используется для регистрации для получения запросов единиц AV/C и вложенных единиц. Драйверы верхнего фильтра (виртуального avc.sys FDO) обычно регистрируются для обработки запросов единиц, а драйверы подсоединения регистрируются для обработки запросов для определенного типа подсоединения. Хотя ничто не препятствует регистрации драйверов подсоединений для обработки запросов единиц, экземпляры драйверов подсоединения, регистрируются для поддержки одних и того же кода операций единиц, должны взаимодействовать друг с другом для обмена сведениями о состоянии. Avc.sys не поддерживает несколько регистраций для одного и того же кода операции единицы.

Драйверы subunit не задают входные параметры при регистрации для получения запросов, относящихся к подъединениям.

Эта функция всегда возвращает STATUS_PENDING, поэтому любая обработка должна выполняться в рамках процедуры завершения. После завершения структура AVC_COMMAND_IRB содержит код операции и операнды запроса. Протокол AV/C требует отправки ответа в течение 100 мс. Это можно сделать из подпрограммы завершения с помощью функции AVC_FUNCTION_SEND_RESPONSE .

Если в первом ответе используется код ответа AVC_RESPONSE_INTERIM (из перечисления AvcResponseType ), то ожидается выполнение последующей обработки. Элементы NodeAddress и Generation , полученные после завершения AVC_FUNCTION_GET_REQUEST исходной функции, должны использоваться в последующих ответах. В любом случае перед возвратом из начальной процедуры завершения AVC_FUNCTION_SEND_RESPONSE следует отправить следующую функцию AVC_FUNCTION_GET_REQUEST, чтобы можно было получить следующий запрос на единицу.

Рекомендуется использовать эту структуру, чтобы сначала обнулить структуру (используйте RtlZeroMemory) перед заполнением параметров.

Этот код функции можно вызвать по адресу IRQL <= DISPATCH_LEVEL.

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

AVC_FUNCTION_SEND_RESPONSE

AvcResponseCode

AVC_FUNCTION

RtlZeroMemory