Condividi tramite


AVC_FUNCTION_COMMAND

Il codice della funzione AVC_FUNCTION_COMMAND viene usato per inviare una richiesta AV/C e ricevere una risposta come una sola operazione.

Blocco dello stato I/O

Se ha esito positivo, il driver del protocollo AV/C imposta Irp-IoStatus.Status> su STATUS_SUCCESS.

Gli altri valori restituiti possibili includono:

Valore restituito Descrizione
STATUS_TIMEOUT La richiesta è stata effettuata, ma non è stata ricevuta alcuna risposta prima di tutto il timeout e l'elaborazione dei tentativi è stata completata. Il dispositivo di destinazione ignora le richieste se una richiesta precedente viene ancora elaborata. Alcuni dispositivi AV/C non sono conformi e rifiutano di rispondere entro il timeout da 100 ms, anche dopo diversi tentativi successivi. La struttura AVC_COMMAND_IRB consente la regolazione dei membritimeout e tentativi predefiniti (rispettivamente 100ms e 9), ma queste impostazioni predefinite sono state sufficienti per tutte le implementazioni note.
STATUS_PENDING La richiesta è stata effettuata e è stata ricevuta una risposta provvisoria. È responsabilità della routine di completamento gestire la risposta finale e liberare le risorse IRP e IRB.
STATUS_REQUEST_ABORTED Quando si inviano richieste AV/C, interrompere immediatamente quando lo stato di completamento di IRP è STATUS_REQUEST_ABORTED.
STATO_* Qualsiasi altro codice restituito indica che si è verificato un errore o un avviso oltre l'ambito del protocollo AV/C.

Commenti

Questa funzione usa la struttura AVC_COMMAND_IRB, come illustrato di seguito.

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;

Requisiti

Intestazioni: Dichiarato in avc.h. Includere avc.h.

AVC_COMMAND_IRB Input

Common
Il sottomember della funzione di questo membro deve essere impostato su AVC_FUNCTION_COMMAND dall'enumerazione AVC_FUNCTION .

SubunitAddrFlag
Impostare questo su uno per eseguire l'override dell'indirizzo subunit che avc.sys associa al driver subunit. Motivi per eseguire l'override includono: il driver subunit rappresenta più sottounite in una singola istanza; è necessario inviare un comando di unità; o il driver è stato caricato perché avc.sys non è stato possibile determinare il tipo di subunit o l'ID. Se questa impostazione è impostata, il membro SubunitAddr deve puntare alla memoria non di pagina contenente l'indirizzo subunit desiderato.

