TRADUCTION DE DOKAN EN DELPHI: UN DRIVER "USER-MODE" POUR DISQUES VIRTUELS

Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 - 18 juil. 2009 à 19:14
cs_Forman Messages postés 600 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 6 avril 2010 - 19 août 2009 à 15:04
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/50330-traduction-de-dokan-en-delphi-un-driver-user-mode-pour-disques-virtuels

cs_Forman Messages postés 600 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 6 avril 2010 1
19 août 2009 à 15:04
Ah oui j'avais oublié: il y avait un petit oubli dans la déclaration de la variable g_DokanOperations. Les champs inutilisés n'étaient pas initialisés à nil, donc ça pouvait causer des "Access violation".

C'est corrigé à présent.
cs_jfs59 Messages postés 178 Date d'inscription mardi 29 avril 2003 Statut Membre Dernière intervention 2 février 2010
19 août 2009 à 14:53
Bon le problème c'est que ça plante déjà la

i := DokanMain(g_DokanOptions, g_DokanOperations);

donc des l'entrée ... et c'est déjà dans la dll dokan donc non modifiable

sinon j'ai mis des traceurs partout du genre showmessage ! c'est un peu long mais on vois bien par ou passe le programme pour chaque opération genre lecture dossier et autres ...

et la réponse a la question précédente est oui .... pourquoi trainer des dossiers et des fichiers quand un seul fichier serait possible ! a la limite ça serait remettre en cause les iso, cue et autres nrg ...

plus besoin de daemon tools et/ou autres isobuster ... lol
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
19 août 2009 à 14:22
Mais est-ce vraiment nécessaire de tout stocker dans un seul fichier ?

Cordialement, Bacterius !
cs_Forman Messages postés 600 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 6 avril 2010 1
19 août 2009 à 14:07
C'est possible, mais tu devras programmer tout ce qui concerne la gestion de tes fichiers. En clair: la seule chose que tu n'as pas à faire c'est le driver, c'est à dire la partie qui fait le lien entre Windows et la douzaine de fonctions "custom" que tu écris (openfile, closefile, deletefile, readfile, writefile, etc...). En particulier, c'est ce driver-là qui fait apparaitre le disque virtuel dans le poste de travail et qui fait que l'accès pour les autres applications à ton système de fichiers custom est transparent, peu importe ce que tu as utilisé derrière pour le stockage.
cs_jfs59 Messages postés 178 Date d'inscription mardi 29 avril 2003 Statut Membre Dernière intervention 2 février 2010
19 août 2009 à 13:54
donc je veux dans un fichier "énorme" mettre des centaines voire des milliers de fichiers plus petit et que le tout soit vu comme un disque avec transparence totale ...

cordialement
cs_Forman Messages postés 600 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 6 avril 2010 1
19 août 2009 à 13:53
jfs59: c'est possible de faire ce que tu décris, du moins si j'ai bien compris. En gros, ton système de fichier serait stocké dans un seul fichier qui jouerait le rôle d'une archive et serait crypté, c'est bien ça?

Mais comme l'explique Bacterius, il faut écrire soi-même toutes les routines d'I/O du système de fichier. Dokan se charge seulement de faire le lien entre un driver de disque virtuel et ton application. C'est ton application qui décide quels sont les fichiers, quelle taille ils font, quoi faire quand on lit/écrit dedans, comment les effacer et les stocker, etc...

