Ecriture secteur disque en VB net

Résolu
Profil bloqué - 28 sept. 2008 à 02:19
 Profil bloqué - 11 oct. 2008 à 02:16
Bonsoir à tous
Dans le cadre du projet "Acces Direct Disques et Partitions VB net" je cherche à écrire des secteurs disque en VB net
J'utilise les Api Createfile,SetFilePointer,Lockfile,Writefile,Flushfilebuffer et Unlockfile
Createfile et SetfilePointer fonctionnent correctement car utilisées aussi pour la lecture des secteurs mais je bloque sur les 4 autres (Lockfile me renvoie une erreur 87 : paramètre incorrect))

voici mon code de ma fonction DirectWritebytes : iStartSect est le secteur début de l'écriture et nbytes est le nombre d'octets à écrire

Public Sub DirectWriteBytes(ByVal iStartSec As UInt32, ByVal nbytes As Int32)

        ' Attention le nombre d'octets lus ou écrits ainsi que l'offset du premier octet lu ou écrit
        ' doivent impérativement être un multiple de la taille d'un secteur de disque
        ' pointeur et nbytes doivent être des multiples de 512 ( taille standard des secteurs des disques)

        Dim BytesWrite As Int32, ret As Int32

        dskerr = False
        GetSeekDrive(iStartSec)  ' voir le code de cette fonction plus bas dans le texte)
        If dskerr = True Then Exit Sub

        'verrouilage de la zone du disque à écrire
        ret = LockFile(hDevice, hexlow, hexhigh, nbytes, 0)
        If ret <> 0 Then
            'écriture disque
            ret = WriteFile(hDevice, writeoctet, nbytes, BytesWrite, IntPtr.Zero)
            If ret <> 0 Then
                'on vide les buffers internes et on dévérouille la zone
                ret = FlushFileBuffers(hDevice)
                If ret <> 0 Then
                    ret = UnlockFile(hDevice, hexlow, hexhigh, nbytes, 0)
                End If
            End If
        End If
        If ret = 0 Then
            errorVal = Marshal.GetLastWin32Error()
            dskerr = True
        End If

    End Sub

Private Sub GetSeekDrive(ByVal StartSec As UInt32)

        Dim pointeur As UInt64
        Dim ptsecteurlow As UInt64, ptsecteurhigh As UInt64
        Dim ret As Int32

        'ouvre le drive la premiére fois
        If opendrive = False Then
            hDevice = CreateFile(ldrive, GENERIC_READ Or GENERIC_WRITE, FILE_SHARE_READ Or FILE_SHARE_WRITE, IntPtr.Zero, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0&)

            'quitte si le handle n'est pas valide
            If hDevice = INVALID_HANDLE_VALUE Then
                MessageBox.Show("Erreur accès disque")
                dskerr = True
                Exit Sub
            End If
            opendrive = True
        End If

        'move pointer
        pointeur = Convert.ToInt64(StartSec) * Convert.ToInt64(BytesPerSector)        ptsecteurlow pointeur Mod (2 ^ 32) : ptsecteurhigh pointeur \ (2 ^ 32)        hexlow Convert.ToInt32(ptsecteurlow.ToString("X8"), 16) : hexhigh Convert.ToInt32(ptsecteurhigh.ToString("X8"), 16)
        ret = SetFilePointer(hDevice, hexlow, hexhigh, FILE_BEGIN)
        If ret = -1 Then
            MessageBox.Show("Erreur accès disque")
            dskerr = True
            Exit Sub
        End If
    End Sub

Je n'ai pas mis les déclarations des fonctions ni des variables mais celles-ci sont correctement effectuées
De plus ce code est une adaption d'un code Vb 6.0 (c'est le même projet en vb 6.0) et l'écriture disque sur les secteurs fonctionne correctement en VB 6.0 mais je n'arrive pas à l'adapter en VB net
Je travaille sous windows vista home premium avec visual Basic 2008 Express

Merci d'avance à tous ceux qui essaieront de m'aider et aussi à ceux qui me liront
Et vive Codes-sources

La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.

GRENIER Alain

35 réponses

cs_Willi Messages postés 2375 Date d'inscription jeudi 12 juillet 2001 Statut Modérateur Dernière intervention 15 décembre 2018 22
1 oct. 2008 à 19:32
Tu as bien résumé.
Repart sur un projet vierge pour faire tes tests ! et aide toi de se site pour la déclaration des fonctions de l'api win32. [null http://www.pinvoke.net/]
Si tu n'as que les déclarations c# utilise le convertisseur .net de Codes-Sources http://tools.codes-sources.com/DotNetCodeConverter.aspx

