AVC_FUNCTION_COMMAND
AVC_FUNCTION_COMMAND函式程式碼可用來傳送 AV/C 要求,並以一項作業的形式接收回應。
I/O 狀態欄塊
如果成功,AV/C 通訊協定驅動程式會將 Irp-IoStatus.Status > 設定為 STATUS_SUCCESS。
可能的其他傳回值包括:
傳回值 | 描述 |
---|---|
STATUS_TIMEOUT | 已提出要求,但在所有逾時和重試處理完成之前都未收到任何回應。 如果先前的要求仍在處理中,目標裝置會忽略要求。 某些 AV/C 裝置不符合規範,且拒絕在 100 毫秒逾時內回應,即使連續嘗試數次也一定。 AVC_COMMAND_IRB 結構允許調整預設逾 時 和 重試 成員 (100 毫秒和 9,分別) ,但這些預設設定已足以用於所有已知實作。 |
STATUS_PENDING | 已提出要求,並收到過渡回應。 完成常式的責任是處理最終回應,並釋放 IRP 和 IRB 資源。 |
STATUS_REQUEST_ABORTED | 提交 AV/C 要求時,STATUS_REQUEST_ABORTED IRP 完成狀態時立即中止。 |
地位_* | 任何其他傳回碼都表示發生錯誤或警告,超出 AV/C 通訊協定的範圍。 |
註解
此函式會使用 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輸入
通用
這個成員的 Function 子成員必須設定為 從AVC_FUNCTION列舉AVC_FUNCTION_COMMAND 。
SubunitAddrFlag
將此設定為一個 ,以覆寫 avc.sys 與子單位驅動程式相關聯的子單位位址。 覆寫的原因包括:子單位驅動程式代表單一實例中的多個子單位;必須傳送單元命令;或驅動程式已載入,因為 avc.sys 無法判斷子單位類型或識別碼。 如果已設定, SubunitAddr 成員必須指向包含所需子單位位址的非分頁式記憶體。
如果呼叫端直接將要求提交至avc.sysFDO,則必須將它設定為一個 (,並提供適當的 SubunitAddr) 。
注意
如果未在要求上設定此旗標,則會在成功要求的回應時設定此旗標,而 SubunitAddr 成員會指向子單位的實際位址。 請勿嘗試改變內容或釋放記憶體:它是父驅動程式裝置擴充功能的一部分。 當然,這可以設定回零,而 SubunitAddr 指標會清除以重複使用不同子單位的結構。
AlternateOpcodesFlag 如果此要求的命令類型和 opcode 產生具有不同 opcode 的回應,請將此設定為一。 若未這樣做,則只會接受具有相符 opcode 的回應。 如果已設定此選項, AlternateOpcodes 成員必須指標指向包含替代 opcode 清單的非分頁式記憶體。
TimeoutFlag
如果預設逾時不適用於子單位,請將此設定為一。 如果已設定, Timeout 成員必須設定為 100-ns 單位) 所需的逾時 (。
RetryFlag
如果預設重試計數不適用於子單位,請將此設定為一。 如果已設定此選項, 重試成員必須 設定為所需的重試計數。
CommandType 在要求時,這個成員必須設定為 AvcCommandType 列舉的其中一個列舉值。 這是必要參數。
ResponseCode 在回應時,這個成員會設定為 來自 AvcResponseCode 列舉的值。
SubunitAddr
將此設定為包含根據 1394 Trade Association AV/C Digital Interface Command Set General Specification 3.0 第 5.3.3 節編碼之所需子單位位址的非分頁式記憶體位址。 不需要長度,因為子單位位址編碼意指這點。 如果 SubunitAddrFlag 為零,則會忽略此參數。
AlternateOpcodes 將此設定為包含所需替代 Opcode 清單之非分頁式記憶體的位址。 opcode 清單的第一個位元組是要遵循的 opcode 計數, (相當於位元組數目) 。 包含替代 opcode 清單的記憶體總長度為 AlternateOpcodes[0]+1。 如果 AlternateOpcodesFlag 為零,則會忽略此參數。
逾時
將此設定為 100-ns 單位所需的逾時。 例如,預設逾時值為: Timeout.QuadPart = 1000000 (100 毫秒,以 100ns 單位為單位) 。 如果 TimeoutFlag 為零,則會忽略此參數。
重試 將此設定為所需的次數 ,avc.sys 應該嘗試在每次逾時後重試要求,而不需回應。 請注意,重試計數為零表示要求一次。 下列公式會計算嘗試處理命令而不取得回應所花費的總時間:
逾時 * (重試+ 1)
如果 RetryFlag 為零,則會忽略此參數。
Opcode 將此設定為適用于子單位類型) 所需的 AV/C opcode (。 這是必要參數。 在回應上,如果已設定 AlternateOpcodesFlag ,而且其中一個替代的 opcode 用來比對回應,則會將它設定為該替代的 opcode。
OperandLength
將此設定為用來將運算元儲存在 Operands 成員中的位元組數目。 這是必要參數。 在回應時,此參數會設定為回應所使用的運算元清單中的位元組數目。
運算元
將此設定為適用于子單位類型和 opcode 的運算元清單。 這是必要參數。 在回應時,此參數包含回應的運算元清單。
NodeAddress 保留。 這必須是零。
世代
保留的。 這必須是零。
avc.sys的虛擬實例不支援AVC_FUNCTION_COMMAND函式程式代碼。 如果呼叫端想要控制外部裝置,該裝置的非虛擬實例可以透過私人機制,或透過AVC_FUNCTION_FIND_PEER_DO的一些組合, AVC_FUNCTION_PEER_DO_LIST 和 AVC_FUNCTION_GET_SUBUNIT_INFO IOCTL_AVC_CLASS I/O 控制程式碼的函式程式碼來尋找。
此結構會定義 AV/C 命令要求的一般元件。 它會保存要求的 opcode 和運算元,以及完成時回應的 opcode 和運算元 () 。 運算元清單的大小會固定在指定一位元組子單位位址的最大允許運算元數目。 如果以任何方式擴充子單位位址,則會據以減少允許的最大運算元位元組數目。
此結構的建議用法是先零結構, (先使用 RtlZeroMemory) ,再填入參數。
這必須在 IRQL = PASSIVE_LEVEL呼叫。