Функция QueryAllTracesA (evntrace.h)
Функция QueryAllTraces извлекает свойства и статистику для всех сеансов трассировки событий, для которых вызывающий объект имеет разрешения на запрос.
Синтаксис
ULONG WMIAPI QueryAllTracesA(
[out] PEVENT_TRACE_PROPERTIES *PropertyArray,
[in] ULONG PropertyArrayCount,
[out] PULONG LoggerCount
);
Параметры
[out] PropertyArray
Массив указателей на EVENT_TRACE_PROPERTIES структуры, которые получают свойства сеанса и статистику для сеансов трассировки событий.
Необходимо задать только элементы Wnode.BufferSize, LoggerNameOffset и LogFileNameOffsetструктуры EVENT_TRACE_PROPERTIES . Все остальные элементы должны иметь нулевое значение.
[in] PropertyArrayCount
Число структур в массиве PropertyArray . Это значение должно быть меньше или равно 64, максимальному количеству сеансов трассировки событий, поддерживаемых трассировкой событий Windows.
Windows 10:PropertyArrayCount может быть больше 64, а некоторые системы могут поддерживать более 64 сеансов трассировки.
[out] LoggerCount
Получает количество трассировок, для которых возвращаются данные. Это может отличаться от фактического числа запущенных сеансов трассировки событий, если вызывающий объект не имеет разрешений на запрос всех сеансов.
Возвращаемое значение
Если функция выполняется успешно, возвращаемое значение будет ERROR_SUCCESS.
Если функция завершается сбоем, возвращаемое значение является одним из кодов системных ошибок. Ниже приведены некоторые распространенные ошибки и их причины.
ERROR_INVALID_PARAMETER
Выполняется одно из следующих условий.
- Значение PropertyArrayCount равно нулю или больше максимального числа поддерживаемых сеансов
- СвойствоArray имеет значение NULL
ERROR_MORE_DATA
Массив свойств слишком мал для получения сведений для всех сеансов (SessionCount больше PropertyArrayCount). Функция заполняет массив свойств количеством структур свойств, указанным в PropertyArrayCount.
Комментарии
Контроллеры трассировки событий вызывают эту функцию.
Эта функция извлекает сеансы трассировки, к которым вызывающий объект имеет разрешения на запрос. Большинство сеансов трассировки могут просматривать пользователи с повышенными правами администратора, пользователи в группе Пользователи журнала производительности и службы, работающие под управлением LocalSystem, LocalService, NetworkService.
Эта функция не возвращает закрытые сеансы ведения журнала.
Чтобы получить сведения для одного сеанса, используйте функцию ControlTrace и задайте для параметра ControlCodeзначение EVENT_TRACE_CONTROL_QUERY.
Примеры
В следующем примере показано, как вызвать эту функцию.
#include <windows.h>
#include <evntrace.h>
#include <vector>
const unsigned MAX_SESSION_NAME_LEN = 1024;
const unsigned MAX_LOGFILE_PATH_LEN = 1024;
const unsigned PropertiesSize =
sizeof(EVENT_TRACE_PROPERTIES) +
(MAX_SESSION_NAME_LEN * sizeof(WCHAR)) +
(MAX_LOGFILE_PATH_LEN * sizeof(WCHAR));
int wmain()
{
ULONG status;
std::vector<EVENT_TRACE_PROPERTIES*> sessions; // Array of pointers to property structures
std::vector<BYTE> buffer; // Buffer that contains all the property structures
ULONG sessionCount; // Actual number of sessions started on the computer
// The size of the session name and log file name used by the
// controllers are not known, therefore create a properties structure that allows
// for the maximum size of both.
try
{
sessionCount = 64; // Start with room for 64 sessions.
do
{
sessions.resize(sessionCount);
buffer.resize(PropertiesSize * sessionCount);
for (size_t i = 0; i != sessions.size(); i += 1)
{
sessions[i] = (EVENT_TRACE_PROPERTIES*)&buffer[i * PropertiesSize];
sessions[i]->Wnode.BufferSize = PropertiesSize;
sessions[i]->LoggerNameOffset = sizeof(EVENT_TRACE_PROPERTIES);
sessions[i]->LogFileNameOffset = sizeof(EVENT_TRACE_PROPERTIES) + (MAX_SESSION_NAME_LEN * sizeof(WCHAR));
}
status = QueryAllTracesW(&sessions[0], sessionCount, &sessionCount);
} while (status == ERROR_MORE_DATA);
if (status != ERROR_SUCCESS)
{
printf("Error calling QueryAllTraces: %u\n", status);
}
else
{
printf("Actual session count: %u.\n\n", sessionCount);
for (ULONG i = 0; i < sessionCount; i++)
{
WCHAR sessionGuid[50];
(void)StringFromGUID2(sessions[i]->Wnode.Guid, sessionGuid, ARRAYSIZE(sessionGuid));
printf(
"Session GUID: %ls\n"
"Session ID: %llu\n"
"Session name: %ls\n"
"Log file: %ls\n"
"min buffers: %u\n"
"max buffers: %u\n"
"buffers: %u\n"
"buffers written: %u\n"
"buffers lost: %u\n"
"events lost: %u\n"
"\n",
sessionGuid,
sessions[i]->Wnode.HistoricalContext,
(PCWSTR)((LPCBYTE)sessions[i] + sessions[i]->LoggerNameOffset),
(PCWSTR)((LPCBYTE)sessions[i] + sessions[i]->LogFileNameOffset),
sessions[i]->MinimumBuffers,
sessions[i]->MaximumBuffers,
sessions[i]->NumberOfBuffers,
sessions[i]->BuffersWritten,
sessions[i]->LogBuffersLost,
sessions[i]->EventsLost);
}
}
}
catch (std::bad_alloc const&)
{
printf("Error allocating memory for properties.\n");
status = ERROR_OUTOFMEMORY;
}
return status;
}
Примечание
Заголовок evntrace.h определяет QueryAllTraces в качестве псевдонима, который автоматически выбирает версию ANSI или Юникод этой функции на основе определения константы препроцессора ЮНИКОД. Использование псевдонима, не зависящий от кодирования, с кодом, который не является нейтральным для кодировки, может привести к несоответствиям, которые приводят к ошибкам компиляции или времени выполнения. Дополнительные сведения см. в разделе Соглашения для прототипов функций.
Требования
Минимальная версия клиента | Windows 2000 Professional [только классические приложения] |
Минимальная версия сервера | Windows 2000 Server [только классические приложения] |
Целевая платформа | Windows |
Header | evntrace.h |
Библиотека | Sechost.lib в Windows 8.1 и Windows Server 2012 R2; Advapi32.lib в Windows 8, Windows Server 2012, Windows 7, Windows Server 2008 R2, Windows Server 2008, Windows Vista и Windows XP |
DLL | Sechost.dll в Windows 8.1 и Windows Server 2012 R2; Advapi32.dll в Windows 8, Windows Server 2012, Windows 7, Windows Server 2008 R2, Windows Server 2008, Windows Vista и Windows XP |