Поделиться через


функция обратного вызова PM_COLLECT_PROC (winperf.h)

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

Функция CollectPerformanceData — это заполнитель для имени функции, определяемой приложением.

Синтаксис

PM_COLLECT_PROC PmCollectProc;

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

Параметры

pValueName

ppData

pcbTotalBytes

pNumObjectTypes

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

Принимает одно из следующих значений:

Код возврата Описание
ERROR_MORE_DATA Размер буфера pData (где pData ссылается на указатель, на который указывает lppData), как указано в lpcbTotalBytes , недостаточно велик для хранения данных. Оставьте pData без изменений и задайте для lpcbTotalBytes и lpNumObjectTypes значение 0. Попытка указать требуемый размер буфера не выполняется, так как это может измениться перед следующим вызовом.
ERROR_SUCCESS Это значение возвращается во всех случаях, кроме ERROR_MORE_DATA , даже если данные не возвращаются или возникает ошибка. Чтобы сообщить об ошибках, отличных от недостаточного размера буфера, используйте журнал событий приложений.

Комментарии

Если запрошенные объекты, указанные в параметре lpValueName , не соответствуют ни одному из индексов объектов, поддерживаемых библиотекой DLL производительности, оставьте параметр pData без изменений (где pData ссылается на указатель, на который указывает lppData), и задайте для параметров lpcbTotalBytes и lpNumObjectTypes значение 0. Это означает, что данные не были возвращены.

Если поддерживается один или несколько запрашиваемых объектов, определите, достаточно ли размер буфера pData , как указано в lpcbTotalBytes , для хранения данных. В противном случае оставьте pData без изменений и задайте для lpcbTotalBytes и lpNumObjectTypes значение 0. Попытка указать требуемый размер буфера не выполняется, так как это может измениться перед следующим вызовом. Возврат ERROR_MORE_DATA.

Если сбор данных занимает много времени, следует отвечать только на запросы определенных объектов или на дорогостоящие запросы. Кроме того, следует снизить приоритет потока, собирающего данные, чтобы он не влиял на производительность системы. Формат строки запроса см. в разделе Использование функций реестра для использования данных счетчика.

Если потребитель выполняется на другом компьютере (удаленно), то функции OpenPerformanceData, ClosePerformanceData и CollectPerformanceData вызываются в контексте процесса Winlogon, который обрабатывает удаленное подключение на стороне сервера. Это различие важно при устранении неполадок, возникающих только удаленно.

После успешного возврата функции система может выполнить некоторые базовые тесты для обеспечения целостности данных. По умолчанию тесты не выполняются. Если тест завершается сбоем, система создает сообщение журнала событий, и данные удаляются, чтобы предотвратить дальнейшие проблемы из-за недопустимых указателей. Следующее значение реестра управляет уровнем тестирования: HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Perflib\ExtCounterTestLevel.

Ниже приведены возможные уровни тестирования для ExtCounterTestLevel.

Level Значение
1 Проверьте указатели и буферы доверенных библиотек DLL счетчиков. Отправляет копию буфера пользователя.
2 Тестирует указатели и длину буфера, но не проверяет ссылки на указатели или содержимое буфера. Отправляет копию буфера пользователя.
3 Не проверяйте указатели или буферы. Отправляет копию буфера пользователя.
4 Не проверяйте указатели или буферы. Отправляет буфер пользователя, а не копию. Это значение по умолчанию.

Следующие тесты выполняются на уровнях 1 и 2:

  • Проверяет, согласуется ли значение lpcbTotalBytes с возвращенным указателем буфера pData. При добавлении значения lpcbTotalBytes к исходному указателю буфера, переданному в эту функцию, вы должны получить тот же указатель буфера, возвращенный этой функцией. Если они не совпадают, регистрируется сообщение об ошибке, а данные игнорируются.
  • Убедитесь, что переполнение буфера не произошло. Система добавляет страницу защиты размером 1 КБ до и после буфера, выделенного потребителем. Если возвращаемый указатель буфера pData указывает на первый байт добавленной страницы защиты, то предполагается, что буфер недопустим и данные игнорируются. Если указатель буфера превышает конец буфера, но не конец страницы защиты, то регистрируется ошибка переполнения буфера. Если указатель буфера находится после конца страницы защиты, то регистрируется ошибка кучи, так как куча, из которых был выделен буфер, могла быть повреждена, что привело к другим ошибкам памяти.
  • Убедитесь, что страницы защиты не повреждены. Страницы защиты размером 1 КБ, добавленные до и после буфера, инициализируются с помощью шаблона данных перед вызовом этой функции. Этот шаблон данных проверяется после возврата процедуры сбора. При обнаружении какого-либо несоответствия предполагается переполнение буфера или другая ошибка памяти, и данные игнорируются.

Следующие тесты выполняются только в том случае, если используется уровень теста 1:

  • Убедитесь, что сумма элемента TotalByteLength каждого объекта совпадает со значением lpcbTotalBytes. В противном случае данные игнорируются.
  • Убедитесь, что член ByteLength каждого экземпляра является согласованным. Длина совпадает, если следующий объект или конец буфера следует за последним экземпляром. В противном случае данные игнорируются.

Примеры

См. раздел Реализация CollectPerformanceData.

Требования

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

См. также раздел