Функция обратного вызова PERFLIBREQUEST (perflib.h)

Поставщики могут реализовать эту функцию для получения уведомлений при выполнении потребителями определенных действий, таких как добавление или удаление счетчиков из запроса. PERFLIB вызывает обратный вызов до завершения запроса потребителя.

Тип PERFLIBREQUEST определяет указатель на эту функцию обратного вызова. Функция ControlCallback — это заполнитель для имени определяемой приложением функции.

Синтаксис

PERFLIBREQUEST Perflibrequest;

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

Параметры

[in] RequestCode

Код запроса может иметь одно из следующих значений.

Значение Значение
PERF_ADD_COUNTER
Потребитель добавляет счетчик в запрос. PERFLIB вызывает обратный вызов с этим кодом запроса для каждого счетчика, добавляемого в запрос. Параметр Buffer содержит структуру PERF_COUNTER_IDENTITY , которая определяет добавляемый счетчик.

Поставщики могут использовать это уведомление для начала подсчета.

PERF_REMOVE_COUNTER
Потребитель удаляет счетчик из запроса. PERFLIB вызывает обратный вызов с этим кодом запроса для каждого счетчика, удаляемого из запроса. Параметр Buffer содержит структуру PERF_COUNTER_IDENTITY , которая определяет удаляемый счетчик.

Поставщики могут использовать это уведомление, чтобы остановить подсчет.

PERF_ENUM_INSTANCES
Потребитель перечисляет экземпляры набора счетчиков. Параметр Buffer содержит строку Юникода со значением NULL, которая определяет имя компьютера (или его IP-адрес), с которого потребитель перечисляет экземпляры.
PERF_COLLECT_START
Потребитель начинает собирать данные счетчика. Параметр Buffer содержит строку Юникода, завершающуюся null, которая определяет имя компьютера (или его IP-адрес), с которого потребитель собирает данные.

Поставщики могут использовать это уведомление, если состояние необработанных данных является критическим (например, счетчики, связанные с транзакциями, где частичные обновления не разрешены). Это уведомление дает поставщику возможность очистить все ожидающие обновления и заблокировать будущие обновления до начала сбора.

PERF_COLLECT_END
Сбор данных счетчика завершен. Параметр Buffer содержит строку Юникода со значением NULL, которая определяет имя компьютера (или его IP-адрес), с которого потребитель собирал данные.

Поставщики могут использовать это уведомление, чтобы освободить блокировку обновления, наложенную уведомлением о начале сбора, чтобы обновления данных счетчика могли возобновиться.

[in] Buffer

Содержимое буфера зависит от запроса. Сведения о возможном содержимом см. в параметре RequestCode .

[in] BufferSize

Размер параметра Buffer (в байтах).

Возвращаемое значение

Возвращайте ERROR_SUCCESS, если обратный вызов выполнен успешно.

Если обратный вызов завершается сбоем, PERFLIB вернет код ошибки потребителю, если запрос PERF_ADD_COUNTER, PERF_ENUM_INSTANCES или PERF_COLLECT_START; В противном случае код ошибки игнорируется.

Комментарии

Если атрибут обратного вызова элемента поставщика имеет значение custom или при вызове CTRPP использовался аргумент -NotificationCallback, необходимо реализовать эту функцию. Вы передаете имя функции обратного вызова в CounterInitialize.

Windows Vista: Функция CounterInitialize называется PerfAutoInitialize. Средство CTRPP также создает для вас структуру этого обратного вызова, которая включает все коды запросов. Затем вы добавляете код в коды запросов, которые требуется поддерживать, и удаляете остальные коды.

Обратный вызов должен завершиться в течение одной секунды. Если обратный вызов не завершается вовремя, PERFLIB продолжает выполнение запроса потребителя и игнорирует возвращаемое значение обратного вызова по завершении.

Примеры

В следующем примере показана простая реализация функции 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;
}

Требования

Требование Значение
Минимальная версия клиента Windows Vista [только классические приложения]
Минимальная версия сервера Windows Server 2008 [только классические приложения]
Целевая платформа Windows
Header perflib.h