Hyper-V 拡張可能スイッチ ポリシーの概要

Hyper-V プラットフォームと拡張可能スイッチ インターフェイスは、拡張可能スイッチのスイッチとポート ポリシーを管理するためのインフラストラクチャを提供します。 これらのポリシーは、PowerShell コマンドレットと WMI ベースのアプリケーション プログラムを使用して管理されます。 このインフラストラクチャは、ポリシーのストレージと移行のサポートも提供します。

独立系ソフトウェア ベンダー (ISV) は、このインフラストラクチャを使用して独自のカスタム ポリシーを登録できます。 これらのポリシーは、登録後、組み込みの Hyper-V ポリシー インターフェイスを使用して検出および管理できます。 ポリシーのプロパティは、ポート単位レベルまたはスイッチ単位のレベルで構成できます。

Hyper-V 拡張可能スイッチ インターフェイスは、カスタム ポリシー プロパティに加えて、ポートごとまたはスイッチごとにカスタム ポリシー プロパティの状態情報を取得するためのインフラストラクチャを提供します。 この状態情報は、機能の状態情報と呼ばれます。

拡張可能スイッチのカスタム ポリシー データは、マネージド オブジェクト形式 (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;

この例では、拡張スイッチ ポリシー プロパティの対応する C 構造体に MOF クラスをシリアル化するときに発生する次の点を強調表示します。

  • MOF ファイルのバージョン定義は USHORT 値に変換され、上位ビットにはメジャー バージョンが含まれており、下位ビットにはマイナー バージョンが含まれます。 バージョンは、次のコードを使用してシリアル化されます。

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

    たとえば、上記の Version("1") は、0x0100から (((1) << 8) + (0)). バージョン ("1.1") は、(((1) << 8) + (1))を介して 0x0101 の値にシリアル化されます。

    基になる拡張機能に対してカスタム ポリシー プロパティが発行されると、ポリシー プロパティを定義する構造体の PropertyVersion メンバーには、シリアル化されたバージョン値が含まれます。

    たとえば、拡張可能スイッチ インターフェイスが OID_SWITCH_PORT_PROPERTY_ADDのオブジェクト識別子 (OID) 要求を発行すると、OID はNDIS_SWITCH_PORT_PROPERTY_PARAMETERS 構造体に関連付けられます。 その構造体の PropertyVersion メンバーには、シリアル化されたバージョン値が含まれています。

  • すべての可変長文字列は、シリアル化された C 構造体を含むバッファー内のオフセットにシリアル化されます。 各可変長文字列は、このバッファー オフセット内の VARIABLE_LENGTH_STRING 構造体として書式設定されます。