web-dev-qa-db-fra.com

Surveillance de certains appels système effectués par un processus sous Windows

J'aimerais pouvoir surveiller certains appels système effectués par un processus, principalement les appels d'E/S de fichiers. Sous Linux, je peux probablement m'en tirer en utilisant strace avec les paramètres appropriés, mais comment puis-je le faire sous Windows?

Je suis principalement intéressé à exécuter un processus et à déterminer quels fichiers il a lus et écrits.

Je veux le faire par programme à partir d'un autre processus. Je connais Process Monitor , mais j'aimerais recevoir les données sous une forme que je peux importer dans un autre programme pour une analyse plus approfondie.

Si j'affine encore mes exigences, il suffit probablement de pouvoir surveiller les appels à CreateFile (). Je ne suis vraiment intéressé que par les fichiers ouverts et s'ils sont ouverts en lecture/écriture ou simplement en lecture. Une autre exigence que je n'ai pas vraiment énoncée est que la vitesse est assez importante; Je prévoyais de faire cela pour des choses comme la compilation d'un fichier C++, et tirer une interface graphique complète qui génère un fichier journal de 20 Mo aura une surcharge prohibitive.

Ce serait aussi bien s'il n'exigeait pas de privilèges administratifs.

34
JesperE

Il existe plusieurs options sous Windows.

Windows Performance Toolkit peut être utilisé pour activer le suivi de divers événements système, y compris les E/S de fichiers, et comprend des outils pour le traitement et l'affichage de ces événements. Vous pouvez utiliser xperf pour commencer à suivre diverses classes d'événements et les enregistrer dans un fichier ETL que vous pourrez ensuite traiter ou afficher à l'aide des mêmes outils ultérieurement.

Process Monitor de Sysinternals est une autre option très facile à utiliser et vous permet de voir rapidement tous les accès aux fichiers et au registre que tout processus du système fait. http://blogs.msdn.com/carloc/archive/2008/10/31/how-to-automate-process-monitor.aspx montre également comment exécuter Process Monitor de manière automatisée.

Si vous souhaitez le faire entièrement par programme, vous pouvez utiliser les fonctions ETW (StartTrace, EnableTrace, etc.) pour capturer les événements d'E/S de fichier et les enregistrer dans un fichier ETL. Exemple de code ici .

25
Michael

Sous Windows, vous pouvez utiliser Process Monitor pour surveiller l'activité du processus (E/S et registre). Je suppose que cela correspond à vos besoins si vous ne voulez pas vraiment connaître les appels système.

Et vous pouvez utiliser winapioverride32 pour surveiller les appels d'API.

7
kcwu

API Monitor par Rohitab Batra est très bon pour les appels système.

4
ds-bos-msk

Une autre façon consiste à utiliser Deviare API Hook et à intercepter tous les appels système en mode utilisateur que vous souhaitez. En utilisant ce cadre, vous pouvez coder un gestionnaire générique pour tous les appels car les paramètres peuvent être lus à l'aide des interfaces COM (par exemple, chaque paramètre est un INktParam, et vous pouvez obtenir la valeur à l'aide de INktParam.Value).

Une autre alternative, mais cela coûtera de l'argent, est d'utiliser SpyStudio de la même entreprise. Ce produit dispose d'une option de ligne de commande qui est utile pour collecter des journaux sans interface graphique.

2
Pablo Yabo

Utilisez FileMon (maintenant intégré à Process Monitor ).

Il y a aussi NtTrace , similaire à strace .

2
anon

Un autre outil de traçage de l'API Windows: logexts.dll (faisant partie de Outils de débogage pour Windows ), qui peut être exécuté de l'intérieur WinDbg /ntsd/cdb ou via un _ logger.exe programme.

2
bk1e