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 开发通过三个简单的步骤完成:
- 扩展提供程序 MOF。
- 生成提供程序框架(或存根)。
- 实现存根。
扩展提供程序 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 的功能是可选的。
为了简化开发和测试过程,建议的实现顺序如下:
- EnumerateInstances:支持所需类 StorageProvider、StorageSubSystem、VirtualDisk 的基本查询。
- GetInstance:许多 WMI 操作(包括方法调用)都需要 GetInstance。
- 创建*/DeleteObject:为提供程序支持的对象实现所有创建和删除方法。
- 对象关联:关联允许在数组对象之间快速轻松地遍历。 实现需要枚举Instances、AssociatorsOf 和 AssociatorsOf 和 Associator 类上的 ReferencesOf。 不需要关联器上的 GetInstance,但源对象和目标对象的 GetInstance 是必需的。
- 指示:指示允许提供商通知管理应用程序有关更改的信息。
- 方法的余数。
提供程序注册
启动命令提示符。 使用以下命令注册提供商:
Register-CimProvider.exe
–Namespace root\Microsoft\Windows\Storage\Providers
–ProviderName <name of your provider>
–Path <path to your provider’s dll file>