SMP 开发

WMI 提供程序

存储管理提供程序(SMP)接口基于 WMI。 尽管可以使用 WMI v1 编写 SMP,但我们强烈建议使用 C/C++ 编写 WMI v2 提供程序。 不建议使用 .NET Framework 进行 SMP 开发,因为某些重要功能可能无法通过 .NET 平台使用。 此外:

  • WMI v1 依赖于 COM,这可能非常困难且耗时地学习。
  • WMI v2 与 WMI v1 相比,符合行业标准;WMI v2 使用 WS-Management 而不是 DCOM。
  • 提供程序可以利用 WMI v2 中更好的错误/事件。
  • 提供程序可以利用 WMI v2 中的 PowerShell 扩展和集成。

开发资源清单

位置 注意
基类 MOF 文件:Storagewmi_provider.mof 和以文件名“msft_”开头的所有 MOF 文件。 Windows 软件开发包 (SDK) 在 %SDK_Installed_Location%\Windows Kits\x.x\Include\um 下
其他必需的 MOF 文件:qualifiers.mof 和 CIM_Error.mof 分布式管理工作队: http://dmtf.org/standards/cim 这些文件是非Microsoft定义的。
头文件:mi.h Windows SDK 在 %SDK_Installed_Location%\Windows Kits\x.x\Include\um 下
提供程序框架生成工具和.dll文件:Convert-MofToProvider.exe Windows SDK 在 %SDK_Installed_Location%\Windows Kits\x.x\bin\x64\ 或 ...\bin\x86 下
提供程序注册工具:Register-CimProvider.exe %OS_Install_Path%\Windows\System32\

MOF 定义

初始 SMP 开发通过三个简单的步骤完成:

  1. 扩展提供程序 MOF。
  2. 生成提供程序框架(或存根)。
  3. 实现存根。

扩展提供程序 MOF

SMP MOF 位于 Windows SDK include 文件夹中。 它们前缀为 MSFT_*。 将这些文件复制到开发目录,以及 CIM_Error.mof 和限定符.mof。 每个 MOF 定义一个或多个构成 SMP 基础的抽象类。

与其他语言类似,无法直接实现抽象类。 必须在单独的实现类中派生和实现它。 创建自己的 MOF 并包括所有相关提供程序 MOF。 然后,为提供程序将实现的每个基类创建派生类。 请务必为类选择唯一前缀。 例如,名为“Contoso Storage Inc.”的公司 可以使用 CONTOSO_* 或 CSI_* 为其类添加前缀。 例如,对于MSFT_StorageProvider,前缀“CONTOSO_”将产生CONTOSO_StorageProvider。 类现在应如下所示:

    class CONTOSO_StorageProvider : MSFT_StorageProvider
    {
        ...
    }

创建这些主干类后,必须复制计划实现的方法的所有方法声明。 未复制的所有方法(无论是否实现)都将返回MI_RESULT_NOT_SUPPORTED。 无需复制类属性。 若要最大程度地减少 MOF 编译错误,请保留方法和参数的所有限定符。

最后,请务必在 MOF 开头包含以下行:

    #pragma include("storagewmi_provider.mof")
    #pragma include("msft_qualifiers.mof")

完成步骤 1 后,现在即可使用 Convert-MofToProvider.exe 生成提供程序存根。 向此命令提供输入时,请务必仅指定派生类。 基类的标头是隐式生成的。

请参阅 SMP 示例 MOF

提供程序框架生成

SMP 开发人员可以使用 WMI SDK 中的Convert-MofToProvider.exe工具生成提供程序框架项目。 此项目包括预填充了 WMI 提供程序方法的标头和 C 源文件的列表。 通过为这些方法提供实现,开发人员可以为其存储硬件提供支持。

将所有 MOF 从“开发资源清单”部分和创建的 MOF 放入一个文件夹中。 接下来,在命令提示符中使用以下命令生成提供程序框架(请参阅有关最新更新选项的帮助文本):

    Convert-MofToProvider.exe
        -MofFile <path to your provider mof>
        -ClassList <list of ALL classes listed in your mof, space separated>
        -IncludePath <path to qualifiers.mof and CIM_Error.mof>
        -SkipQualifiers
        -SkipLocalize

最后,将 mi.h 头文件包含在开发项目中。

StorageProvider、StorageSubSystem 和 VirtualDisk 是必需类。 根据存储阵列、StoragePool、ResiliencSetting、PhysicalDisk、MaskingSet、InitiatorId、TargetPort、TargetPortal、OffloadDataTransferSetting 和 StorageJob 的功能是可选的。

为了简化开发和测试过程,建议的实现顺序如下:

  1. EnumerateInstances:支持所需类 StorageProvider、StorageSubSystem、VirtualDisk 的基本查询。
  2. GetInstance:许多 WMI 操作(包括方法调用)都需要 GetInstance。
  3. 创建*/DeleteObject:为提供程序支持的对象实现所有创建和删除方法。
  4. 对象关联:关联允许在数组对象之间快速轻松地遍历。 实现需要枚举Instances、AssociatorsOf 和 AssociatorsOf 和 Associator 类上的 ReferencesOf。 不需要关联器上的 GetInstance,但源对象和目标对象的 GetInstance 是必需的。
  5. 指示:指示允许提供商通知管理应用程序有关更改的信息。
  6. 方法的余数。

提供程序注册

启动命令提示符。 使用以下命令注册提供商:

    Register-CimProvider.exe 
    –Namespace root\Microsoft\Windows\Storage\Providers
    –ProviderName <name of your provider>
    –Path <path to your provider’s dll file>