Meilleur moyen de transmettre le contenu d'un fichier à partir du noyau en mode utilisateur?

StackOverflow https://stackoverflow.com/questions/2276044

Question

Je vais essayer d'être bref, mais descriptif complet:

Ceci est spécifique à Windows. Utilisation du kit de développement de pilotes Windows (DDK).

Je suis en train d'écrire un pilote en mode noyau (KMD) pour la première fois, ayant aucune expérience préalable en mode noyau. Je jouais actuellement avec l'échantillon mini-filtre « scanner » qui vient avec le DDK, et développerai pour la pratique. Le mini-filtre « scanner » est un schéma de base pour un pilote de balayage de type « anti-virus » générique qui fichier crochets crée / ferme et fonctionne sur le fichier associé à rechercher un « mauvais mot » avant d'approuver / refuser l'opération demandée.

Le but final est d'analyser le fichier avec l'application en mode utilisateur lors de son ouverture, de décider si oui ou non le mini-filtre doit permettre le fonctionnement de terminer, sans ralentissement notable au processus ou un utilisateur qui tente pour ouvrir le fichier. Je vais aussi à numériser à nouveau le fichier entier lors d'un enregistrement est tenté de décider si oui ou non pour permettre la sauvegarde de mener à bien ou à refuser la sauvegarde. L'échantillon mini-filtre expose les bases de la façon de raccorder ces appels, mais est un peu faible dans la partie en fait « de balayage ».

Je cherche à élargir l'échantillon pour analyser le fichier entier qui a été ouvert, par exemple pour générer un hachage, plutôt que le premier 1k (la limite de l'échantillon). Je l'ai modifié l'échantillon pour lire l'intégralité du fichier et l'envoyer en utilisant les mêmes mécanismes au sein de l'échantillon initial. Cette méthode utilise FltReadFile pour lire le fichier dans le KMD et FltSendMessage d'envoyer le tampon au composant en mode utilisateur. L'application en mode utilisateur utilise GetQueuedCompletionStatus pour saisir les notifications du KMD et traiter les tampons.

Cependant, je remarque que ce processus semble être assez lent par rapport à une ouverture / lecture normale en C ++ en utilisant la bibliothèque standard (fstream). Cette méthode prend entre environ 4-8 fois plus longtemps que simplying ouverture et la lecture du fichier dans un simple C ++ application utilisateur. J'ai ajusté la taille des tampons pour voir si cela fait une amélioration notable, et même si elle peut aider un peu, les avantages n'ont pas semblé être très important.

Depuis que je suis à la recherche pour analyser les fichiers en « temps réel », ce taux de transfert est très décevant et prohibitif. Y at-il un moyen plus rapide de transférer le contenu d'un fichier à partir d'un pilote en mode noyau pour une application en mode utilisateur?

Était-ce utile?

La solution

Je peux suggérer plusieurs solutions:

  1. Utilisez DeviceIoControl avec le type de transfert de METHOD_OUT_DIRECT pour passer de grandes quantités de données.
  2. Créer la section mémoire et la carte à votre processus (rappelez-vous de l'espace d'adressage limité sur les plates-formes 32 bits).
  3. Chemin du fichier passe à votre application et ouvrez-il.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top