AVC_FUNCTION_COMMAND

Der AVC_FUNCTION_COMMAND Funktionscode wird verwendet, um eine AV/C-Anforderung zu senden und eine Antwort als einen Vorgang zu empfangen.

E/A-Statusblock

Bei erfolgreicher Ausführung legt der AV/C-Protokolltreiber Irp-IoStatus.Status> auf STATUS_SUCCESS fest.

Mögliche andere Rückgabewerte sind:

Rückgabewert BESCHREIBUNG
STATUS_TIMEOUT Die Anforderung wurde gestellt, aber es wurde keine Antwort empfangen, bevor alle Timeout- und Wiederholungsverarbeitungen abgeschlossen waren. Das Zielgerät ignoriert Anforderungen, wenn eine vorherige Anforderung noch verarbeitet wird. Einige AV/C-Geräte sind nicht konform und lehnen es ab, innerhalb des Timeouts von 100 ms zu reagieren, auch nach mehreren aufeinander folgenden Versuchen. Die AVC_COMMAND_IRB-Struktur ermöglicht die Anpassung der standardmäßigen Timeout- und Wiederholungsmember (100 ms bzw. 9), aber diese Standardeinstellungen waren für alle bekannten Implementierungen ausreichend.
STATUS_PENDING Die Anforderung wurde gestellt, und es wurde eine Vorläufige Antwort empfangen. Es liegt in der Verantwortung der Vervollständigungsroutine, die endgültige Antwort zu behandeln und die IRP- und IRB-Ressourcen freizugeben.
STATUS_REQUEST_ABORTED Wenn Sie AV/C-Anforderungen übermitteln, brechen Sie sofort ab, wenn der IRP-Abschluss status STATUS_REQUEST_ABORTED wird.
STATUS_* Jeder andere Rückgabecode gibt an, dass ein Fehler oder eine Warnung aufgetreten ist, die außerhalb des Geltungsbereichs des AV/C-Protokolls lag.

Kommentare

Diese Funktion verwendet die AVC_COMMAND_IRB-Struktur, wie unten gezeigt.

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;

Anforderungen

Header: Deklariert in avc.h. Schließen Sie avc.h ein.

AVC_COMMAND_IRB-Eingabe

Common
Der Function-Unterteil dieses Members muss auf AVC_FUNCTION_COMMAND aus der AVC_FUNCTION-Enumeration festgelegt werden.

SubunitAddrFlag
Legen Sie dies auf eins fest, um die Untereinheitsadresse zu überschreiben, die avc.sys dem Untereinheitstreiber zugeordnet ist. Gründe für die Außerkraftsetzung sind: Der Untereinheitstreiber stellt mehrere Untereinheiten in einem einzelnen instance dar. Ein Einheitenbefehl muss gesendet werden, oder der Treiber wurde geladen, weil avc.sys den Untereinheitstyp oder die ID nicht bestimmen konnte. Wenn dies festgelegt ist, muss der SubunitAddr-Member auf nicht auslagerten Arbeitsspeicher zeigen, der die gewünschte Untereinheitsadresse enthält.

Dies muss auf eine (und die entsprechende angegebene SubunitAddr ) festgelegt werden, wenn der Aufrufer Anforderungen direkt an eine avc.sys FDO übermittelt.

Hinweis

Wenn dieses Flag bei Einer erfolgreichen Anforderung nicht festgelegt wird, wird dieses Flag bei einer erfolgreichen Anforderung festgelegt, und das SubunitAddr-Element verweist auf die tatsächliche Adresse der Untereinheit. Versuchen Sie nicht, den Inhalt zu ändern oder den Arbeitsspeicher freizugeben: Er ist Teil der Geräteerweiterung des übergeordneten Treibers. Dies kann natürlich auf 0 (null) zurückgesetzt werden, und der SubunitAddr-Zeiger wird gelöscht, um die Struktur für eine andere Untereinheit wiederzuverwenden.

AlternateOpcodesFlag Legen Sie dies auf eins fest, wenn der Befehlstyp und opcode dieser Anforderung zu einer Antwort mit einem anderen Opcode führen. Ohne dies werden nur Antworten mit übereinstimmenden Opcodes akzeptiert. Wenn dies festgelegt ist, muss der AlternateOpcodes-Member auf den nicht auslagerten Speicher zeigen, der die Liste der alternativen Opcodes enthält.

TimeoutFlag
Legen Sie dies auf eins fest, wenn das Standardtimeout für die Untereinheit nicht geeignet ist. Wenn dies festgelegt ist, muss der Timeout-Member auf das gewünschte Timeout (in 100-ns-Einheiten) festgelegt werden.

RetryFlag
Legen Sie dies auf eins fest, wenn die Standardwiederholungsanzahl für die Untereinheit nicht geeignet ist. Wenn dies festgelegt ist, muss der Wiederholungsmember auf die gewünschte Wiederholungsanzahl festgelegt werden.

