共用方式為


Hyper-V 可延伸交換器原則概觀

Hyper-V 平臺和可延伸交換器介面提供基礎結構來管理可延伸交換器的交換器和埠原則。 這些原則是透過 PowerShell Cmdlet 和 WMI 型應用程式來管理。 此基礎結構也支援原則的儲存和移轉。

獨立軟體廠商 (ISV) 可以使用此基礎結構來註冊自己的自訂原則。 註冊這些原則之後,即可透過內建的 Hyper-V 原則介面來探索及管理這些原則。 原則的屬性可以在每一端口層級或每一交換器層級上設定。

除了自訂原則屬性之外,Hyper-V 可延伸交換器介面還提供基礎結構,以根據每個埠或個別交換器取得自訂原則屬性的狀態資訊。 此狀態資訊稱為 功能狀態 資訊。

可延伸交換器自訂原則資料會使用 MANAGED 物件格式 (MOF) 類別定義,向 WMI 管理層註冊。 以下顯示自訂埠原則屬性的 MOF 類別範例。

#pragma namespace("\\\\.\\root\\virtualization\\v2")

[ Dynamic, 
 UUID("F2F73F23-2B8E-457a-96C4-F541201C9150"),
 ExtensionId("5CBF81BE-5055-47CD-9055-A76B2B4E369E"), 
 Provider("VmmsWmiInstanceAndMethodProvider"), 
 Locale(0x409),
 InterfaceVersion("1"),
 InterfaceRevision("0"),
DisplayName("VendorName Port Settings Friendly Name") : Amended,
Description("VendorName Port Settings detailed description.") : Amended]
class Vendor_SampleFeatureSettingData: Msvm_EthernetSwitchPortFeatureSettingDataMsvm
{
  [WmiDataId(1),
   InterfaceVersion("1"),
   InterfaceRevision("0")]
  uint8  IntValue8 = 0;

  [WmiDataId(2),
   InterfaceVersion("1"),
   InterfaceRevision("0")]
  uint16 IntValue16 = 0;

  [WmiDataId(3),
   InterfaceVersion("1"),
   InterfaceRevision("0")]
  uint32 IntValue32 = 0;

  [WmiDataId(4),
   InterfaceVersion("1"),
   InterfaceRevision("0")]
  uint64 IntValue64 = 0;

  [WmiDataId(5),
   InterfaceVersion("1"),
   InterfaceRevision("0"), 
   MaxLen(255)]
  string FixedLengthString = "";

  [WmiDataId(6),
   InterfaceVersion("1"),
   InterfaceRevision("0")]
  string VariableLengthString = "";

  [WmiDataId(7),
   InterfaceVersion("1"),
   InterfaceRevision("0"),
   Max(8)]
  uint32 FixedLengthArray[] = {};

  [WmiDataId(8),
   InterfaceVersion("1"),
   InterfaceRevision("0")]
  uint32 VariableLengthArray[] = {};

};

WMI 管理層會在傳輸至基礎可延伸交換器擴充功能時序列化 MOF 資料。 MOF 類別會序列化為可由 Hyper-V 可延伸交換器延伸模組處理的對應 C 結構。 以下顯示先前範例中針對 MOF 類別序列化的 C 結構範例。

#pragma pack(8)

typedef struct _VARIABLE_LENGTH_ARRAY
{
    UINT32 Buffer[1];
} VARIABLE_LENGTH_ARRAY;

typedef struct _SAMPLE_FEATURE_SETTINGS
{
    UINT8  IntValue8;
    UINT32 IntValue16;
    UINT32 IntValue32;
    UINT64 IntValue64;
    UINT16 FixedLengthStringByteCount;
    WCHAR  FixedLengthString[256]; 
    UINT32 VariableLengthStringOffset;    // offset to VARIABLE_LENGTH_STRING structure
    UINT32 FixedLengthArrayElementCount;
    UINT32 FixedLengthArray[8];
    UINT32 VariableLengthArrayElementCount;
    UINT32 VariableLengthArrayOffset;   // offset to VARIABLE_LENGTH_ARRAY
} SAMPLE_FEATURE_SETTINGS;
 
typedef struct _VARIABLE_LENGTH_STRING
{
    USHORT StringLength;
    WCHAR  StringBuffer[1];
} VARIABLE_LENGTH_STRING;

本範例會醒目提示當 MOF 類別序列化為可延伸交換器原則屬性的對應 C 結構時所發生的下列幾點:

  • MOF 檔案中的版本定義會轉換成 USHORT 值,其中高階位包含主要版本,而低序位則包含次要版本。 版本是使用下列程式碼序列化:

    (((MajorVersion) << 8) + (MinorVersion))

    例如,上述版本 (「1」) 會序列化為透過 (((1) << 8) + (0)) 0x0100 的值。 版本 (「1.1」) 會序列化為透過 (((1) << 8) + (1)) 0x0101 的值。

    當自訂原則屬性發出至基礎延伸模組時,定義原則屬性之結構的 PropertyVersion 成員會包含序列化版本值。

    例如,當可延伸的交換器介面發出物件識別碼 (OID) 要求 OID_SWITCH_PORT_PROPERTY_ADD時,OID 會與 NDIS_SWITCH_PORT_PROPERTY_PARAMETERS 結構相關聯。 該結構的 PropertyVersion 成員包含序列化版本值。

  • 所有可變長度字串都會序列化為緩衝區內包含序列化 C 結構的位移。 每個可變長度字串都會格式化為這個緩衝區位移內的 VARIABLE_LENGTH_STRING 結構。