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

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

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.