Il est tout à fait possible d'imaginer gérer un système de fichiers qui réside uniquement dans la RAM (du genre de ramdisk si tu connais). La plus grande difficulté à mon sens est de gérer les permissions concurrentes (par exemple si un fichier est ouvert en écriture par une application il ne peut être ouvert en lecture par une autre, ce genre de choses).
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
19 août 2009 à 13:45
Ah j'ai regardé RealCrypt, en fait ce qu'il faut comprendre (mais Forman te l'expliquera mieux que moi), c'est que Dokan est en réalité une sorte d'interface (pas en termes informatique hein), qui permet d'intercepter les opérations de disque sur un dossier en particulier. Par exemple, dans l'exemple Mirror, MirrorReadFile est appelé chaque fois que l'API Windows ReadFile est appelé sur le dossier monté en disque virtuel. Bref, c'est dans ces routines qu'il faut mettre des traitements spéciaux comme le cryptage/décryptage des données, etc ...
Mais je reconnais que ce n'est pas facile, j'ai essayé et ça n'a donné lieu qu'à des plantages ... mea culpa de toute façon ^^

Cordialement, Bacterius !
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
19 août 2009 à 13:40
Jfs59, en fait ce que tu voudrais faire c'est simplement considérer 1 fichier comme un disque virtuel mais pas un dossier ? Quel intérêt, puisqu'on peut mettre un seul (ou plusieurs) fichiers dans un dossier ?

Cordialement, Bacterius !
cs_jfs59 Messages postés 178 Date d'inscription mardi 29 avril 2003 Statut Membre Dernière intervention 2 février 2010
19 août 2009 à 13:35
Bonjour,

pendant un instant j'ai cru avoir trouvé ce que je cherche (mal peut être) depuis longtemps.
Après avoir essayer le programme, l'avoir modifié pour le faire fonctionner sans ligne de commande, j'ai essayé de "monter" un fichier utilisable en disque virtuel ! et la évidemment déception ça marche pas ! on ne peux monter que des dossiers ....

Pour ce qui est de l'adaptation en tous cas félicitation pour le travail effectué !

si l'un d'entre vous a déjà vu ce que je cherche je suis preneur d'un lien ...

je résume : un truc en delphi, modifiable, permettant de créer et de lire/écrire un fichier et de le monter en disque virtuel.

un truc du genre Realcrypt par exemple ....

j'en profite pour noter ... 10/10 même si j'ai cherché un peu pour comprendre comment ça marche ... lol
cs_Forman Messages postés 600 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 6 avril 2010 1
25 juil. 2009 à 15:30
Ah oui exact j'avais mal lu :)
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
25 juil. 2009 à 15:24
Moi j'ai 512 Mo libres / 1 Go ...
Merci pour ces informations :)

Cordialement, Bacterius !
cs_Forman Messages postés 600 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 6 avril 2010 1
25 juil. 2009 à 14:29
Il faut faire une routine GetVolumeInformation (et éventuellement GetDiskFreeSpace). Ces routines sont optionnelles, si on ne les définit pas apparemment le disque s'appelle "Dokan" et affiche 5 Go de libres sur 10 Go au total (chiffres totalement arbitraires). Il faut lire l'article MSDN des API Windows correspondantes pour savoir exactement ce que doivent faire ces fonctions:
http://msdn.microsoft.com/en-us/library/aa364993%28VS.85%29.aspx
http://msdn.microsoft.com/en-us/library/aa364935%28VS.85%29.aspx

Je suis en train de me rendre compte que je n'avais pas spécifié explicitement que les membres correspondant de ma structure TDokanOperations devaient être initialisés à nil dans ma constante g_DokanOperations. Etonnant que ça ait pu marcher sans ça (peut-être que Delphi les initialise automatiquement). Je vais faire une mise à jour bientôt (et accessoirement c'était peut-être dû à ça ton problème).
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
25 juil. 2009 à 13:44
Ah ben après redémarrage ça marche parfaitement ?? Même en cryptage/décryptage (quand je lance EFS.exe, le fichier texte dans le disque virtuel est bien crypté/décrypté, et quand je ferme EFS.exe, le fichier texte affiche du crypté !).
Maintenant j'ai un autre problème : comment changer le nom du disque virtuel ? Parce que "DOKAN", j'aimerais bien l'appeller "EFS". Et quand j'essaye de renommer, ça revient toujours à Dokan ?

Cordialement, Bacterius !
cs_Forman Messages postés 600 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 6 avril 2010 1
25 juil. 2009 à 13:41
Ok: vincent dot feuvrier at normalesup dot org
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
25 juil. 2009 à 13:33
Ben oui ça marche (enfin aucune erreur, mais comme mon poste de travail est figé quand je l'ouvre car j'ai pas redémarré quand ça a foiré tout à l'heure je peux pas vraiment savoir).
Je redémarre et je t'envoie le source par mail ?

Cordialement, Bacterius !
cs_Forman Messages postés 600 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 6 avril 2010 1
25 juil. 2009 à 13:27
Au fait oui, Dokan est sensé être compatible Vista.
cs_Forman Messages postés 600 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 6 avril 2010 1
25 juil. 2009 à 13:27
C'est bizarre ça. Si tu bloques encore tu peux m'envoyer ton source pour que je regarde? J'aurai peut-être le temps ce soir.

Et en mettant le Mirror.exe original à la place de ta version modifiée (dans les mêmes conditions que ce que tu décris), ça marche?
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
25 juil. 2009 à 13:22
Oui, mais j'ai aussi exécuté dans un endroit différent du disque ... au lieu d'éxécuter dans "D:\...\delphifr______traduction_dokan....\Mirror.exe" j'ai executé dans "D:\...\Bureau\EFS\EFS.exe". Je ne sais pas si ça change qqch ?

Cordialement, Bacterius !

PS : est-ce que Dokan marche sous Vista ?
cs_Forman Messages postés 600 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 6 avril 2010 1
25 juil. 2009 à 13:08
C'est bizarre. Tu as seulement modifié MirrorReadFile et MirrorWriteFile et ça ne marchait plus?
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
25 juil. 2009 à 13:04
Merci :)
Pour l'encrypted file system, ça tombe bien, car mon algo de chiffrement prend des buffers, donc il suffit de décrypter après ReadFile, et encrypter avant WriteFile dans les MirrorRead/WriteFile :)
Mais l'idée du wrapper est bien :p
Quant à mes erreurs, c'était encore pire. Alors en fait j'avais fait une copie de Mirror.exe, puis en l'appellant EFS.exe, je glissai mes routines Encrypt (de l'algo SEA) dans MirrorReadFile et MirrorWriteFile, et je l'utilisais normalement ("D:\...\EFS.exe" /R C:\EFS /L m), déjà le disque n'apparaissait pas (pourtant le service mounter était démarré, et dokan.dll était installé), et puis quand je voulais avoir une vue sur le poste de travail (avec la liste des disques), le système se figeait complètement (mais complètement quoi).
Mais là je vais recommencer à tête reposée.

