Fonction QueryAllTracesA (evntrace.h)
La fonction QueryAllTraces récupère les propriétés et les statistiques de toutes les sessions de suivi d’événements pour lesquelles l’appelant est autorisé à interroger.
Syntaxe
ULONG WMIAPI QueryAllTracesA(
[out] PEVENT_TRACE_PROPERTIES *PropertyArray,
[in] ULONG PropertyArrayCount,
[out] PULONG LoggerCount
);
Paramètres
[out] PropertyArray
Tableau de pointeurs vers EVENT_TRACE_PROPERTIES structures qui reçoivent des propriétés de session et des statistiques pour les sessions de suivi d’événements.
Il vous suffit de définir les membres Wnode.BufferSize, LoggerNameOffset et LogFileNameOffset de la structure EVENT_TRACE_PROPERTIES . Les autres membres doivent tous avoir la valeur zéro.
[in] PropertyArrayCount
Nombre de structures dans le tableau PropertyArray . Cette valeur doit être inférieure ou égale à 64, le nombre maximal de sessions de suivi d’événements prise en charge par ETW.
Windows 10:PropertyArrayCount peut être supérieur à 64 et certains systèmes peuvent prendre en charge plus de 64 sessions de suivi.
[out] LoggerCount
Reçoit le nombre de traces pour lesquelles les données sont retournées. Cela peut différer du nombre réel de sessions de suivi d’événements en cours d’exécution si l’appelant ne dispose pas des autorisations nécessaires pour interroger toutes les sessions.
Valeur retournée
Si la fonction réussit, la valeur de retour est ERROR_SUCCESS.
Si la fonction échoue, la valeur de retour est l’un des codes d’erreur système. Voici quelques erreurs courantes et leurs causes.
ERROR_INVALID_PARAMETER
Une des conditions suivantes est vraie :
- PropertyArrayCount est égal ou supérieur au nombre maximal de sessions prises en charge
- PropertyArray a lavaleur NULL
ERROR_MORE_DATA
Le tableau de propriétés est trop petit pour recevoir des informations pour toutes les sessions (SessionCount est supérieur à PropertyArrayCount). La fonction remplit le tableau de propriétés avec le nombre de structures de propriétés spécifiées dans PropertyArrayCount.
Notes
Les contrôleurs de suivi d’événements appellent cette fonction.
Cette fonction récupère les sessions de trace que l’appelant a les autorisations d’interroger. Les utilisateurs exécutant avec des privilèges d’administration élevés, les utilisateurs du groupe Utilisateurs du journal des performances et les services s’exécutant en tant que LocalSystem, LocalService, NetworkService peuvent afficher la plupart des sessions de suivi.
Cette fonction ne retourne pas de sessions de journalisation privées.
Pour récupérer des informations pour une session unique, utilisez la fonction ControlTrace et définissez le paramètre ControlCode sur EVENT_TRACE_CONTROL_QUERY.
Exemples
L’exemple suivant montre comment appeler cette fonction.
#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;
}
Notes
L’en-tête evntrace.h définit QueryAllTraces comme un alias qui sélectionne automatiquement la version ANSI ou Unicode de cette fonction en fonction de la définition de la constante de préprocesseur UNICODE. Le mélange de l’utilisation de l’alias neutre en encodage avec du code qui n’est pas neutre en encodage peut entraîner des incompatibilités qui entraînent des erreurs de compilation ou d’exécution. Pour plus d’informations, consultez Conventions pour les prototypes de fonction.
Spécifications
Client minimal pris en charge | Windows 2000 Professionnel [applications de bureau uniquement] |
Serveur minimal pris en charge | Windows 2000 Server [applications de bureau uniquement] |
Plateforme cible | Windows |
En-tête | evntrace.h |
Bibliothèque | Sechost.lib sur Windows 8.1 et Windows Server 2012 R2 ; Advapi32.lib sur Windows 8, Windows Server 2012, Windows 7, Windows Server 2008 R2, Windows Server 2008, Windows Vista et Windows XP |
DLL | Sechost.dll sur Windows 8.1 et Windows Server 2012 R2 ; Advapi32.dll sur Windows 8, Windows Server 2012, Windows 7, Windows Server 2008 R2, Windows Server 2008, Windows Vista et Windows XP |