Comment tirer profits des fonctions de chkdsk (fmifs.dll) sous xp avec du code vb...

Soyez le premier à donner votre avis sur cette source.

Vue 4 871 fois - Téléchargée 276 fois

Description

Ce code montre comment utiliser la dll fmifs.dll pour obtenir les memes focntionalités que Chkdsk de Windows NT/2000/XP.

Ce code est adapté de l'article de Mark Russinovich, expert en Windows NT/2000/XP : http://www.sysinternals.com/ntw2k/source/fmifs.shtml

Cette article fait la lumière sur les fonctions non documentées de fmifs.dll

N'hésitez pas à y jeter un oeuil et meme les deux...Je vous assure ce site vaut le detour pour les passionés d'Internals of Windows...in english of course...

N'hésitez pas à aller sur http://www.sysinternals.com/ !

Source / Exemple :


Option Explicit
'Ce code est adapté de l'article de Mark Russinovich,
'expert en Windows NT/2000/XP
'http://www.sysinternals.com/ntw2k/source/fmifs.shtml

'
' structure de la commande OUTPUT
'
Public Type TEXTOUTPUT
    Lines As Long
    Output As String
End Type

'
' Commande passée à la callback
'
Public Enum CALLBACKCOMMAND
    Progress = 0
    DONEWITHSTRUCTURE
    UNKNOWN2
    UNKNOWN3
    UNKNOWN4
    UNKNOWN5
    INSUFFICIENTRIGHTS
    UNKNOWN7
    UNKNOWN8
    UNKNOWN9
    UNKNOWNA
    DONE
    UNKNOWNC
    UNKNOWND
    Output
    STRUCTUREPROGRESS
End Enum

'
' focntion Chkdsk
'
Public Declare Sub Chkdsk Lib "fmifs.dll" (ByVal DriveRoot As Long, _
                        ByVal Format As Long, _
                        ByVal CorrectErrors As Byte, _
                        ByVal Verbose As Byte, _
                        ByVal CheckOnlyIfDirty As Byte, _
                        ByVal ScanDrive As Byte, _
                        ByVal Unused2 As Long, _
                        ByVal Unused3 As Long, _
                        ByVal Callback As Long)

'des focntions pour le controle de la mémoire et des pointeurs
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Public Declare Function IsBadReadPtr Lib "kernel32" (ByVal lp As Long, ByVal ucb As Long) As Long
Public Declare Function IsBadStringPtr Lib "kernel32" Alias "IsBadStringPtrA" (ByVal lpsz As Long, ByVal ucchMax As Long) As Long
Public Declare Function lstrlen Lib "kernel32" Alias "lstrlenW" (ByVal lpString As Long) As Long
Public Declare Function OemToChar Lib "user32" Alias "OemToCharA" (ByVal lpszSrc As String, ByVal lpszDst As String) As Long
Public Declare Function GetVolumeInformation Lib "kernel32" Alias "GetVolumeInformationA" (ByVal lpRootPathName As String, ByVal lpVolumeNameBuffer As String, ByVal nVolumeNameSize As Long, lpVolumeSerialNumber As Long, lpMaximumComponentLength As Long, lpFileSystemFlags As Long, ByVal lpFileSystemNameBuffer As String, ByVal nFileSystemNameSize As Long) As Long
Public Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, ByVal lpSecurityAttributes As Long, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long
Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Public Const GENERIC_READ = &H80000000
Public Const GENERIC_WRITE = &H40000000
Public Const OPEN_EXISTING = 3

