Función de devolución de llamada PERFLIBREQUEST (perflib.h)

Los proveedores pueden implementar esta función para recibir notificaciones cuando los consumidores realizan determinadas acciones, como agregar o quitar contadores de una consulta. PERFLIB llama a la devolución de llamada antes de que se complete la solicitud del consumidor.

El tipo PERFLIBREQUEST define un puntero a esta función de devolución de llamada. La función ControlCallback es un marcador de posición para el nombre de la función definida por la aplicación.

Sintaxis

PERFLIBREQUEST Perflibrequest;

ULONG Perflibrequest(
  [in] ULONG RequestCode,
  [in] PVOID Buffer,
  [in] ULONG BufferSize
)
{...}

Parámetros

[in] RequestCode

El código de solicitud puede ser uno de los valores siguientes.

Valor Significado
PERF_ADD_COUNTER
El consumidor agrega un contador a la consulta. PERFLIB llama a la devolución de llamada con este código de solicitud para cada contador que se agrega a la consulta. El parámetro Buffer contiene una estructura PERF_COUNTER_IDENTITY que identifica el contador que se va a agregar.

Los proveedores pueden usar esta notificación para empezar a contar.

PERF_REMOVE_COUNTER
El consumidor quita un contador de la consulta. PERFLIB llama a la devolución de llamada con este código de solicitud para cada contador que se quita de la consulta. El parámetro Buffer contiene una estructura PERF_COUNTER_IDENTITY que identifica el contador que se va a quitar.

Los proveedores pueden usar esta notificación para dejar de contar.

PERF_ENUM_INSTANCES
El consumidor enumera instancias del conjunto de contadores. El parámetro Buffer contiene una cadena Unicode terminada en null que identifica el nombre del equipo (o su dirección IP) desde la que el consumidor enumera las instancias.
PERF_COLLECT_START
El consumidor empieza a recopilar datos de contadores. El parámetro Buffer contiene una cadena Unicode terminada en null que identifica el nombre del equipo (o su dirección IP) del que el consumidor está recopilando datos.

Los proveedores pueden usar esta notificación si el estado de datos sin procesar es crítico (por ejemplo, contadores relacionados con transacciones en los que no se permiten actualizaciones parciales). Esta notificación ofrece al proveedor la posibilidad de vaciar todas las actualizaciones pendientes y bloquear las futuras actualizaciones antes de que comience la recopilación.

PERF_COLLECT_END
La recopilación de datos del contador está completa. El parámetro Buffer contiene una cadena Unicode terminada en null que identifica el nombre del equipo (o su dirección IP) de la que el consumidor recopiló los datos.

Los proveedores pueden usar esta notificación para liberar el bloqueo de actualización impuesto por la notificación de inicio de la recopilación para que se puedan reanudar las actualizaciones de los datos del contador.

[in] Buffer

El contenido del búfer depende de la solicitud. Para obtener contenido posible, consulte el parámetro RequestCode .

[in] BufferSize

Tamaño, en bytes, del parámetro Buffer .

Valor devuelto

Devuelve ERROR_SUCCESS si la devolución de llamada se realiza correctamente.

Si se produce un error en la devolución de llamada, PERFLIB devolverá el código de error al consumidor si la solicitud es PERF_ADD_COUNTER, PERF_ENUM_INSTANCES o PERF_COLLECT_START; de lo contrario, se omite el código de error.

Comentarios

Si el atributo de devolución de llamada del elemento provider es "personalizado" o usó el argumento -NotificationCallback al llamar a CTRPP, debe implementar esta función. Pase el nombre de la función de devolución de llamada a CounterInitialize.

Windows Vista: La función CounterInitialize se denomina PerfAutoInitialize. La herramienta CTRPP también genera un esqueleto de esta devolución de llamada que incluye todos los códigos de solicitud. A continuación, agregue código a los códigos de solicitud que desea admitir y quite los demás.

La devolución de llamada debe completarse en un segundo. Si la devolución de llamada no se completa a tiempo, PERFLIB continúa con la solicitud del consumidor y omite el valor devuelto de la devolución de llamada cuando se completa.

Ejemplos

En el ejemplo siguiente se muestra una implementación sencilla de una función ControlCallback .

ULONG MyControlCallback(ULONG RequestCode, PVOID pBuffer, ULONG* pBufferSize)
{
    ULONG Status = ERROR_SUCCESS;
    PWNODE_HEADER Wnode = (PWNODE_HEADER)pBuffer;
    LPWSTR pComputerName = NULL;
    LPWSTR pInstance = NULL;
    PPERF_COUNTER_IDENTITY pCounter;
    UNREFERENCED_PARAMETER(pBufferSize);

    switch (RequestCode) 
    {
        case PERF_ADD_COUNTER:
            pCounter = (PPERF_COUNTER_IDENTITY)(((LPBYTE) Wnode) + sizeof(WNODE_HEADER));
            pComputerName = (LPWSTR)(((LPBYTE) pCounter) + pCounter->MachineOffset);
            pInstance = (pCounter->NameOffset > 0) 
                ? (LPWSTR) (((LPBYTE) pCounter) + pCounter->NameOffset) : NULL;
            
            break;

        case PERF_REMOVE_COUNTER: 
            pCounter = (PPERF_COUNTER_IDENTITY)(((LPBYTE) Wnode) + sizeof(WNODE_HEADER));
            pComputerName = (LPWSTR)(((LPBYTE) pCounter) + pCounter->MachineOffset);
            pInstance = (pCounter->NameOffset > 0)
                ? (LPWSTR) (((LPBYTE) pCounter) + pCounter->NameOffset) : NULL;
            
            break;

        case PERF_ENUM_INSTANCES:
            pComputerName = (LPWSTR) (((LPBYTE) Wnode) + sizeof(WNODE_HEADER));
            
            break;

        case PERF_COLLECT_START: 
            pComputerName = (LPWSTR) (((LPBYTE) Wnode) + sizeof(WNODE_HEADER));
            
            break;

        case PERF_COLLECT_END: 
            pComputerName = (LPWSTR) (((LPBYTE) Wnode) + sizeof(WNODE_HEADER));
            
            break;

        default:
            wprintf(L"Unknown request code, %lu\n", RequestCode);
    }

    return Status;
}

Requisitos

Requisito Value
Cliente mínimo compatible Windows Vista [solo aplicaciones de escritorio]
Servidor mínimo compatible Windows Server 2008 [solo aplicaciones de escritorio]
Plataforma de destino Windows
Encabezado perflib.h