Commandtype Auf Anforderung muss dieser Member auf einen der Enumeratoren aus der AvcCommandType-Enumeration festgelegt werden. Dies ist ein erforderlicher Parameter.

ResponseCode Bei der Antwort wird dieser Member auf einen Wert aus der AvcResponseCode-Enumeration festgelegt.

SubunitAddr
Legen Sie dies auf die Adresse des nicht auslagerten Arbeitsspeichers fest, der die gewünschte Untereinheitsadresse enthält, die gemäß Abschnitt 5.3.3 des 1394 Trade Association AV/C Digital Interface Command Set General Specification, Rev 3.0 codiert ist. Es ist keine Länge erforderlich, da dies durch die Adresscodierung der Untereinheit impliziert wird. Dieser Parameter wird ignoriert, wenn SubunitAddrFlag null ist.

AlternateOpcodes Legen Sie dies auf die Adresse des nicht auslagerten Arbeitsspeichers fest, der die gewünschte alternative Opcodeliste enthält. Das erste Byte der Opcodeliste ist die Anzahl der zu befolgenden Opcodes (entspricht der Anzahl der Bytes). Die Gesamtlänge des Arbeitsspeichers, der die alternative Opcodeliste enthält, ist AlternateOpcodes[0]+1. Dieser Parameter wird ignoriert, wenn AlternateOpcodesFlag null ist.

Timeout
Legen Sie dies auf das gewünschte Timeout in 100-ns-Einheiten fest. Der Standardtimeoutwert ist beispielsweise: Timeout.QuadPart = 10000000 (100 ms in 100ns-Einheiten). Dieser Parameter wird ignoriert, wenn TimeoutFlag null ist.

Wiederholungen Legen Sie dies auf die gewünschte Anzahl von Wiederholungen fest,avc.sys nach jedem Timeout ohne Antwort versuchen sollen, Anforderungen zu wiederholen. Beachten Sie, dass eine Wiederholungsanzahl von 0 (null) bedeutet, dass die Anforderung einmal versucht wird. Die Gesamtdauer, die für die Verarbeitung eines Befehls aufgewendet wird, ohne eine Antwort zu erhalten, wird nach der folgenden Formel berechnet:

Timeout * (Wiederholungen+ 1)

Dieser Parameter wird ignoriert, wenn RetryFlag null ist.

Opcode Legen Sie dies auf den gewünschten AV/C-Opcode fest (entsprechend dem Untereinheitstyp). Dies ist ein erforderlicher Parameter. Wenn AlternateOpcodesFlag festgelegt wurde und einer der alternativen Opcodes verwendet wurde, um die Antwort abzugleichen, wird dies auf diesen alternativen Opcode festgelegt.

OperandLength
Legen Sie dies auf die Anzahl der Bytes fest, die zum Speichern der Operanden im Operanden-Member verwendet werden. Dies ist ein erforderlicher Parameter. Bei der Antwort wird dieser Parameter auf die Anzahl der Bytes in der Operandenliste festgelegt, die von der Antwort verwendet wird.

Operanden
Legen Sie dies auf die Operandenliste fest, die für den Untereinheitstyp und opcode geeignet ist. Dies ist ein erforderlicher Parameter. Bei der Antwort enthält dieser Parameter die Operandenliste der Antwort.

NodeAddress Reserviert. Dies muss null sein.

Generation
Reserviert. Dies muss null sein.

Der AVC_FUNCTION_COMMAND-Funktionscode wird von virtuellen Instanzen von avc.sysnicht unterstützt. Wenn der Aufrufer ein externes Gerät steuern möchte, kann die nichtvirtuelle instance dieses Geräts über einen privaten Mechanismus oder durch eine Kombination aus AVC_FUNCTION_FIND_PEER_DO, AVC_FUNCTION_PEER_DO_LIST und AVC_FUNCTION_GET_SUBUNIT_INFO Funktionscodes des IOCTL_AVC_CLASS E/A-Steuerungscodes gefunden werden.

Diese Struktur definiert die allgemeinen Komponenten einer AV/C-Befehlsanforderung. Sie enthält die Opcode- und Operanden einer Anforderung sowie die Opcode- und Operanden einer Antwort (nach Abschluss). Die Größe der Operandenliste wird auf die maximal zulässige Anzahl von Operanden festgelegt, wenn eine 1-Byte-Untereinheitsadresse angegeben wird. Wenn die Untereinheitsadresse in irgendeiner Weise erweitert wird, wird die maximal zulässige Anzahl von Operandenbytes entsprechend reduziert.

Die empfohlene Verwendung dieser Struktur besteht darin, zuerst die -Struktur zu null (verwenden Sie RtlZeroMemory), bevor Sie die Parameter ausfüllen.

Dies muss unter IRQL = PASSIVE_LEVEL aufgerufen werden.

Weitere Informationen

AVC_FUNCTION

AvcCommandType

AvcResponseCode

AVC_FUNCTION_FIND_PEER_DO

AVC_FUNCTION_PEER_DO_LIST

AVC_FUNCTION_GET_SUBUNIT_INFO