Função PcwRegister (wdm.h)
A PcwRegister
função cria um novo registro de contador. A maioria dos desenvolvedores usará uma função RegisterXxx gerada por CTRPP em vez de chamar essa função diretamente.
Sintaxe
NTSTATUS PcwRegister(
[out] PPCW_REGISTRATION *Registration,
[in] PPCW_REGISTRATION_INFORMATION Info
);
Parâmetros
[out] Registration
Um ponteiro para um PPCW_REGISTRATION. Recebe o identificador para o novo registro. O registro deve ser fechado usando PcwUnregister.
[in] Info
Um ponteiro para uma estrutura PCW_REGISTRATION_INFORMATION que contém os detalhes sobre o contador que está sendo registrado.
Retornar valor
PcwRegister
retorna um dos seguintes valores:
Código de retorno | Descrição |
---|---|
STATUS_SUCCESS |
O contador é registrado com êxito. |
STATUS_INTEGER_OVERFLOW |
O número de contadores expostos por esse registro excede o máximo de suporte. |
STATUS_NO_MEMORY |
Não há espaço suficiente disponível para alocar memória para os contadores. |
STATUS_INVALID_PARAMETER_2 |
Um problema foi encontrado no Info parâmetro . Veja abaixo algumas causas possíveis. |
PcwRegister
pode retornar STATUS_INVALID_PARAMETER_2
nos seguintes casos:
O
Info->Name->Length
campo é 0 ou não é um múltiplo desizeof(WCHAR)
.O
Info->Version
campo não corresponde a um valor com suporte para esta versão do Windows. Ao ser executado no Windows antes da 10.0.19645 (NTDDI_VERSION < NTDDI_VERSION_MN
), oVersion
campo deve ser definido como PCW_VERSION_1 (0x100). Ao executar no Windows 10.0.19645 e posterior (NTDDI_VERSION >= NTDDI_VERSION_MN
), isso pode ser definido como PCW_VERSION_1 (0x100) ou PCW_VERSION_2 (0x200).O
Info->Flags
campo contém um valor não reconhecido pela versão em execução do Windows.
Comentários
O provedor chama essa função para criar um novo registro de contador. Todos os argumentos de entrada são capturados para que o chamador não precise manter uma cópia deles.
Por padrão, o novo contador é visível apenas para o silo do servidor que estava ativo no momento do registro (ou seja PcwRegister
, associa o registro recém-criado ao silo do servidor que foi anexado ao thread quando PcwRegister
é chamado). Se estiver em execução no Windows 10.0.19645 e posterior (NTDDI_VERSION >= NTDDI_VERSION_MN
) você poderá criar um registro de contador visível para todos os silos do servidor definindo PCW_REGISTRATION_INFORMATION::Version
como PCW_VERSION_2
e definindo PCW_REGISTRATION_INFORMATION::Flags
como PcwRegistrationSiloNeutral
.
Função RegisterXxx gerada por CTRPP
A maioria dos desenvolvedores não precisa chamar PcwRegister
diretamente. Em vez disso, eles compilarão um manifesto com a ferramenta CTRPP e usarão a função RegisterXxx do cabeçalho gerado por CTRPP. A função gerada terá esta aparência:
EXTERN_C FORCEINLINE NTSTATUS
RegisterMyCounterset(
__in_opt PPCW_CALLBACK Callback,
__in_opt PVOID CallbackContext
)
{
PCW_REGISTRATION_INFORMATION RegInfo;
PAGED_CODE();
InitRegistrationInformationMyCounterset(Callback, CallbackContext, &RegInfo);
return PcwRegister(&MyCounterset, &RegInfo);
}
A função Registro gerada por CTRPP será chamadade Prefix Register Counterset. O prefixo geralmente está em branco, mas pode estar presente se o -prefix
parâmetro tiver sido usado na linha de comando CTRPP. Counterset é o nome do contador, conforme especificado no manifesto. A função Register gerada invocará a função PrefixInitRegistrationInformationCounterset para inicializar uma PCW_REGISTRATION_INFORMATION
estrutura e, em seguida, invocará PcwRegister
para criar um novo registro e armazenará o identificador na variável Counterset global (declarada no cabeçalho gerado por CTRPP, MyCounterset
no exemplo).
Em alguns casos, a função Adicionar gerada por CTRPP pode não ser apropriada.
Se você precisar compilar com
NTDDI_VERSION >= NTDDI_VERSION_FE
, mas precisar ser executado em versões anteriores do Windows, a função Registrar gerada pelo CTRPP não funcionará porque defineRegInfo.Version = PCW_CURRENT_VERSION
. QuandoNTDDI_VERSION >= NTDDI_VERSION_FE
,PCW_CURRENT_VERSION
será definido comoPCW_VERSION_2
, causando o retorno dePcwRegister
um erro.Se você precisar dar suporte a vários registros de contraconjunto (por exemplo, para dar suporte a um registro separado por silo de servidor), a função Registrar gerada por CTRPP não funcionará porque armazenará o identificador retornado em uma variável global.
Se você quiser criar um registro de contraconjunto neutro de silo, a função Registrar gerada por CTRPP não funcionará porque não há como alterar o valor de antes de
RegInfo.Flags
chamarPcwRegister
.
Nesses casos, use código como o seguinte em vez de chamar a função Registro gerada pelo CTRPP:
PCW_REGISTRATION_INFORMATION RegInfo;
InitRegistrationInformationMyCounterset(Callback, CallbackContext, &RegInfo);
// Modify RegInfo as needed,
// e.g. RegInfo.Version = PCW_VERSION_1,
// or RegInfo.Flags = PcwRegistrationSiloNeutral.
// If needed, use another variable to store the handle instead of MyCounterset.
Status = PcwRegister(&MyCounterset, &RegInfo);
A função InitRegistrationInformationXxxx gerada por CTRPP inicializa a RegInfo
estrutura com base em declarações do manifesto. Para obter mais informações sobre a função InitRegistrationInformation gerada, consulte a documentação para PCW_REGISTRATION_INFORMATION.
Se estiver usando suas próprias variáveis de identificador em vez de Counterset para armazenar o identificador, talvez você também precise chamar PcwUnregister
e PcwCreateInstance
diretamente em vez de usar as funções UnregisterXxx e CreateXxx geradas por CTRPP.
Requisitos
Requisito | Valor |
---|---|
Cliente mínimo com suporte | Disponível no Windows 7 e versões posteriores do Windows. |
Plataforma de Destino | Universal |
Cabeçalho | wdm.h (inclua Wdm.h, Ntddk.h) |
Biblioteca | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | IRQL <= APC_LEVEL |