++
0
Profil bloqué
1 oct. 2008 à 22:46
Salut Willi
Je me suis amusé (si l'on peut dire) avec le projet en VB Net et Vista en jouant sur les sécurités et permissions
- Sur C:\ et D:\  propriétés ----> sécurité et pour moi utilisateur = > TOUT AUTORISER
- En passant Administrateur car l'administrateur du poste n'est qu'un simple utilisateur et une manipulation lui permet d'être "Super Administrateur" comme dit dans certains forums
- Aller directement dans l'UAC de Vista et chercher à débloquer l'écriture sur les disques et partitions
- Aller dans les propriétés du projet à l'onglet "Sécurité"  ---->  FileIoPermissions   tenter Inclure et Exclure

Rien n'y fait !!!!!!!!!!!!!!!!!!!!!!!!!
C'est presque à regretter notre bon vieux Dos et l'assembleur où l'on pouvait faire ce qu'on voulait (ou presque)

Vu que XP et VB 6.0 nous donnait satisfaction au niveau de l'écriture des secteurs disque le coupable ne peut être que le Framework commun à Vista et VB net.
Je vais tenter la solution donnée plus haut que j'ai trouvé sur le NET
Son principe
-    Locker le disque physique
-    Locker la partition sur laquelle on veut agir
-    Ecrire les secteurs désirés ( si j'ai bien compris ces secteurs doivent être comptés à partir du premier secteur du dique physique et non logique)
-    Unlocker la partition
-    Unlocker le disque

Sur ce je vais aller au dodo : la nuit porte conseil et merci pour tout

La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.

GRENIER Alain
0
Profil bloqué
5 oct. 2008 à 01:01
La solution que je préconisais dans le post précédent a échoué.Ai-je bien compris ou non ? Je l'ignore
Le post reste ouvert néanmoins au cas où quelqu'un aurait une piste. Cela doit être possible car des freewares ou sharewares le font sans problèmes sous Vista
A + et bonne nuit

La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.

GRENIER Alain
0
cs_Willi Messages postés 2375 Date d'inscription jeudi 12 juillet 2001 Statut Modérateur Dernière intervention 15 décembre 2018 22
5 oct. 2008 à 11:59
Re bonjour
Si je suis la c'est que j'ai une bonne nouvelle pour toi.
Je viens de monter une application console vierge afin d'effectuer des tests avec LockFile/UnlockFile. Le résultat est bon
Si tu es intéressé envoi moi un MP. (Je tiens à présicer que tu devras fournir la solution ici par la suite)

++
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Willi Messages postés 2375 Date d'inscription jeudi 12 juillet 2001 Statut Modérateur Dernière intervention 15 décembre 2018 22
5 oct. 2008 à 12:00
PS: J'ai fait les tests uniquement sous VB2008 sous Vista.
0
Profil bloqué
6 oct. 2008 à 01:19
Merci à Willi pour le travail qu'il a fourni mais si cela fonctionnait correctement avec un fichier cela ne fonctionnait point avec un handle sur une partition.
Pour les 2 projets Acces Direct disques et Partitions ( un en VB 6.0 et un en VB net) j'ai tout simplement supprimer le fonction de purge des clusters libres d'une partition.
Je mettrai à jour les 2 projet dans peu de temps car j'ai encore quelques trucs à fignoler dessus. Ainsi les 2 projets seront fonctionnels et sans bugs (ou du moins je l'espère)
Quant à ce topic je ne le ferme point pour l'instant car j'espère toujours trouver la solution

A+ et merci à tous (surtout Willi et Gillardg)
  
 
la théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.

GRENIER Alain
0
cs_Willi Messages postés 2375 Date d'inscription jeudi 12 juillet 2001 Statut Modérateur Dernière intervention 15 décembre 2018 22
6 oct. 2008 à 17:57
Utiliser la méthode LockFile autre que sur un fichier, j'ai des doutes quand au résultat
Sur la MSDN il est bien précisé attend un handle valide pour un fichier et pas autre chose !

++
0
Profil bloqué
6 oct. 2008 à 18:18
Salut Willi
Je peux te jurer sur une caisse de bibles que le code précisé en début de ce topic fonctionnait correctement en VB 6.0 sur Windows XP.
Lorsque j'accède sur le projet VB net avec Windows Vista à la partition "C:" par exemple avec Createfile j'ai bien un handle valide car ensuite un SetfilePointer et un ReadFile me permet de lire dans un tableau de bytes le contenu d'un ou de plusieurs secteurs consécutifs de cette partition
Par contre c'est bien Lockfile qui ne veut pas verrouiller la partition bien que le handle soit valide et que les 4 autres paramètres associés à Lockfile soient corrects et ceci dans 3 cas
 - Xp et VB Net
 - Vista et VB 6.0
 - Vista et VB Net
En tout cas je cherche et j'y arriverais
Merci pour tout et A+

La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.

GRENIER Alain
0
cs_Willi Messages postés 2375 Date d'inscription jeudi 12 juillet 2001 Statut Modérateur Dernière intervention 15 décembre 2018 22
6 oct. 2008 à 18:45
Je pense qu'il serait intéressant d'exposer cela sur le forum de cppf pour essayer d'obtenir une explication sur LockFile.
Je vais tester en C sous XP et Vista pour voir le résultat obtenu de LockFile sur une partition. Je t'exposerai mes résultats

++
0
Profil bloqué
9 oct. 2008 à 22:37
Salut à Willi et Gillardg
Même en enlevant Lockfile et UnLockFile le code ne fonctionne point car on se retrouve avec une erreur 6 de Windows (descripteur non valide)sur l'Api WriteFile. J'ai tenté car on écrit sur les clusters libres qui ne contiennent pas de données donc peut-être n'y avait-il pas besoin de vérrouiller la partition.
aucun piste fiable et sérieuse n'a été trouvée sur le Net
si dans une semaine je n'ai rien trouvé je fermerai ce topic

A+ et bonne programmation

La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.

GRENIER Alain
0
cs_Willi Messages postés 2375 Date d'inscription jeudi 12 juillet 2001 Statut Modérateur Dernière intervention 15 décembre 2018 22
10 oct. 2008 à 13:32
0
Profil bloqué
10 oct. 2008 à 17:47
Salut Willi
Merci pour le sujet intéressant mais je l'ai déjà lu et testé (c'est même le sujet sur le Net dont je parle)
J'ai tenté de le faire fonctionner en VB 6.0 avec Vista mais j'ai eu 2 fois un échec.Mais je cherche le hic

