Je vais essayer d'être bref, mais entièrement descriptif:Le moyen le plus rapide de passer le contenu d'un fichier du noyau au mode utilisateur?
Ceci est spécifique à Windows. Utilisation du kit de développement de pilote Windows (DDK). Je suis en train d'écrire un pilote en mode noyau (KMD) pour la première fois, n'ayant aucune expérience préalable en mode noyau. Je joue actuellement avec l'échantillon de mini-filtre "scanner" qui vient avec le DDK, et en expansion sur elle pour la pratique. Le mini-filtre "scanner" est une ébauche de base pour un pilote d'analyse de type "anti-virus" générique qui accroche le fichier crée/ferme et fonctionne sur le fichier associé pour rechercher un "mauvais mot" avant d'approuver/refuser l'opération demandée. L'objectif final est de scanner le fichier avec l'application en mode utilisateur lorsqu'il est ouvert, en décidant si le mini-filtre doit permettre à l'opération de se terminer, sans ralentissement notable pour le processus ou l'utilisateur qui est essayer d'ouvrir le fichier. Je vais également vouloir balayer le fichier entier à nouveau quand une sauvegarde est tentée pour décider si oui ou non la sauvegarde doit se terminer avec succès ou refuser la sauvegarde. L'échantillon de mini-filtre établit les bases de la façon de raccorder ces appels, mais il est un peu faible dans la partie «numérisation».
Je cherche à étendre l'échantillon pour analyser le fichier entier qui a été ouvert, comme pour générer un hachage, plutôt que seulement le premier 1k (la limite de l'échantillon). J'ai modifié l'échantillon pour lire l'intégralité du fichier et l'envoyer en utilisant les mêmes mécanismes dans l'échantillon original. Cette méthode utilise FltReadFile
pour lire le fichier dans le KMD et FltSendMessage
pour envoyer le tampon au composant en mode utilisateur. L'application en mode utilisateur utilise GetQueuedCompletionStatus
pour récupérer les notifications du KMD et traiter les tampons.
Cependant, je remarque que ce processus semble être plutôt lent comparé à une ouverture/lecture normale en C++ utilisant la bibliothèque standard (fstream). Cette méthode prend entre 4 à 8 fois plus de temps que de simplifier l'ouverture et la lecture du fichier dans une simple application utilisateur C++. J'ai ajusté la taille des tampons pour voir si cela apporte une amélioration notable, et même si cela peut aider légèrement, les avantages ne semblent pas très importants.
Puisque je cherche à scanner des fichiers en "temps réel", ce taux de transfert est très décevant et prohibitif. Existe-t-il un moyen plus rapide de transférer le contenu d'un fichier d'un pilote en mode noyau vers une application en mode utilisateur?
J'ai été distrait et incapable de réellement mettre en œuvre cela pour l'instant, mais l'information semble très prometteuse et est très appréciée. Merci! – KevenK