PM_COLLECT_PROC fonction de rappel (winperf.h)
Collecte les données de performances et les retourne au consommateur. Implémentez et exportez cette fonction si vous écrivez une DLL de performances pour fournir des données de performances. Le système appelle cette fonction chaque fois qu’un consommateur interroge le Registre pour obtenir des données de performances.
La fonction CollectPerformanceData est un espace réservé pour le nom de la fonction définie par l’application.
Syntaxe
PM_COLLECT_PROC PmCollectProc;
DWORD PmCollectProc(
LPWSTR pValueName,
void **ppData,
DWORD *pcbTotalBytes,
DWORD *pNumObjectTypes
)
{...}
Paramètres
pValueName
ppData
pcbTotalBytes
pNumObjectTypes
Valeur retournée
Une des valeurs suivantes :
Code de retour | Description |
---|---|
ERROR_MORE_DATA | La taille de la mémoire tampon pData (où pData fait référence au pointeur vers lppData) spécifiée par lpcbTotalBytes n’est pas suffisamment grande pour stocker les données. Laissez pData inchangé et définissez lpcbTotalBytes et lpNumObjectTypes sur zéro. Aucune tentative n’est effectuée pour indiquer la taille de mémoire tampon requise, car cela peut changer avant l’appel suivant. |
ERROR_SUCCESS | Retourne cette valeur dans tous les cas autres que le cas de ERROR_MORE_DATA , même si aucune donnée n’est retournée ou si une erreur se produit. Pour signaler des erreurs autres que la taille de mémoire tampon insuffisante, utilisez le journal des événements des applications. |
Remarques
Si les objets demandés spécifiés dans le paramètre lpValueName ne correspondent à aucun des index d’objets pris en charge par votre DLL de performances, laissez le paramètre pData inchangé (où pData fait référence au pointeur vers lppData) et définissez les paramètres lpcbTotalBytes et lpNumObjectTypes sur zéro. Cela indique qu’aucune donnée n’a été retournée.
Si vous prenez en charge un ou plusieurs des objets interrogés, déterminez si la taille de la mémoire tampon pData spécifiée par lpcbTotalBytes est suffisamment grande pour stocker les données. Si ce n’est pas le cas, laissez pData inchangé et définissez lpcbTotalBytes et lpNumObjectTypes sur zéro. Aucune tentative n’est effectuée pour indiquer la taille de mémoire tampon requise, car cela peut changer avant le prochain appel. Retourne ERROR_MORE_DATA.
Si votre collecte de données prend beaucoup de temps, vous devez répondre uniquement aux requêtes pour des objets spécifiques ou aux requêtes coûteuses. Vous devez également réduire la priorité du thread qui collecte les données, afin de ne pas nuire aux performances du système. Pour le format de chaîne de requête, consultez Utilisation des fonctions de Registre pour consommer des données de compteur.
Si le consommateur s’exécute sur un autre ordinateur (à distance), les fonctions OpenPerformanceData, ClosePerformanceData et CollectPerformanceData sont appelées dans le contexte du processus Winlogon, qui gère le côté serveur de la connexion à distance. Cette distinction est importante lors de la résolution des problèmes qui se produisent uniquement à distance.
Une fois votre fonction retournée avec succès, le système peut effectuer des tests de base pour garantir l’intégrité des données. Par défaut, aucun test n’est effectué. Si un test échoue, le système génère un message de journal des événements et les données sont ignorées pour éviter d’autres problèmes dus à des pointeurs non valides. La valeur de Registre suivante contrôle le niveau de test : HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Perflib\ExtCounterTestLevel
.
Voici les niveaux de test possibles pour ExtCounterTestLevel.
Level | Signification |
---|---|
1 | Testez les pointeurs et les mémoires tampons des DLL de compteurs approuvés. Envoie une copie de la mémoire tampon de l’utilisateur. |
2 | Testez les pointeurs et les longueurs de mémoire tampon, mais ne teste pas les références de pointeur ou le contenu de la mémoire tampon. Envoie une copie de la mémoire tampon de l’utilisateur. |
3 | Ne testez pas les pointeurs ou les mémoires tampons. Envoie une copie de la mémoire tampon de l’utilisateur. |
4 | Ne testez pas les pointeurs ou les mémoires tampons. Envoie la mémoire tampon de l’utilisateur, et non une copie. Il s’agit de la valeur par défaut. |
Les tests suivants sont effectués aux niveaux 1 et 2 :
- Vérifie que la valeur de lpcbTotalBytes est cohérente avec le pointeur de mémoire tampon retourné, pData. Si vous ajoutez la valeur lpcbTotalBytes au pointeur de mémoire tampon d’origine passé à cette fonction, vous devez vous retrouver avec le même pointeur de mémoire tampon retourné par cette fonction. Si elles ne sont pas les mêmes, un message d’erreur est enregistré et les données sont ignorées.
- Vérifiez qu’aucun dépassement de mémoire tampon n’a eu lieu. Le système ajoute une page de protection de 1 Ko avant et après la mémoire tampon allouée par le consommateur. Si le pointeur de mémoire tampon retourné, pData, pointe au-delà du premier octet de la page de garde ajoutée, il est supposé que la mémoire tampon n’est pas valide et que les données sont ignorées. Si le pointeur de la mémoire tampon dépasse la fin de la mémoire tampon, mais pas la fin de la page de protection, une erreur de dépassement de mémoire tampon est enregistrée. Si le pointeur de la mémoire tampon se trouve au-delà de la fin de la page de protection, une erreur de tas est enregistrée, car le tas à partir duquel la mémoire tampon a été allouée a pu être endommagé, provoquant d’autres erreurs de mémoire.
- Vérifiez que les pages de protection n’ont pas été endommagées. Les pages de protection de 1 Ko qui ont été ajoutées avant et après la mémoire tampon sont initialisées avec un modèle de données avant l’appel de cette fonction. Ce modèle de données est vérifié après le retour de la procédure de collecte. Si une incohérence est détectée, un dépassement de mémoire tampon ou une autre erreur de mémoire sont supposés et les données sont ignorées.
Les tests suivants sont effectués uniquement si le niveau de test 1 est utilisé :
- Vérifiez que la somme du membre TotalByteLength de chaque objet est identique à la valeur de lpcbTotalBytes. Si ce n’est pas le cas, les données sont ignorées.
- Vérifiez que le membre ByteLength de chaque instance est cohérent. Les longueurs sont cohérentes si l’objet ou la fin de la mémoire tampon suivant suit le dernier instance. Si ce n’est pas le cas, les données sont ignorées.
Exemples
Consultez Implémentation de CollectPerformanceData.
Configuration requise
Condition requise | Valeur |
---|---|
Client minimal pris en charge | Windows XP [applications de bureau uniquement] |
Serveur minimal pris en charge | Windows Server 2003 [applications de bureau uniquement] |
Plateforme cible | Windows |
En-tête | winperf.h |