Freigeben über


AVC_FUNCTION_GET_REQUEST

Der AVC_FUNCTION_GET_REQUEST Funktionscode wird verwendet, um sich zu registrieren, um Av/C-Einheiten- und Untereinheitsanforderungen zu empfangen.

E/A-Statusblock

Diese Funktion legt Irp-IoStatus.Status> immer auf STATUS_PENDING fest.

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 Funktionsunterteil dieses Members muss auf AVC_FUNCTION_GET_REQUEST aus der AVC_FUNCTION-Enumeration festgelegt werden.

UntereinheitAddrFlag
Wird nur bei der Registrierung zum Empfangen von Einheitenbefehlen verwendet. Legen Sie dies auf 1 fest, und geben Sie im Parameter SubunitAddr eine Einheitsadresse an. Beachten Sie, dass bei Untereinheitsanforderungen dies bei Abschluss auf 1 festgelegt ist, und der SubunitAddr-Parameter auf den Arbeitsspeicher verweist, der die Untereinheitsadresse für diese virtuelle Untereinheit instance enthält. Der Aufrufer kann auf diesen nicht auslagerten Arbeitsspeicher zugreifen, darf aber nicht versuchen, ihn freizugeben.

AlternateOpcodesFlag
Wird nur bei der Registrierung zum Empfangen von Einheitenbefehlen verwendet. Legen Sie dies auf 1 fest, und geben Sie eine Liste der vom Aufrufer unterstützten Opcodes im AlternateOpcodes-Parameter an.

TimeoutFlag
Ignoriert.

RetryFlag
Ignoriert.

CommandType
In der Eingabe ignoriert. Bei der Ausgabe wird das CommandType-Element auf einen der Werte aus der AvcCommandType-Enumeration festgelegt.

ResponseCode
Wird für Anforderungen ignoriert.

UntereinheitAddr
Wird nur bei der Registrierung zum Empfangen von Einheitenbefehlen verwendet. Legen Sie dies auf die Adresse des nicht auslagerten Arbeitsspeichers fest, der die Gemäß Abschnitt 5.3.3 des 1394 Trade Association AV/C Digital Interface Command Set General Specification, Rev 3.0 (0xff) codierte Einheitsadresse enthält. Beachten Sie, dass diese bei Untereinheitsanforderungen nach Abschluss auf den Arbeitsspeicher verweist, der die Untereinheitsadresse für diese virtuelle Untereinheit instance enthält. Der Aufrufer kann auf diesen nicht auslagerten Arbeitsspeicher zugreifen, darf aber nicht versuchen, ihn freizugeben.

AlternateOpcodes
Wird nur bei der Registrierung zum Empfangen von Einheitenbefehlen verwendet. Legen Sie dies auf die Adresse des nicht auslagerten Arbeitsspeichers fest, der die Liste der vom Aufrufer unterstützten Einheits-Opcodes enthält. Das erste Byte der opcode-Liste ist die Anzahl der zu befolgenden Opcodes (entspricht der Anzahl der Bytes). Die Gesamtlänge des Arbeitsspeichers, der die Alternative Opcode-Liste enthält , ist AlternateOpcodes[0]+1.

Timeout
Ignoriert.

Wiederholungsversuche
Ignoriert.

Opcode
Wird bei der Eingabe ignoriert. In der Ausgabe enthält dies einen Opcode der AV/C-Einheit. Dies ist einer der opcodes, die über AlternateOpcodes angegeben werden.

OperandLength
Wird bei der Eingabe ignoriert. Bei der Ausgabe wird dies auf die Anzahl der Bytes in der Operandenliste festgelegt, die von der Anforderung verwendet wird.

Operanden
Wird bei der Eingabe ignoriert. Bei der Ausgabe enthält dieser Parameter die Operandenliste der Anforderung.

NodeAddress
Wird bei der Eingabe ignoriert. Bei der Ausgabe wird dies auf die Knotenadresse der Quelle der Anforderung festgelegt. Dieser Parameter wird beim Senden der Antwort verwendet (weitere Informationen finden Sie unter AVC_FUNCTION_SEND_RESPONSE).

Generation
Wird bei der Eingabe ignoriert. Bei der Ausgabe wird dies auf die Generierungsanzahl festgelegt, die gilt, wenn die Knotenadresse als gültig galt. Dieser Parameter wird beim Senden der Antwort verwendet (weitere Informationen finden Sie unter AVC_FUNCTION_SEND_RESPONSE).