si j'ai bien compris l'article
il faut
- ouvrir le disque physique et la partition logique avec Createfile
- verrouiller le disque physique et la partition logique avec Deviceiocontrol et FSCTL_LOCK_VOLUME
- écrire sur le secteur physique du disque (secteur physique disque = secteur logique partition + offset partition)
- déverrouiller le disque physique et la partition logique avec Deviceiocontrol et FSCTL_UNLOCK_VOLUME
- CloseHandle disque et partition
Toi qui a l'air d'être plus anglophile que moi peux-tu me confirmer si cela est correct ?

Je vais m'y remettre ce week-end : l'espoir fait vivre et je suis tétu

A+ Willi

Lathéorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.

GRENIER Alain
0
Profil bloqué
10 oct. 2008 à 22:13
Pour Willi
Rien ne fonctionne
Writefile me renvoie une erreur 6 (descripteur non valide) alors que les 2 Createfile et les 2 verrouillages logique et physique fonctionnent.Le SetfilePointer sur le secteur physique fonctionne.J'ai trouvé par code comment savoir les associations partitions logiques-disques physiques.Je connais les offsets de mes partitions par rapport au début du disque physique.Je suis administrateur sur mon poste.
Je ne vois pas l'erreur sur Writefile

La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.

GRENIER Alain
0
cs_Willi Messages postés 2375 Date d'inscription jeudi 12 juillet 2001 Statut Modérateur Dernière intervention 15 décembre 2018 22
11 oct. 2008 à 00:18
Oui tu as bien compris les différentes étapes du sujet traité dans le lien donné précèdemment.

Si tu as testé cela dans un projet vierge, peux-tu fournir la déclaration de WriteFile ainsi que le code utilisé pour tester stp.
++
0
Profil bloqué
11 oct. 2008 à 00:32
Salut Willi
Je n'ai pas essayé sur un projet vierge mais sur mon propre projet
Je vais voir pour faire un projet vierge sur Vista en VB 6.0 (j'y suis plus à l'aise que VB Net). Ensuite je n'aurai plus qu'à le transcrire en VB Net
Ensuite je te dirai ce qu'il en est .

A+ et merci

La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.

GRENIER Alain
0
Rejoignez-nous