PM_COLLECT_PROC función de devolución de llamada (winperf.h)

Recopila los datos de rendimiento y los devuelve al consumidor. Implemente y exporte esta función si está escribiendo un archivo DLL de rendimiento para proporcionar datos de rendimiento. El sistema llama a esta función cada vez que un consumidor consulta el Registro para obtener datos de rendimiento.

La función CollectPerformanceData es un marcador de posición para el nombre de la función definida por la aplicación.

Sintaxis

PM_COLLECT_PROC PmCollectProc;

DWORD PmCollectProc(
                 LPWSTR pValueName,
                 void **ppData,
                 DWORD *pcbTotalBytes,
                 DWORD *pNumObjectTypes
)
{...}

Parámetros

pValueName

ppData

pcbTotalBytes

pNumObjectTypes

Valor devuelto

Uno de los siguientes valores:

Código devuelto Descripción
ERROR_MORE_DATA El tamaño del búfer de pData (donde pData hace referencia al puntero al que apunta lppData) según lo especificado por lpcbTotalBytes no es lo suficientemente grande como para almacenar los datos. Deje pData sin cambios y establezca lpcbTotalBytes y lpNumObjectTypes en cero. No se intenta indicar el tamaño de búfer necesario, ya que esto puede cambiar antes de la siguiente llamada.
ERROR_SUCCESS Devuelve este valor en todos los casos distintos del ERROR_MORE_DATA caso, incluso si no se devuelven datos o se produce un error. Para notificar errores distintos del tamaño de búfer insuficiente, use el registro de eventos de la aplicación.

Comentarios

Si los objetos solicitados especificados en el parámetro lpValueName no corresponden a ninguno de los índices de objeto que admite el archivo DLL de rendimiento, deje el parámetro pData sin cambios (donde pData hace referencia al puntero al que apunta lppData) y establezca los parámetros lpcbTotalBytes y lpNumObjectTypes en cero. Esto indica que no se devolvió ningún dato.

Si admite uno o varios de los objetos consultados, determine si el tamaño del búfer pData especificado por lpcbTotalBytes es lo suficientemente grande como para almacenar los datos. Si no es así, deje pData sin cambios y establezca lpcbTotalBytes y lpNumObjectTypes en cero. No se intenta indicar el tamaño de búfer necesario, ya que esto puede cambiar antes de la siguiente llamada. Devuelve ERROR_MORE_DATA.

Si la recopilación de datos consume mucho tiempo, solo debe responder a las consultas de objetos específicos o a consultas costosas. También debe reducir la prioridad del subproceso que recopila los datos, de modo que no afecte negativamente al rendimiento del sistema. Para obtener el formato de cadena de consulta, consulte Uso de las funciones del Registro para consumir datos de contador.

Si el consumidor se ejecuta en otro equipo (de forma remota), se llama a las funciones OpenPerformanceData, ClosePerformanceData y CollectPerformanceData en el contexto del proceso de Winlogon, que controla el lado servidor de la conexión remota. Esta distinción es importante al solucionar problemas que solo se producen de forma remota.

Una vez que la función se devuelve correctamente, el sistema puede realizar algunas pruebas básicas para garantizar la integridad de los datos. De forma predeterminada, no se realizan pruebas. Si se produce un error en una prueba, el sistema genera un mensaje de registro de eventos y los datos se descartan para evitar problemas adicionales debido a punteros que no son válidos. El siguiente valor del Registro controla el nivel de prueba: HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Perflib\ExtCounterTestLevel.

A continuación se muestran los posibles niveles de prueba para ExtCounterTestLevel.

Nivel Significado
1 Pruebe los punteros y búferes de archivos DLL de contadores de confianza. Envía una copia del búfer del usuario.
2 Punteros de prueba y longitudes de búfer, pero no prueba las referencias de puntero ni el contenido del búfer. Envía una copia del búfer del usuario.
3 No pruebe punteros ni búferes. Envía una copia del búfer del usuario.
4 No pruebe punteros ni búferes. Envía el búfer del usuario, no una copia. Este es el valor predeterminado.

Las siguientes pruebas se realizan en los niveles 1 y 2:

  • Comprueba que el valor de lpcbTotalBytes es coherente con el puntero de búfer devuelto, pData. Si agrega el valor lpcbTotalBytes al puntero de búfer original pasado a esta función, debería terminar con el mismo puntero de búfer devuelto por esta función. Si no son iguales, se registra un mensaje de error y se omiten los datos.
  • Compruebe que no se ha producido una saturación del búfer. El sistema agrega una página de protección de 1 KB antes y después del búfer asignado por el consumidor. Si el puntero de búfer devuelto, pData, apunta más allá del primer byte de la página de protección anexada, se supone que el búfer no es válido y se omiten los datos. Si el puntero del búfer supera el final del búfer, pero no el final de la página de protección, se registra un error de saturación del búfer. Si el puntero del búfer está más allá del final de la página de protección, se registra un error de montón porque el montón desde el que se asignó el búfer podría haberse dañado, lo que provoca otros errores de memoria.
  • Compruebe que las páginas de protección no se han dañado. Las páginas de protección de 1 KB que se agregaron antes y después del búfer se inicializan con un patrón de datos antes de llamar a esta función. Este patrón de datos se comprueba después de que se devuelva el procedimiento de recopilación. Si se detecta alguna discrepancia, se asume un error de saturación del búfer u otro error de memoria y se omiten los datos.

Las siguientes pruebas solo se realizan si se usa el nivel de prueba 1:

  • Compruebe que la suma del miembro TotalByteLength de cada objeto es la misma que el valor de lpcbTotalBytes. Si no es así, se omiten los datos.
  • Compruebe que el miembro ByteLength de cada instancia es coherente. Las longitudes son coherentes si el siguiente objeto o final del búfer sigue la última instancia. Si no es así, se omiten los datos.

Ejemplos

Consulte Implementación de CollectPerformanceData.

Requisitos

Requisito Value
Cliente mínimo compatible Windows XP [solo aplicaciones de escritorio]
Servidor mínimo compatible Windows Server 2003 [solo aplicaciones de escritorio]
Plataforma de destino Windows
Encabezado winperf.h

Consulte también