Questa operazione deve essere impostata su una (e l'oggetto SubunitAddr appropriato fornito) se il chiamante invia le richieste direttamente a un oggetto FDO avc.sys .

Nota

Se questo flag non è impostato su richiesta, in risposta da una richiesta riuscita, questo flag viene impostato e il membro SubunitAddr punta all'indirizzo effettivo della subunit. Non tentare di modificare il contenuto o liberare la memoria: fa parte dell'estensione del dispositivo del driver padre. Questo può, naturalmente, essere impostato su zero e il puntatore SubunitAddr deselezionato per riutilizzare la struttura per una subunit diversa.

AlternateOpcodesFlag Impostare questo valore su uno se il tipo di comando e il codice opcode di questa richiesta genera una risposta con un codice opcode diverso. Senza questo, vengono accettate solo risposte con opcode corrispondenti. Se questa operazione è impostata, il membro AlternateOpcodes deve puntare alla memoria non con pagine contenente l'elenco di opcode alternativi.

TimeoutFlag
Impostare questo valore su uno se il timeout predefinito non è appropriato per la subunit. Se questo è impostato, il membro timeout deve essere impostato sul timeout desiderato (in 100-ns unità).

RiprovareFlag
Impostare questo valore su uno se il conteggio dei tentativi predefinito non è appropriato per la subunit. Se questo è impostato, il membro Retries deve essere impostato sul conteggio dei tentativi desiderato.

Commandtype Per richiedere, questo membro deve essere impostato su uno degli enumeratori dell'enumerazione AvcCommandType . Parametro obbligatorio.

ResponseCode In risposta, questo membro è impostato su un valore dall'enumerazione AvcResponseCode .

SubunitAddr
Impostare questa opzione sull'indirizzo di memoria non impaginata contenente l'indirizzo di subunit desiderato codificato in base alla sezione 5.3.3 dell'associazione commerciale AV/C Digital Interface Command Set General Specification, Rev 3.0. Nessuna lunghezza è necessaria perché la codifica degli indirizzi subunit implica questa operazione. Questo parametro viene ignorato se SubunitAddrFlag è zero.

AlternateOpcodes Impostare questa opzione sull'indirizzo della memoria non a pagina contenente l'elenco di opcode alternativo desiderato. Il primo byte dell'elenco opcode è il numero di opcode da seguire (equivalente al numero di byte). La lunghezza totale della memoria contenente l'elenco opcode alternativo è AlternateOpcodes[0]+1. Questo parametro viene ignorato se AlternateOpcodesFlag è zero.

Timeout
Impostare questo valore sul timeout desiderato in 100-ns unità. Ad esempio, il valore di timeout predefinito è: Timeout.QuadPart = 10000000 (100ms in 100ns unità). Questo parametro viene ignorato se TimeoutFlag è zero.

Tentativi Impostare questo valore sul numero di volte desiderato avc.sys deve tentare di riprovare le richieste dopo ogni timeout senza risposta. Si noti che un numero di tentativi pari a zero indica che la richiesta viene tentata una volta. La quantità totale di tempo trascorso per il tentativo di elaborare un comando senza ottenere una risposta viene calcolata dalla formula seguente:

Timeout * (tentativi+ 1)

Questo parametro viene ignorato se RetryFlag è zero.

Opcode Impostare questo valore sul codice opcode AV/C desiderato (appropriato per il tipo subunit). Parametro obbligatorio. In risposta, se AlternateOpcodesFlag è stato impostato e uno dei codici opcode alternativi è stato usato per corrispondere alla risposta, questo è impostato su tale opcode alternativo.

OperandLength
Impostare questo valore sul numero di byte usati per archiviare gli operandi nel membro Operandi . Parametro obbligatorio. In risposta, questo parametro è impostato sul numero di byte nell'elenco operando usato dalla risposta.

Operandi
Impostare questa opzione sull'elenco operando appropriato per il tipo di subunit e il codice opcode. Parametro obbligatorio. In risposta, questo parametro contiene l'elenco operando della risposta.

NodeAddress Riservati. Questo deve essere zero.

Generazione
Riservato. Questo deve essere zero.

Il codice della funzione AVC_FUNCTION_COMMAND non è supportato da istanze virtuali di avc.sys. Se il chiamante vuole controllare un dispositivo esterno, l'istanza nonvirtuale del dispositivo può trovarsi tramite un meccanismo privato o tramite una combinazione di AVC_FUNCTION_FIND_PEER_DO, AVC_FUNCTION_PEER_DO_LISTe AVC_FUNCTION_GET_SUBUNIT_INFO codici di funzione del codice di controllo I/O IOCTL_AVC_CLASS.

Questa struttura definisce i componenti comuni di una richiesta di comando AV/C. Contiene gli operandi e il codice opcode di una richiesta e gli operandi di una risposta (al completamento). La dimensione dell'elenco operando è fissa al numero massimo consentito di operandi assegnati a un indirizzo subunit uno byte. Se l'indirizzo subunit viene esteso in qualsiasi modo, il numero massimo consentito di byte operandi viene ridotto di conseguenza.

L'uso consigliato di questa struttura consiste nello zero della struttura (usare RtlZeroMemory) prima di compilare i parametri.

Questa operazione deve essere chiamata in IRQL = PASSIVE_LEVEL.

Vedi anche

AVC_FUNCTION

AvcCommandType

AvcResponseCode

AVC_FUNCTION_FIND_PEER_DO

AVC_FUNCTION_PEER_DO_LIST

AVC_FUNCTION_GET_SUBUNIT_INFO