'
' FMIFS fontion callback
'
Public Function PFMIFSCALLBACK(ByVal Command As Long, ByVal SubAction As Long, ByVal ActionInfo As Long) As Byte
    Dim percent As Long
    Dim status As Long
    Dim OutStrPtr As Long, OutLines As Long
    Dim OutLen As Long, Output As String

    DoEvents
    
    '
    ' La callback recoit d'autres messages sans importance
    '
    Select Case Command
        Case 0 'PROGRESS
            ' si c un message de progression, ActionInfo contient un pointeur vers un long qui représente le pourcentage
            'on le copie
            CopyMemory ByVal VarPtr(percent), ByVal ActionInfo, 4
            'on actualise l'affichage
            Form1.PB.Value = percent
        Case 14 'OUTPUT
            'si c un message d'affichage, ActionInfo contient un pointeur vers un long et vers un pointeur vers une chaine de caracteres
            'on verifie si ActionInfo est un pointeur valide pour lecture
            If IsBadReadPtr(ByVal ActionInfo, 8) = 0 Then
                'si oui, on copie le nombre de lignes du message
                CopyMemory ByVal VarPtr(OutLines), ByVal ActionInfo, 4
                'on copie le pointeur vers une chaine
                CopyMemory ByVal VarPtr(OutStrPtr), ByVal ActionInfo + 4, 4
                'on verifie si ce pointeur est un pointeur de texte valide
                If IsBadStringPtr(ByVal OutStrPtr, 255) = 0 Then
                    'si oui, on cherhce la longueur du texte
                    OutLen = lstrlen(ByVal OutStrPtr)
                    'on prépare un buffer
                    Output = Space(OutLen * 2)
                    'on copie le texte
                    CopyMemory ByVal StrPtr(Output), ByVal OutStrPtr, OutLen * 2
                    'on le convertit d'unicode en Ansi
                    Output = StrConv(Output, vbUnicode, 1036)
                    'on le convertit de OEM Ansi en Ansi
                    OemToChar Output, Output
                    'on supprime les caracteres apres le null
                    Output = Mid$(Output, 1, InStr(Output, vbNullChar) - 1)
                    'on affiche le message
                    Form1.List1.AddItem Output
                End If
            End If
    Case 11 'DONE
        'si c un message qui annonce la fin d'un traitement
        'on copie le status
        CopyMemory ByVal VarPtr(status), ByVal ActionInfo, 1
        'si le status est 0 c qu'il s'est produit une erreur
        If status = 0 Then
        Form1.List1.AddItem "Une erreur s'est produite pendant la vérification du disque !"
        Else
        Form1.List1.AddItem "Terminé avec succés !"
        End If
    Case Else
        'sinon commande inconnue
        Form1.List1.AddItem "Callback Command Unknown. (Command=" & Command & ",SubAction=" & SubAction & ",ActionInfo=" & ActionInfo & ")"
    End Select
    
    Form1.List1.ListIndex = Form1.List1.NewIndex
    
    'on renvoie toujours 1
    PFMIFSCALLBACK = 1
End Function

Conclusion :


N'hésitez pas non plus à commenter et à noter...

ATTENTION : ce code reproduit le fonctionnement de Chkdsk, aussi, il est préférable de l'utiliser en mode lecture seule (si vous avez peur de prb).
Ni moi, ni l'auteur de l'article (www.sysinternals.com) ne serions etre responsable d'un quelconque endommagement de votre disque...

pour les tests, utilisez de préférences une disquette : c moins dangeraux en cas de fausses manip ou d'arret brutal de VB...ca peut arriver..si si...

encore une fois ce code utilise la dll de microsoft donc ce code n'est pas plus dangereux que Chkdsk...faites tout de même attention quand à l'urilisation du mode Correction des erreurs...

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
2375
Date d'inscription
jeudi 12 juillet 2001
Statut
Modérateur
Dernière intervention
15 décembre 2018
20
Merci pour ces précisions !
Messages postés
2676
Date d'inscription
vendredi 28 juin 2002
Statut
Membre
Dernière intervention
13 janvier 2016
14
salut,

voilà une traduction en VB.Net de cette source : http://www.vbfrance.com/code.aspx?ID=35536

sinon, CopyMemory ByVal VarPtr(OutStrPtr), ByVal ActionInfo + 4, 4,ca veut dire "copier dans OutStrPtr le Long qui est à 4 octets de l'adresse stockée dans ActionInfo" : en pseudo C : OutStrPtr=((long*)ActionInfo)[1]...

ShareVB
Messages postés
2375
Date d'inscription
jeudi 12 juillet 2001
Statut
Modérateur
Dernière intervention
15 décembre 2018
20
Bonjour,
ShareVB, je passe ta source en .net2 mais peut tu m'expliquer la ligne 91:
--> CopyMemory ByVal VarPtr(OutStrPtr), ByVal ActionInfo + 4, 4
Que fais ActionInfo + 4 ?? Je n'arrive pas à le retranscrire en .net
C'est ce qui me pose problème :(
Ou sinon as-tu peux-être déjà ta source en .net ??
Merci d'avance
Messages postés
9
Date d'inscription
jeudi 12 juin 2003
Statut
Membre
Dernière intervention
31 décembre 2003

Merci ShareVB de partager tes sources avec la communauté ! et le site que tu donnes en ref. et à la hauteur de ton pseudo.
So, TKS !
(je finis par culpabiliser à surfer sur VB, à augmenter ma connaissance sans encourager ceux qui y participent)

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.