AVC_FUNCTION_COMMAND
El código de función AVC_FUNCTION_COMMAND se usa para enviar una solicitud de AV/C y recibir una respuesta como una operación.
Bloque de estado de entrada/salida
Si se ejecuta correctamente, el controlador de protocolo AV/C establece Irp-IoStatus.Status> en STATUS_SUCCESS.
Otros valores devueltos posibles son:
Valor devuelto | Descripción |
---|---|
STATUS_TIMEOUT | La solicitud se realizó, pero no se recibió ninguna respuesta antes de que se completara todo el tiempo de espera y se completó el procesamiento de reintento. El dispositivo de destino omite las solicitudes si se sigue procesando una solicitud anterior. Algunos dispositivos AV/C no son compatibles y se niegan a responder dentro del tiempo de espera de 100 ms, incluso después de varios intentos sucesivos. La estructura AVC_COMMAND_IRB permite el ajuste de los miembros Timeout y Retries predeterminados (100 ms y 9, respectivamente), pero esta configuración predeterminada ha sido suficiente para todas las implementaciones conocidas. |
STATUS_PENDING | Se realizó la solicitud y se recibió una respuesta provisional. Es responsabilidad de la rutina de finalización controlar la respuesta final y liberar los recursos IRP e IRB. |
STATUS_REQUEST_ABORTED | Al enviar solicitudes de AV/C, anule inmediatamente el estado de finalización de IRP STATUS_REQUEST_ABORTED. |
ESTADO_* | Cualquier otro código de retorno indica que se produjo un error o una advertencia que estaba fuera del ámbito del protocolo AV/C. |
Comentarios
Esta función usa la estructura AVC_COMMAND_IRB, como se muestra a continuación.
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;
Requisitos
Encabezados: Declarado en avc.h. Incluya avc.h.
entrada de AVC_COMMAND_IRB
Común
El submembrado Function de este miembro debe establecerse en AVC_FUNCTION_COMMAND de la enumeración AVC_FUNCTION.
SubunitAddrFlag
Establézcalo en uno para invalidar la dirección de subunidad que avc.sys asocia al controlador de subbúnit. Entre los motivos para invalidar se incluyen: el controlador de subbúnit representa varias subunidades en una sola instancia; se debe enviar un comando de unidad; o el controlador se cargó porque avc.sys no pudo determinar el tipo de subbús ni el identificador. Si se establece, el miembro SubunitAddr debe apuntar a la memoria no paginada que contiene la dirección de subbúnit deseada.
Debe establecerse en uno (y el SubunitAddr proporcionado) adecuado si el autor de la llamada envía solicitudes directamente a un avc.sys FDO.
Nota
Si esta marca no se establece en la solicitud, en la respuesta de una solicitud correcta, se establece esta marca y el miembro SubunitAddr apunta a la dirección real de la subunidad. No intente modificar el contenido ni liberar la memoria: forma parte de la extensión del dispositivo del controlador primario. Por supuesto, esto puede volver a establecerse en cero y el puntero SubunitAddr borrado para reutilizar la estructura de una subunidad diferente.
AlternateOpcodesFlag Establézcalo en uno si el tipo de comando y el código de operación de esta solicitud da como resultado una respuesta con un código de operación diferente. Sin esto, solo se aceptan las respuestas con códigos de operación coincidentes. Si se establece, el miembro AlternateOpcodes debe apuntar a la memoria no paginada que contiene la lista de códigos de operación alternativos.
TimeoutFlag
Establézcalo en uno si el tiempo de espera predeterminado no es adecuado para la subunidad. Si se establece, el miembro Timeout debe establecerse en el tiempo de espera deseado (en unidades de 100-ns).
RetryFlag
Establézcalo en uno si el recuento de reintentos predeterminado no es adecuado para la subunidad. Si se establece, el miembro Retries debe establecerse en el número de reintentos deseado.
Commandtype A petición, este miembro debe establecerse en uno de los enumeradores de la enumeración AvcCommandType . Es un parámetro obligatorio.
ResponseCode En respuesta, este miembro se establece en un valor de la enumeración AvcResponseCode .
SubunitAddr
Establézcalo en la dirección de la memoria no paginada que contiene la dirección de subunidad deseada codificada según la sección 5.3.3 de la Especificación general del conjunto de comandos de la Asociación comercial AV/C av/C Digital Interface, Rev 3.0. No es necesaria ninguna longitud porque la codificación de direcciones de subbúnit implica esto. Este parámetro se omite si SubunitAddrFlag es cero.
AlternateOpcodes Establézcalo en la dirección de la memoria no paginada que contiene la lista de códigos de operación alternativos deseada. El primer byte de la lista de códigos de operación es el recuento de códigos de operación que se van a seguir (equivalente al número de bytes). La longitud total de la memoria que contiene la lista de códigos de operación alternativo es AlternateOpcodes[0]+1. Este parámetro se omite si AlternateOpcodesFlag es cero.
Tiempo de espera
Establézcalo en el tiempo de espera deseado en unidades de 100-ns. Por ejemplo, el valor de tiempo de espera predeterminado es: Timeout.QuadPart = 10000000 (100 ms en unidades de 100ns). Este parámetro se omite si TimeoutFlag es cero.
Reintentos Establézcalo en el número deseado de veces avc.sys debe intentar reintentar las solicitudes después de cada tiempo de espera sin una respuesta. Tenga en cuenta que un recuento de reintentos de cero significa que la solicitud se intenta una vez. La fórmula siguiente calcula la cantidad total de tiempo empleado en intentar procesar un comando sin obtener una respuesta:
Tiempo de espera * (Reintentos+ 1)
Este parámetro se omite si RetryFlag es cero.
Opcode Establézcalo en el código de operación de AV/C deseado (adecuado para el tipo de subunidad). Es un parámetro obligatorio. En la respuesta, si se estableció AlternateOpcodesFlag y se usó uno de los códigos de operación alternativos para coincidir con la respuesta, se establece en ese código de operación alternativo.
OperandoLength
Establézcalo en el número de bytes usados para almacenar los operandos en el miembro Operandos . Es un parámetro obligatorio. En respuesta, este parámetro se establece en el número de bytes de la lista de operandos que usa la respuesta.
Operandos
Establézcalo en la lista de operandos adecuada para el tipo de subbúsco y el código de operación. Es un parámetro obligatorio. En la respuesta, este parámetro contiene la lista de operandos de la respuesta.
NodeAddress Reservados. Debe ser cero.
Generación
Reservado. Debe ser cero.
Las instancias virtuales de avc.sysno admiten el código de función AVC_FUNCTION_COMMAND . Si el autor de la llamada desea controlar un dispositivo externo, la instancia no virtual de ese dispositivo se puede ubicar a través de un mecanismo privado o mediante alguna combinación de la AVC_FUNCTION_FIND_PEER_DO, AVC_FUNCTION_PEER_DO_LIST y AVC_FUNCTION_GET_SUBUNIT_INFO códigos de función del código de control de E/S de IOCTL_AVC_CLASS.
Esta estructura define los componentes comunes de una solicitud de comando de AV/C. Contiene el código de operación y los operandos de una solicitud, y el código de operación y los operandos de una respuesta (tras la finalización). El tamaño de la lista de operandos se fija en el número máximo permitido de operandos dado una dirección de subunidad de un byte. Si la dirección de subunidad se extiende de cualquier manera, el número máximo permitido de bytes de operando se reduce en consecuencia.
El uso recomendado de esta estructura es primero cero la estructura (use RtlZeroMemory) antes de rellenar los parámetros.
Se debe llamar a en IRQL = PASSIVE_LEVEL.