Desenvolvimento do SMP
Um provedor WMI
As interfaces do Provedor de Gerenciamento de Armazenamento (SMP) são baseadas em WMI. Embora você possa escrever um SMP usando o WMI v1, é altamente recomendável que você escreva um provedor WMI v2 usando C/C++. Não recomendamos usar o .NET Framework para desenvolvimento SMP porque algumas funcionalidades importantes podem não estar disponíveis por meio da plataforma .NET. Além disso:
- O WMI v1 tem uma forte dependência do COM, o que pode ser difícil e demorado de aprender.
- O WMI v2 se alinha mais com os padrões do setor do que o WMI v1; O WMI v2 usa WS-Management em vez de DCOM.
- Os provedores podem utilizar melhor erro/evento no WMI v2.
- Os provedores podem utilizar extensões e integração do PowerShell no WMI v2.
Lista de verificação de recursos de desenvolvimento
Item | Location | Observação |
---|---|---|
Arquivos MOF de classe base: Storagewmi_provider.mof e todos os arquivos MOF que começam com "msft_" no nome do arquivo. | Windows Software Development Kit (SDK) | Em %SDK_Installed_Location%\Windows Kits\x.x\Include\um |
Outros arquivos MOF necessários: qualifiers.mof e CIM_Error.mof | Força-Tarefa de Gerenciamento Distribuído: http://dmtf.org/standards/cim | Esses arquivos não são definidos pela Microsoft. |
Arquivo de cabeçalho: mi.h | SDK do Windows | Em %SDK_Installed_Location%\Windows Kits\x.x\Include\um |
Ferramenta de geração de esqueleto do provedor e arquivo .dll: Convert-MofToProvider.exe | SDK do Windows | Em %SDK_Installed_Location%\Windows Kits\x.x\bin\x64\ ou ...\bin\x86 |
Ferramenta de registro do provedor: Register-CimProvider.exe | %OS_Install_Path%\Windows\System32\ |
Definição de MOF
O desenvolvimento inicial do SMP é feito em três etapas simples:
- Estenda o MOF do provedor.
- Gere um esqueleto de provedor (ou stubs).
- Implementar stubs.
Estendendo o MOF do provedor
Os MOFs do SMP estão localizados na pasta de inclusão do SDK do Windows. Eles são prefixados com MSFT_*. Copie esses arquivos para o diretório de desenvolvimento, juntamente com CIM_Error.mof e qualifiers.mof. Cada MOF define uma ou mais classes abstratas que formam a base para o SMP.
Semelhante a outras linguagens, uma classe abstrata não pode ser implementada diretamente. Ele deve ser derivado e implementado em uma classe de implementação separada. Crie seu próprio MOF e inclua todos os MOFs de provedores relevantes. Em seguida, crie uma classe derivada para cada uma das classes base que seu provedor implementará. Certifique-se de escolher um prefixo exclusivo para suas aulas. Por exemplo, uma empresa chamada "Contoso Storage Inc." podem prefixar suas classes com CONTOSO_* ou CSI_*. Por exemplo, por MSFT_StorageProvider, um prefixo de "CONTOSO_" produziria CONTOSO_StorageProvider. A classe deverá se parecer agora com o seguinte:
class CONTOSO_StorageProvider : MSFT_StorageProvider
{
...
}
Depois de criar essas classes de esqueleto, você deve copiar todas as declarações de método para os métodos que planeja implementar. Todos os métodos que não são copiados (independentemente de implementados ou não) retornarão MI_RESULT_NOT_SUPPORTED. Você não precisa copiar as propriedades da classe. Para minimizar erros de compilação do MOF, mantenha todos os qualificadores dos métodos e parâmetros.
Por fim, certifique-se de incluir estas linhas no início do seu MOF:
#pragma include("storagewmi_provider.mof")
#pragma include("msft_qualifiers.mof")
Ao concluir a Etapa 1, você estará pronto para gerar os stubs do provedor usando Convert-MofToProvider.exe. Ao fornecer entrada para esse comando, certifique-se de especificar apenas as classes derivadas. Os cabeçalhos das classes base são gerados implicitamente.
Consulte MOFs de exemplo de SMP.
Geração de esqueleto do provedor
Os desenvolvedores do SMP podem usar a ferramenta Convert-MofToProvider.exe do SDK do WMI para gerar um projeto de esqueleto de provedor. Este projeto inclui uma lista de arquivos de origem C e de cabeçalho pré-preenchidos com métodos de provedor WMI. Ao fornecer implementações para esses métodos, os desenvolvedores podem fornecer suporte ao hardware de armazenamento.
Coloque todos os MOFs da seção "Lista de verificação de recursos de desenvolvimento" e os MOFs que você criou em uma pasta. Em seguida, use o seguinte comando em um prompt de comando para gerar o esqueleto do provedor (consulte o texto de ajuda para obter as opções mais atualizadas até a data):
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
Por fim, inclua o arquivo de cabeçalho mi.h em seu projeto de desenvolvimento.
Sequência de desenvolvimento recomendada
StorageProvider, StorageSubSystem e VirtualDisk são classes obrigatórias. Dependendo dos recursos da matriz de armazenamento, StoragePool, ResiliencSetting, PhysicalDisk, MaskingSet, InitiatorId, TargetPort, TargetPortal, OffloadDataTransferSetting e StorageJob são opcionais.
Para facilitar o processo de desenvolvimento e teste, segue uma sequência recomendada de implementação:
- EnumerateInstances: dê suporte a consultas básicas para as classes necessárias StorageProvider, StorageSubSystem, VirtualDisk.
- GetInstance: GetInstance é necessário para muitas operações WMI, incluindo invocação de método.
- Create*/DeleteObject: implemente todos os métodos de criação e exclusão para os objetos compatíveis com o provedor.
- Associações de objetos: As associações permitem uma travessia rápida e fácil entre os objetos da matriz. EnumerateInstances, AssociatorsOf e ReferencesOf na classe associadora são necessários para implementação. GetInstance no associador não é necessário, mas GetInstance nos objetos de origem e destino são.
- Indicações: As indicações permitem que seu provedor notifique os aplicativos de gerenciamento sobre uma alteração.
- Restante dos métodos.
Registro do provedor
Inicie um prompt de comando. Registre seu provedor com o seguinte comando:
Register-CimProvider.exe
–Namespace root\Microsoft\Windows\Storage\Providers
–ProviderName <name of your provider>
–Path <path to your provider’s dll file>