Cordialement, Bacterius !
cs_Forman Messages postés 600 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 6 avril 2010 1
25 juil. 2009 à 12:49
Bien sûr tu peux utiliser l'unité elle est faite pour ça :-)
D'ailleurs j'ai prévu quand j'aurais le temps de faire un wrapper autour sous forme d'un composant TDokanDriver, sur lequel on peut brancher des descendants de TDokanFileSystem. Par exemple TMirrorFileSystem ferait la même chose que le code présenté ici, et TEncryptedFileSystem serait un TFileSystem intermédiaire qui crypterait les données avant de les envoyer à un autre TFileSystem (par exemple un TMirrorFileSystem, ou un TFTPFileSystem etc...) qui se charge de les écrire explicitement.

As-tu des access violations dans ton code? Il ne faut pas oublier de mettre IsMultiThread:=True quelque part pour que le memory manager de Delphi soit rendu thread-safe (les callbacks de Dokan sont exécutés dans des contextes de threads différents). J'ai mis du temps avant de m'en rendre compte, j'avais tout le temps des bugs inexplicables.
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
25 juil. 2009 à 03:08
J'ai essayé de faire un mini système de fichiers cryptés. Seulement j'ai dû mal m'y prendre, car déjà le disque virtuel n'apparaît pas, et quand il apparaît, le poste de travail se fige complètement.
De toute façon je vais recommencer en réinstallant Dokan puis en m'y plongeant ...
Tu m'autorises à utiliser ton interface Delphi de Dokan pour faire mon système de fichiers cryptés personnel ? :)

Cordialement, Bacterius !

PS : en fait, si j'ai bien compris le principe, Dokan crée un disque virtuel et définit ses propres routines de lecture/écriture/création/suppresion, en les indiquant à Windows ?
cs_Forman Messages postés 600 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 6 avril 2010 1
21 juil. 2009 à 23:35
Ce processus est utilisé pour le service de montage de disque. L'exécutable se trouve dans le répertoire d'installation de Dokan. Normalement, si tu désinstalles Dokan (ou si tu désactives le service) il devrait disparaitre.
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
21 juil. 2009 à 18:45
Dis donc Forman, je me rends compte que maintenant j'ai un processus "mounter.exe" qui est lancé à chaque démarrage de mon système, sans que je touche à ta source ... Y-a-t-il moyen d'éradiquer ce processus ? (je pensais relancer la source puis la fermer, mais ça ne semble pas marcher).

Cordialement, Bacterius !
cs_Forman Messages postés 600 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 6 avril 2010 1
18 juil. 2009 à 20:08
Un autre exemple d'application amusant, ce serait de reprogrammer un équivalent du défunt GMail drive. L'idée c'est de se ménager un espace de stockage sur un serveur mail POP :-)

A priori, avec les composants Indy, ça doit être faisable.
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
18 juil. 2009 à 19:51
Oui c'est ce que j'ai compris, je me suis mal exprimé : quand je disais "dans chaque routine de lecture/écriture" je parlais de MirrorReadFile et MirrorWriteFile. Pour l'idée de la clef, elle me semble pas mal, disons qu'on garde notre clef sur un post-it près de notre ordinateur ^^

Cordialement, Bacterius !
cs_Forman Messages postés 600 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 6 avril 2010 1
18 juil. 2009 à 19:48
Justement non, en ce qui concerne les applications qui écrivent ou lisent sur le disque virtuel, elles n'y voient que du feu. Si tu lances le notepad par exemple, tu tapes un fichier et tu l'enregistres sur le disque virtuel. La fonction MirrorWriteFile (version "crypteuse") va écrire les données sous forme cryptée dans le répertoire physique. Si plus tard tu ouvres ce fichier, la fonction MirrorReadFile (version "décrypteuse") va envoyer les données décryptées au Notepad par l'intermédiaire du driver Dokan. Du point de vue du Notepad, il s'agit d'un fichier tout à fait normal, puisque le driver Dokan se charge de lui faire croire.

