PM_COLLECT_PROC função de retorno de chamada (winperf.h)
Coleta os dados de desempenho e os retorna ao consumidor. Implemente e exporte essa função se você estiver escrevendo uma DLL de desempenho para fornecer dados de desempenho. O sistema chama essa função sempre que um consumidor consulta o registro em busca de dados de desempenho.
A função CollectPerformanceData é um espaço reservado para o nome da função definida pelo aplicativo.
Sintaxe
PM_COLLECT_PROC PmCollectProc;
DWORD PmCollectProc(
LPWSTR pValueName,
void **ppData,
DWORD *pcbTotalBytes,
DWORD *pNumObjectTypes
)
{...}
Parâmetros
pValueName
ppData
pcbTotalBytes
pNumObjectTypes
Valor retornado
Um dos seguintes valores:
Código de retorno | Descrição |
---|---|
ERROR_MORE_DATA | O tamanho do buffer pData (em que pData se refere ao ponteiro apontado por lppData) conforme especificado por lpcbTotalBytes não é grande o suficiente para armazenar os dados. Deixe pData inalterado e defina lpcbTotalBytes e lpNumObjectTypes como zero. Nenhuma tentativa é feita para indicar o tamanho do buffer necessário, pois isso pode ser alterado antes da próxima chamada. |
ERROR_SUCCESS | Retorne esse valor em todos os casos diferentes do caso ERROR_MORE_DATA , mesmo que nenhum dado seja retornado ou ocorra um erro. Para relatar erros diferentes do tamanho insuficiente do buffer, use o Log de Eventos do Aplicativo. |
Comentários
Se os objetos solicitados especificados no parâmetro lpValueName não corresponderem a nenhum dos índices de objeto aos quais a DLL de desempenho dá suporte, deixe o parâmetro pData inalterado (em que pData se refere ao ponteiro apontado por lppData) e defina os parâmetros lpcbTotalBytes e lpNumObjectTypes como zero. Isso indica que nenhum dado foi retornado.
Se você der suporte a um ou mais dos objetos consultados, determine se o tamanho do buffer pData conforme especificado por lpcbTotalBytes é grande o suficiente para armazenar os dados. Caso contrário, deixe pData inalterado e defina lpcbTotalBytes e lpNumObjectTypes como zero. Nenhuma tentativa é feita para indicar o tamanho do buffer necessário, pois isso pode mudar antes da próxima chamada. Retornar ERROR_MORE_DATA.
Se a coleta de dados for demorada, você deverá responder apenas a consultas para objetos específicos ou consultas dispendiosas. Você também deve reduzir a prioridade do thread que coleta os dados, para que eles não afetem negativamente o desempenho do sistema. Para o formato de cadeia de caracteres de consulta, consulte Usando as funções do Registro para consumir dados de contador.
Se o consumidor estiver em execução em outro computador (remotamente), as funções OpenPerformanceData, ClosePerformanceData e CollectPerformanceData serão chamadas no contexto do processo winlogon, que manipula o lado do servidor da conexão remota. Essa distinção é importante ao solucionar problemas que ocorrem apenas remotamente.
Depois que a função retornar com êxito, o sistema poderá executar alguns testes básicos para garantir a integridade dos dados. Por padrão, nenhum teste é executado. Se um teste falhar, o sistema gerará uma mensagem de log de eventos e os dados serão descartados para evitar problemas adicionais devido a ponteiros que não são válidos. O seguinte valor do Registro controla o nível de teste: HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Perflib\ExtCounterTestLevel
.
Veja a seguir os possíveis níveis de teste para ExtCounterTestLevel.
Nível | Significado |
---|---|
1 | Teste os ponteiros e buffers de DLLs de contador confiável. Envia uma cópia do buffer do usuário. |
2 | Testar ponteiros e comprimentos de buffer, mas não testa referências de ponteiro ou conteúdo do buffer. Envia uma cópia do buffer do usuário. |
3 | Não teste ponteiros ou buffers. Envia uma cópia do buffer do usuário. |
4 | Não teste ponteiros ou buffers. Envia o buffer do usuário, não uma cópia. Esse é o valor padrão. |
Os seguintes testes são executados nos níveis 1 e 2:
- Verifica se o valor de lpcbTotalBytes é consistente com o ponteiro de buffer retornado, pData. Se você adicionar o valor lpcbTotalBytes ao ponteiro de buffer original passado para essa função, deverá acabar com o mesmo ponteiro de buffer retornado por essa função. Se eles não forem iguais, uma mensagem de erro será registrada e os dados serão ignorados.
- Verifique se um estouro de buffer não ocorreu. O sistema adiciona uma página de proteção de 1 KB antes e depois do buffer alocado pelo consumidor. Se o ponteiro de buffer retornado, pData, apontar para além do primeiro byte da página de proteção acrescentada, supõe-se que o buffer não é válido e os dados são ignorados. Se o ponteiro do buffer exceder o final do buffer, mas não o final da página de proteção, um erro de estouro de buffer será registrado. Se o ponteiro do buffer estiver além do final da página de proteção, um erro de heap será registrado porque o heap do qual o buffer foi alocado pode ter sido corrompido, causando outros erros de memória.
- Verifique se as páginas de proteção não foram corrompidas. As páginas de proteção de 1 KB que foram adicionadas antes e depois do buffer são inicializadas com um padrão de dados antes que essa função seja chamada. Esse padrão de dados é verificado após o retorno do procedimento de coleta. Se alguma discrepância for detectada, um estouro de buffer ou outro erro de memória será assumido e os dados serão ignorados.
Os seguintes testes serão executados somente se o nível de teste 1 for usado:
- Verifique se a soma do membro TotalByteLength de cada objeto é igual ao valor de lpcbTotalBytes. Caso contrário, os dados serão ignorados.
- Verifique se o membro ByteLength de cada instância é consistente. Os comprimentos serão consistentes se o próximo objeto ou fim do buffer seguir a última instância. Caso contrário, os dados serão ignorados.
Exemplos
Consulte Implementando CollectPerformanceData.
Requisitos
Requisito | Valor |
---|---|
Cliente mínimo com suporte | Windows XP [somente aplicativos da área de trabalho] |
Servidor mínimo com suporte | Windows Server 2003 [somente aplicativos da área de trabalho] |
Plataforma de Destino | Windows |
Cabeçalho | winperf.h |