Im Kontext der GUID_AVC_CLASS-Geräteschnittstelle wird der AVC_FUNCTION_GET_REQUEST Funktionscode verwendet, um sich zu registrieren, um nur AV/C-Einheitenanforderungen zu empfangen (keine Untereinheitsanforderungen). Diese Funktion wird im Allgemeinen von einem oberen Filtertreiber (des avc.sys FDO) verwendet, um Peergerätefunktionen zu unterstützen (d. a. um Einheitenanforderungen des Zielgeräts aus dem nichtvirtuellen Stapel zu verarbeiten). Obwohl nichts hindert Untereinheitstreiber daran, sich zu registrieren, um Einheitenanforderungen zu verarbeiten, müssen Untereinheitstreiberinstanzen, die sich registrieren, um dieselben Einheiten opcodes zu unterstützen, zusammenarbeiten, um Zustandsinformationen gemeinsam zu teilen. Avc.sys unterstützt nicht direkt mehrere Registrierungen für die gleichen Einheits-Opcodes.

Diese Funktion verwendet die AVC_COMMAND_IRB-Struktur. Diese Struktur definiert die allgemeinen Komponenten einer AV/C-Befehlsanforderung. Die einzigen gültigen Eingabeparameter sind SubunitAddrFlag, AlternateOpcodesFlag, AlternateOpcodes und SubunitAddr, und alle sind erforderlich. AlternateOpcodes müssen auf einen Puffer verweisen, der die Liste der vom Aufrufer unterstützten Einheiten opcodes enthält. SubunitAddr muss auf einen Puffer zeigen, der eine Einheitsadresse (0xff) enthält.

Bei virtuellen Instanzen von avc.sys (d. h. Instanzen, die die GUID_VIRTUAL_AVC_CLASS-Geräteschnittstelle registrieren) wird AVC_FUNCTION_GET_REQUEST verwendet, um anforderungen von AV/C-Einheiten und Untereinheiten zu empfangen. Obere Filtertreiber (des virtuellen avc.sys FDO) registrieren sich im Allgemeinen, um Einheitenanforderungen zu verarbeiten, während Untereinheitstreiber registrieren, um Anforderungen für ihren bestimmten Typ von Untereinheit zu behandeln. Obwohl nichts hindert Untereinheitstreiber daran, sich zu registrieren, um Einheitenanforderungen zu verarbeiten, müssen Untereinheitstreiberinstanzen, die sich registrieren, um dieselben Einheiten opcodes zu unterstützen, zusammenarbeiten, um Zustandsinformationen gemeinsam zu teilen. Avc.sys unterstützt nicht direkt mehrere Registrierungen für die gleichen Einheits-Opcodes.

Untereinheitstreiber legen beim Registrieren keine Eingabeparameter fest, um untereinheitsspezifische Anforderungen zu empfangen.

Diese Funktion gibt immer STATUS_PENDING zurück, sodass jede Verarbeitung in einer Vervollständigungsroutine ausgeführt werden muss. Nach Abschluss enthält die AVC_COMMAND_IRB-Struktur den Opcode und die Operanden einer Anforderung. Das AV/C-Protokoll erfordert, dass eine Antwort innerhalb von 100 ms gesendet wird. Dies kann über die Vervollständigungsroutine mithilfe der funktion AVC_FUNCTION_SEND_RESPONSE erfolgen.

Wenn die erste Antwort den AVC_RESPONSE_INTERIM Antwortcode (aus der AvcResponseType-Enumeration ) verwendet, wird die Nachverarbeitung erwartet. Die Member NodeAddress und Generation , die durch abschluss der AVC_FUNCTION_GET_REQUEST ursprünglichen Funktion abgerufen wurden, müssen in nachfolgenden Antworten verwendet werden. In jedem Fall sollte die nächste AVC_FUNCTION_GET_REQUEST-Funktion übermittelt werden, bevor sie von der anfänglichen AVC_FUNCTION_SEND_RESPONSE Abschlussroutine zurückgegeben wird, damit die nächste Einheitsanforderung empfangen werden kann.

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

Dieser Funktionscode kann unter IRQL <= DISPATCH_LEVEL aufgerufen werden.

Weitere Informationen

AVC_FUNCTION_SEND_RESPONSE

AvcResponseCode

AVC_FUNCTION

RtlZeroMemory