La seule application qui a besoin de connaitre la clef de cryptage/décryptage c'est le programme Mirror (on pourrait imaginer qu'il te la demande lorsqu'il se lance par exemple). Dès que le programme Mirror s'arrête, les données sont sécurisées, puisque stockées physiquement uniquement sous forme cryptée.
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
18 juil. 2009 à 19:41
En gros, tu veux dire que tout fichier qui transite sur ce disque virtuel, quand ils sont lus, sont automatiquement décryptés, et ceux qui sont écrits sont automatiquement cryptés ?
C'est pas mal ça ... en fait il suffirait de rajouter 1 ligne de code dans chaque routine de lecture/écriture ! Mais pour la clef cryptographique, il faudrait trouver un moyen de rendre son utilisation transparente pour les applications qui écrivent sur ce disque virtuel, et trouver un endroit où la stocker ^^

Cordialement, Bacterius !
cs_Forman Messages postés 600 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 6 avril 2010 1
18 juil. 2009 à 19:38
Le programme Mirror n'est pas très utile en soi. En fait, la commande MS-Dos SUBST fait exactement la même chose. C'est juste un exemple "canonique" de FileSystem.

Une possibilité d'amélioration simple à réaliser serait d'implémenter un cryptage des données. Il faudrait modifier les fonctions MirrorReadFile et MirrorWriteFile pour respectivement décrypter et crypter le Buffer. Dans ces conditions, les fichiers physiques qui sont stockés dans le RootDirectory seraient cryptés (donc pas lisible par quelqu'un qui te volerait ton disque dur par exemple :-) mais du point de vue des programmes qui utiliseraient ces fichiers par l'intermédiaire du lecteur virtuel, il s'agirait de fichiers "normaux" qui s'utilisent de manière totalement standard.
cs_Forman Messages postés 600 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 6 avril 2010 1
18 juil. 2009 à 19:34
Oui, bien sûr le disque peut être très facilement enlevé. En fait, il n'existe que tant que le programme Mirror.exe tourne. Dès que le programme s'arrête, le disque disparait (comme un lecteur USB qu'on aurait retiré). En cas de bug sérieux (si j'ai mal traduit un morceau du programme par exemple) il se peut que tu doives redémarrer, mais le cas ne s'est jamais présenté pour moi, même quand j'étais en train de traduire le prog et qu'il était encore bourré de bugs.

Le problème le plus sérieux que j'aie eu jusque là, c'est après une Access violation (due à une erreur de pointeur dans mon code pendant la phase de traduction) et après avoir quitté le programme et relancé il était impossible de monter le lecteur Dokan et j'ai été obligé de redémarrer, mais c'était tout à fait anodin en ce qui concerne la stabilité de Windows.

J'ai oublié de le préciser: il y a trois façons de démonter le disque une fois que le programme fonctionne:
- soit en utilisant l'utilitaire dokanctl.exe fourni avec Dokan, par exemple
dokanctl /u m
si le lecteur virtuel s'appelle M:\
- en utilisant la fonction DokanUnmount dans le programme
- ou encore tout simplement en terminant le programme Mirror.exe (Ctrl + C ou Ctrl + Break ou en fermant la console)

Si tu veux être absolument certain de ne pas perdre de données, je te suggère d'enregistrer tous tes documents ouverts avant de lancer Mirror.exe, au cas où tu devrais rebooter juste après.

J'ai aussi oublié de le préciser: toutes les opérations que tu fais sur le lecteur Dokan (Modification, suppression de fichiers) affecte le répertoire RootDirectory! Donc attention à ne pas supprimer un fichier important!
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
18 juil. 2009 à 19:24
Ah je vois le disque existe pendant la durée du processus "mirror.exe". Ca a l'air très intéressant, donc j'ai appelé la commande suivante :

"...\mirror.exe" /R C:\Test /L m"

Ca me crée bien un disque local "Dokan (M:)", qui pointe vers le dossier "C:\Test". Mais dans quel but peut-on utiliser cette relation ? Tout ce que tu as dit sur le kernel et le débogage dans ta description, moi ça me dépasse lol :/

Cordialement, Bacterius !
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
18 juil. 2009 à 19:14
Quels risques la création d'un disque virtuel comporte-elle ? Peut-on, après test de ta source, détruire ce disque ?

Cordialement, Bacterius !
Rejoignez-nous