Nettoyer les fichiers Index.Dat verrouillés

Programmation d'applications complexes
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Nettoyer les fichiers Index.Dat verrouillés

Message par Jacobus »

Hello, voici un code complet pour faire cette tâche.
Un défaut à corriger et donc besoin de vos lumières pour y remédier. Le programme ne fonctionne qu'une fois de temps en temps et je ne comprend pas pourquoi. Je pense qu'il s'agit d'une question de priorité et qu'il faut trouver le moyen de faire fonctionner le programme avant explorer.exe de Windows lors du démarrage système.
Il nécessite d'être administrateur. Il faut compiler en exe pour tester.
A savoir : lorsque les fichiers sont effacés ou recréés vierges, Windows les met à jour automatiquement, il n'y a donc aucun danger pour votre système. je donne le code complet pour que vous voyez bien ce qu'il se passe dans son fonctionnement.

Voilà, si vous trouvez la solution pour qu'il fonctionne à tous coups ce sera très bien et vous aurez un programme perso pour effacer vos traces de navigations 8)

Code pour PB 4.02

Code : Tout sélectionner

;/ INDEXDATCLEANER beta by Jacobus 30/08/2007
;/ Nettoyeur des fichiers Index.dat verrouillés
;/ Nécessite le redémarrage système
;/ Programme complet / non terminé
;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
;/ Fonctionne "parfois" d'où la nécessité de tests sur d'autres machines
;/ voire d'améliorations à apporter si vous en trouvez pour que cela fonctionne à tous les coups.
;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
;-Constantes
Enumeration
#WIN_IndexDatCleaner
#FramePrefsDatFiles
#Text_PrefsDatFiles
#CHECK_TIF_IE5_INDEXDAT
#CHECK_COOKIES_INDEXDAT
#CHECK_HISTORY_IE5_INDEXDAT
#Text_SizeOf_TIFIE5_INDEXDAT
#Text_SizeOf_COOKIES_INDEXDAT
#Text_SizeOf_HISTORY_INDEXDAT
#CHECK_HISTORY_IE5_URL_INDEXDAT
#BtnScanUrlIndexDat
#ListIconUrlIndexDatFiles
#FrameActivateDatFiles
#ActivateDeleteIndexDat
#Text_ActivateDeleteIndexDat
#Text_LastProcessDatFiles
#Container_Resultat
#TxtResultat_1
#TxtResultat_2
#TxtResultat_3
#TxtResultat_4
#NewTIFFileDat
#NewCookiesFileDat
#NewHistoryFileDat
#BtnReboot
#BtnCancel
#BtnQuit
EndEnumeration
#ProgramName = "IndexDatCleaner" 
Global Font0, REP$
Font0 = LoadFont(0, "Comic Sans MS", 9,#PB_Font_Bold)
REP$ = GetCurrentDirectory()

ProcedureDLL.s GetSystemDirectory(NumDir.l)
    hKey.l = 0
    keyvalue.s = Space(255)
    datasize.l = 255
    If NumDir < 24 Or NumDir = 36
        OpenKey.l = #HKEY_CURRENT_USER
    Else
        OpenKey.l = #HKEY_LOCAL_MACHINE
    EndIf
    SubKey.s = "Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders"
    Select NumDir ; french XP
     ;current user
        Case 1 : ValueName.s = "Administrative Tools"
        Case 2 : ValueName.s = "AppData"
        Case 3 : ValueName.s = "Cache"   ; need for path
        Case 4 : ValueName.s = "CD Burning"
        Case 5 : ValueName.s = "Cookies" ; need...
        Case 6 : ValueName.s = "Desktop"
        Case 7 : ValueName.s = "Favorites"
        Case 8 : ValueName.s = "Fonts"
        Case 9 : ValueName.s = "History" ; need...
        Case 10 : ValueName.s = "Local AppData"
        Case 11 : ValueName.s = "Local Settings"
        Case 12 : ValueName.s = "My Music"
        Case 13 : ValueName.s = "My Pictures"
        Case 14 : ValueName.s = "My Video"
        Case 15 : ValueName.s = "NetHood"
        Case 16 : ValueName.s = "Personal"
        Case 17 : ValueName.s = "PrintHood"
        Case 18 : ValueName.s = "Programs"
        Case 19 : ValueName.s = "Recent"
        Case 20 : ValueName.s = "SendTo"
        Case 21 : ValueName.s = "Start Menu"
        Case 22 : ValueName.s = "Startup"
        Case 23 : ValueName.s = "Templates"
        Case 36 : ValueName.s = "AppData"            
     ;all users           
        Case 24 : ValueName.s = "Common Administrative Tools"
        Case 25 : ValueName.s = "Common AppData"
        Case 26 : ValueName.s = "Common Desktop"
        Case 27 : ValueName.s = "Common Documents"
        Case 28 : ValueName.s = "Common Favorites"
        Case 29 : ValueName.s = "Common Programs"
        Case 30 : ValueName.s = "Common Start Menu"
        Case 31 : ValueName.s = "Common Startup"
        Case 32 : ValueName.s = "Common Templates"
        Case 33 : ValueName.s = "CommonMusic"
        Case 34 : ValueName.s = "CommonPictures"
        Case 35 : ValueName.s = "CommonVideo"
    EndSelect
    
    If RegOpenKeyEx_(OpenKey, SubKey, 0, #KEY_READ, @hKey)
        MessageBeep_(#MB_ICONEXCLAMATION)
        keyvalue = "Don't key exist!"
    Else
        If RegQueryValueEx_(hKey, ValueName, 0, 0, @keyvalue, @datasize)
            keyvalue = "" 
        Else
            keyvalue = Left(keyvalue, datasize - 1)
        EndIf
        RegCloseKey_(hKey)
    EndIf
    If Flag = 36
        keyvalue = keyvalue + "\Microsoft\Internet Explorer\Quick Launch"
    EndIf
    If Right(keyvalue, 1) <> "\" : keyvalue = keyvalue + "\" : EndIf
    
    ProcedureReturn keyvalue
EndProcedure

Procedure ComputerShutDown(Param.l) 
  
  #TOKEN_ADJUST_PRIVILEGES = 32 
  #TOKEN_QUERY = 8 
  #SE_PRIVILEGE_ENABLED = 2 
  #EWX_LOGOFF = 0 
  #EWX_SHUTDOWN = 1 
  #EWX_REBOOT = 2 
  #EWX_FORCE = 4 
  #EWX_POWEROFF = 8 
  
  Structure MyLUID 
    LowPart.l 
    HighPart.l 
    Attributes.l 
  EndStructure 
  
  Structure MyTOKEN 
    PrivilegeCount.l 
    LowPart.l 
    HighPart.l 
    Attributes.l 
  EndStructure 
  
  Protected hdlTokenHandle.l, tmpLuid.MyLUID, tkp.MyTOKEN, tkpNewButIgnored.MyTOKEN, lBufferNeeded.l 

  OpenProcessToken_(GetCurrentProcess_(), #TOKEN_ADJUST_PRIVILEGES | #TOKEN_QUERY, @hdlTokenHandle) 
  SysName.s = "" + Chr(0) 
  Name.s = "SeShutdownPrivilege" + Chr(0) 
  LookupPrivilegeValue_(SysName, Name, @tmpLuid) 
  tmpLuid\Attributes = #SE_PRIVILEGE_ENABLED 
  tkp\PrivilegeCount = 1 
  tkp\LowPart = tmpLuid\LowPart 
  tkp\HighPart = tmpLuid\HighPart 
  tkp\Attributes = tmpLuid\Attributes 
  AdjustTokenPrivileges_(hdlTokenHandle, 0, @tkp, SizeOf(MyTOKEN), @tkpNewButIgnored, @lBufferNeeded) 
  
  Select Param ; Param = paramètre d'instinction de l'ordinateur 
    Case 1 : ExitWindowsEx_(#EWX_LOGOFF | #EWX_FORCE, 0) ; 1 = quitter session
    Case 2 : ExitWindowsEx_(#EWX_SHUTDOWN | #EWX_FORCE, 0) ; 2 = arrêter
    Case 3 : ExitWindowsEx_(#EWX_REBOOT | #EWX_FORCE, 0) ; 3 = redémarrer
  EndSelect ; on se sert de 3 dans le cas qui nous intéresse 
  
EndProcedure 

;-----------------Registry functions
Procedure.l DeleteRegValue(topKey.l, sKeyName.s, sValueName.s)  
    GetHandle.l  
    hKey.l  
    lReturnCode.l  
    lhRemoteRegistry.l  
     
    If Left(sKeyName, 1) = "\"  
        sKeyName = Right(sKeyName, Len(sKeyName) - 1)  
    EndIf  
     
    GetHandle = RegOpenKeyEx_(topKey, sKeyName, 0, #KEY_ALL_ACCESS, @hKey)  

    If GetHandle = #ERROR_SUCCESS  
        GetHandle = RegDeleteValue_(hKey, @sValueName)  
        If GetHandle = #ERROR_SUCCESS  
            DeleteValue = #True  
        Else  
            DeleteValue = #False  
        EndIf  
    EndIf  
    RegCloseKey_(hKey)  
    ProcedureReturn DeleteValue  
EndProcedure 

Procedure.l CreateRegKey(topKey, sKeyName.s)  
    hNewKey.l  
    lpSecurityAttributes.SECURITY_ATTRIBUTES  
    GetHandle.l  
    lReturnCode.l  
    lhRemoteRegistry.l  
 
    If Left(sKeyName, 1) = "\"  
        sKeyName = Right(sKeyName, Len(sKeyName) - 1)  
    EndIf  
     
    GetHandle = RegCreateKeyEx_(topKey, sKeyName, 0, 0, #REG_OPTION_NON_VOLATILE, #KEY_ALL_ACCESS, @lpSecurityAttributes, @hNewKey, @GetHandle)  

    If GetHandle = #ERROR_SUCCESS  
        GetHandle = RegCloseKey_(hNewKey)  
        CreateKey = #True  
    Else  
        CreateKey = #False  
    EndIf  
    ProcedureReturn CreateKey  
EndProcedure

Procedure.l SetRegValue(topKey.l, sKeyName.s, sValueName.s, vValue.s, lType.l)  
  GetHandle.l  
  hKey.l  
  lType.l  
  lpcbData.l  
  lpData.s  
  lReturnCode.l  
  lhRemoteRegistry.l  
   
  If Left(sKeyName, 1) = "\"  
    sKeyName = Right(sKeyName, Len(sKeyName) - 1)  
  EndIf   

  GetHandle = RegOpenKeyEx_(topKey, sKeyName, 0, #KEY_ALL_ACCESS, @hKey)  
 
  If GetHandle = #ERROR_SUCCESS  
    lpcbData = 255  
    lpData = Space(255)  
       
    Select lType  
      Case #REG_SZ  
        GetHandle = RegSetValueEx_(hkey, sValueName, 0, #REG_SZ, @vValue, Len(vValue) + 1)  
      Case #REG_DWORD  
        lValue = Val(vValue)  
        GetHandle = RegSetValueEx_(hKey, sValueName, 0, #REG_DWORD, @lValue, 4)  
    EndSelect  
       
    RegCloseKey_(hkey)  
    ergebnis = 1  
    ProcedureReturn ergebnis  
  Else  
      
    RegCloseKey_(hKey)  
    ergebnis  = 0  
    ProcedureReturn ergebnis  
  EndIf  
EndProcedure 
 
Procedure.s GetRegValue(topKey, sKeyName.s, sValueName.s)  
   GetHandle.l  
   hKey.l  
   lpData.s  
   lpDataDWORD.l  
   lpcbData.l  
   lType.l  
   lReturnCode.l  
   lhRemoteRegistry.l  
   Shared getRegValue.s  
     
   If Left(sKeyName, 1) = "\"  
       sKeyName = Right(sKeyName, Len(sKeyName) - 1)  
   EndIf  

   GetHandle = RegOpenKeyEx_(topKey, sKeyName, 0, #KEY_ALL_ACCESS, @hKey)  
            
   If GetHandle = #ERROR_SUCCESS  
       lpcbData = 255  
       lpData = Space(255)  
         
       GetHandle = RegQueryValueEx_(hKey, sValueName, 0, @lType, @lpData, @lpcbData)  
             
       If GetHandle = #ERROR_SUCCESS  
           Select lType  
               Case #REG_SZ  
                   GetHandle = RegQueryValueEx_(hKey, sValueName, 0, @lType, @lpData, @lpcbData)  
                 
                   If GetHandle = 0  
                       getRegValue = Left(lpData, lpcbData - 1)  
                   Else  
                       getRegValue = ""  
                   EndIf  
                     
               Case #REG_DWORD  
                   GetHandle = RegQueryValueEx_(hKey, sValueName, 0, @lpType, @lpDataDWORD, @lpcbData)  
                     
                   If GetHandle = 0  
                       getRegValue = Str(lpDataDWORD)  
                   Else  
                       getRegValue = "0"  
                   EndIf  
                 
           EndSelect  
       EndIf  
   EndIf  
   RegCloseKey_(hKey)  
   ProcedureReturn GetRegValue  
EndProcedure 

;-----------------Program functions
Procedure ActivateIndexDatCleaner()
  ; création de la clé de registre et des sous clés qui seront lues au redémarrage
  ; ceci à chaque modif des checkBox correspondantes
  CreateRegKey(#HKEY_LOCAL_MACHINE, "Software\"+#ProgramName)
  
  SetRegValue(#HKEY_LOCAL_MACHINE, "Software\"+#ProgramName, "IndexDatCleaner actif", Str(GetGadgetState(#ActivateDeleteIndexDat)), #REG_DWORD)
  SetRegValue(#HKEY_LOCAL_MACHINE, "Software\"+#ProgramName, "Chk_TIF_IE5_INDEXDAT" , Str(GetGadgetState(#CHECK_TIF_IE5_INDEXDAT)), #REG_DWORD)
  SetRegValue(#HKEY_LOCAL_MACHINE, "Software\"+#ProgramName, "Chk_COOKIES_INDEXDAT" , Str(GetGadgetState(#CHECK_COOKIES_INDEXDAT)), #REG_DWORD) 
  SetRegValue(#HKEY_LOCAL_MACHINE, "Software\"+#ProgramName, "Chk_HISTORY_IE5_INDEXDAT", Str(GetGadgetState(#CHECK_HISTORY_IE5_INDEXDAT)), #REG_DWORD) 
  SetRegValue(#HKEY_LOCAL_MACHINE, "Software\"+#ProgramName, "Chk_HISTORY_IE5_URL_INDEXDAT", Str(GetGadgetState(#CHECK_HISTORY_IE5_URL_INDEXDAT)), #REG_DWORD)
  
EndProcedure

Procedure.l VerifIndexDatCleanerActivate() ; vérifie qu'IndexDatCleaner a été activé pour effectuer les tâches lors du prochain redémarrage
  a.s = GetRegValue(#HKEY_LOCAL_MACHINE, "Software\"+#ProgramName, "IndexDatCleaner actif")
  ProcedureReturn Val(a)
EndProcedure 

Procedure LoadIndexDatCleaner()
  ; Chargement des paramètres dans le programme
  a.s = GetRegValue(#HKEY_LOCAL_MACHINE, "Software\"+#ProgramName, "IndexDatCleaner actif")
  b.s = GetRegValue(#HKEY_LOCAL_MACHINE, "Software\"+#ProgramName, "Chk_TIF_IE5_INDEXDAT")
  c.s = GetRegValue(#HKEY_LOCAL_MACHINE, "Software\"+#ProgramName, "Chk_COOKIES_INDEXDAT")
  d.s = GetRegValue(#HKEY_LOCAL_MACHINE, "Software\"+#ProgramName, "Chk_HISTORY_IE5_INDEXDAT")
  e.s = GetRegValue(#HKEY_LOCAL_MACHINE, "Software\"+#ProgramName, "Chk_HISTORY_IE5_URL_INDEXDAT")
  
  SetGadgetState(#ActivateDeleteIndexDat, Val(a))
  SetGadgetState(#CHECK_TIF_IE5_INDEXDAT, Val(b))
  SetGadgetState(#CHECK_COOKIES_INDEXDAT, Val(c))
  SetGadgetState(#CHECK_HISTORY_IE5_INDEXDAT, Val(d))
  SetGadgetState(#CHECK_HISTORY_IE5_URL_INDEXDAT, Val(e))
  
EndProcedure

Procedure CleanIndexDat() ; Fonction de nettoyage qu'on appellera dans un thread
  
  ;Récupération des valeurs du registre
  a.s = GetRegValue(#HKEY_LOCAL_MACHINE, "Software\"+#ProgramName, "IndexDatCleaner actif")
  b.s = GetRegValue(#HKEY_LOCAL_MACHINE, "Software\"+#ProgramName, "Chk_TIF_IE5_INDEXDAT")
  c.s = GetRegValue(#HKEY_LOCAL_MACHINE, "Software\"+#ProgramName, "Chk_COOKIES_INDEXDAT")
  d.s = GetRegValue(#HKEY_LOCAL_MACHINE, "Software\"+#ProgramName, "Chk_HISTORY_IE5_INDEXDAT")
  e.s = GetRegValue(#HKEY_LOCAL_MACHINE, "Software\"+#ProgramName, "Chk_HISTORY_IE5_URL_INDEXDAT")
 ; actions en fonction des valeurs 1 = OK et 0 = NO
 If Val(b) = 1
   TIFFileDat.s = GetSystemDirectory(3)+"Content.IE5\index.dat" 
     If CreateFile(#NewTIFFileDat,TIFFileDat.s)
      CloseFile(#NewTIFFileDat)
      Res1$ = " OK    ..\Content.IE5\index.dat > CLEAN-OUT  - "+FormatDate("%dd/%mm/%yyyy à %hh:%ii:%ss", Date())
       Else 
      Res1$ = " ERROR   ..\Content.IE5\index.dat - CLEANING FAILED!"
     EndIf
 Else 
  Res1$ = " NO   ..\Content.IE5\index.dat - CLEANING DISABLED"
 EndIf 
 
 If Val(c) = 1
  CookiesFileDat.s = GetSystemDirectory(5)+"index.dat" 
     If CreateFile(#NewCookiesFileDat,CookiesFileDat.s)
      CloseFile(#NewCookiesFileDat)
      Res2$ = " OK    ..\Cookies\index.dat > CLEAN-OUT  - "+FormatDate("%dd/%mm/%yyyy à %hh:%ii:%ss", Date())
        Else 
      Res2$ = " ERROR   ..\Cookies\index.dat - CLEANING FAILED!"
     EndIf
 Else 
   Res2$ = " NO   ..\Cookies\index.dat - CLEANING DISABLED"
 EndIf 
 
 If Val(d) = 1 
   HistoryFileDat.s = GetSystemDirectory(9)+"History.IE5\index.dat"
     If CreateFile(#NewHistoryFileDat,HistoryFileDat.s)
      CloseFile(#NewHistoryFileDat)
      Res3$ = " OK    ..\History.IE5\index.dat > CLEAN-OUT  - "+FormatDate("%dd/%mm/%yyyy à %hh:%ii:%ss", Date())
       Else 
      Res3$ = " ERROR   ..\History.IE5\index.dat - CLEANING FAILED!"
     EndIf
 Else 
   Res3$ = " NO   ..\History.IE5\index.dat - CLEANING DISABLED"
 EndIf 
 
 If Val(e) = 1
   If DeleteDirectory(GetSystemDirectory(9)+"History.IE5","*.*",#PB_FileSystem_Recursive|#PB_FileSystem_Force)
     CreateDirectory(GetSystemDirectory(9)+"History.IE5") 
      Res4$ = " OK    ..\History.IE5\<DateFolder>\index.dat > CLEAN-OUT  - "+FormatDate("%dd/%mm/%yyyy à %hh:%ii:%ss", Date())
     Else 
      Res4$ = " ERROR   ..\History.IE5\<DateFolder>\index.dat - INCOMPLETE CLEANING!"
   EndIf
 Else 
   Res4$ = " NO   ..\History.IE5\<DateFolder>\index.dat - CLEANING DISABLED"
 EndIf
 
 Createlog = CreatePreferences(GetHomeDirectory()+"idatc.ini") ; création du log dans le dossier temp utilisateur
  If Createlog <>0
     WritePreferenceString("tifiles",Res1$)
     WritePreferenceString("cookies",Res2$)
     WritePreferenceString("history",Res3$)
     WritePreferenceString("Urlhistory",Res4$)
     ClosePreferences()
  EndIf
  SetGadgetState(#ActivateDeleteIndexDat,0) ; désactive IndexDatCleaner aprés travail
  ActivateIndexDatCleaner(); enregistre nouvelles données registre
 End 
EndProcedure 
;-----------------Search Index.Dat files
Declare SearchDatInDirectory(Path.s,Mask.s)
Declare SearchFiles(Path.s,Mask.s)

ProcedureDLL SearchFilesInit(Path.s,Mask.s,Recurse.l) 
; Recurse = 1 : Scan SubDirectories of Path
; Recurse = 0 : Don't scan Subdirectories of Path
  Static Flag.l
  If Flag=0
    Global NewList Fichiers.s()
    Flag=1
  Else
    ClearList(Fichiers())
  EndIf
  
  SearchFiles(Path,Mask)
  If Recurse
    SearchDatInDirectory(Path,Mask)
  EndIf
  
  ProcedureReturn CountList(Fichiers())
EndProcedure

Procedure SearchFiles(Path.s,Mask.s)
  
  If Right(Path,1)<>"\" : Path+"\":EndIf
  lpFindFileData.WIN32_FIND_DATA
  Recherche.s=Path+Mask
  handle.l = FindFirstFile_(Recherche, @lpFindFileData)
  
  If handle <> #INVALID_HANDLE_VALUE   
    Repeat
      Trouve.s=PeekS(@lpFindFileData\cFileName)
      If lpFindFileData\dwFileAttributes & #FILE_ATTRIBUTE_DIRECTORY =#False
          AddElement(Fichiers.s())
          Fichiers()=Path+Trouve         
      EndIf
    Until FindNextFile_(handle, @lpFindFileData)= #False
    FindClose_(handle)    
  EndIf
  
  
EndProcedure
  
Procedure SearchDatInDirectory(Path.s,Mask.s)
  
  If Right(Path,1)<>"\" : Path+"\":EndIf
  lpFindFileData.WIN32_FIND_DATA
  Recherche.s=Path+"*.*"
  handle.l = FindFirstFile_(Recherche, @lpFindFileData)

If handle <> #INVALID_HANDLE_VALUE
  Repeat
    Trouve.s=PeekS(@lpFindFileData\cFileName)
    If lpFindFileData\dwFileAttributes & #FILE_ATTRIBUTE_DIRECTORY
      If Trouve <>"." And Trouve <>".."
        SearchDatInDirectory(Path+Trouve,Mask)
        SearchFiles(Path+Trouve,Mask)  
      EndIf
    EndIf
  Until FindNextFile_(handle, @lpFindFileData)= #False
  FindClose_(handle)  
EndIf

EndProcedure

ProcedureDLL.s SearchFilesGet()
  
  Static Pointeur
   
  If Pointeur >= CountList(Fichiers())
    Pointeur=0
  Else
    SelectElement(Fichiers(),Pointeur)
    Retour.s=Fichiers()
    Pointeur+1
  EndIf
  
  ProcedureReturn Retour.s
EndProcedure



;-Main window
ExamineDesktops()
  Largeur$ = Str(DesktopWidth(0))
  Hauteur$ = Str(DesktopHeight(0))
  If Val(Largeur$)>800 And Val(Hauteur$)>600
    FlagWin = #PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered|#PB_Window_TitleBar
  Else 
    FlagWin = #PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_TitleBar
  EndIf 
  
If OpenWindow(#WIN_IndexDatCleaner,0,0,790,550,#ProgramName ,FlagWin)=0 Or CreateGadgetList(WindowID(#WIN_IndexDatCleaner))=0 
End 
EndIf
  
  Frame3DGadget(#FramePrefsDatFiles,5,5,775,360,"Nettoyage des fichiers Index.Dat verrouillés")  
  TextGadget(#Text_PrefsDatFiles, 30,30,720,15,"Sélectionnez les fichiers de traces Internet Explorer à nettoyer au prochain démarrage de Windows")
  SetGadgetFont(#Text_PrefsDatFiles, Font0)
  
  CheckBoxGadget(#CHECK_TIF_IE5_INDEXDAT, 30, 70, 500, 20, "  Index.Dat dans    ..\Temporary Internet Files  ( historique des sites visités et fichiers consultés )")
  TextGadget(#Text_SizeOf_TIFIE5_INDEXDAT, 640,72,120,20,"");,#PB_Text_Center)
  SetGadgetColor(#Text_SizeOf_TIFIE5_INDEXDAT, #PB_Gadget_FrontColor, RGB(143, 170, 184))
  SetGadgetFont(#Text_SizeOf_TIFIE5_INDEXDAT, Font0)
    
  CheckBoxGadget(#CHECK_COOKIES_INDEXDAT, 30, 100, 500, 20, "  Index.Dat dans    ..\Cookies   ( traces des cookies enregistrés sur le disque )")
  TextGadget(#Text_SizeOf_COOKIES_INDEXDAT, 640,102,120,20,"");,#PB_Text_Center)
  SetGadgetColor(#Text_SizeOf_COOKIES_INDEXDAT, #PB_Gadget_FrontColor, RGB(143, 170, 184))
  SetGadgetFont(#Text_SizeOf_COOKIES_INDEXDAT, Font0)
  
  CheckBoxGadget(#CHECK_HISTORY_IE5_INDEXDAT, 30, 130, 500, 20, "  Index.Dat dans    ..\History.IE5 ( historique Windows )")
  TextGadget(#Text_SizeOf_HISTORY_INDEXDAT, 640,132,120,20,"");,#PB_Text_Center)
  SetGadgetColor(#Text_SizeOf_HISTORY_INDEXDAT, #PB_Gadget_FrontColor, RGB(143, 170, 184))
  SetGadgetFont(#Text_SizeOf_HISTORY_INDEXDAT, Font0)
   
  CheckBoxGadget(#CHECK_HISTORY_IE5_URL_INDEXDAT, 30, 170, 500, 20, "  Index.Dat dans    ..\History.IE5\<DossierDate>\ ( historique par période des urls visitées )")
  ButtonGadget(#BtnScanUrlIndexDat,640,168,120,25,"Actualiser")
  GadgetToolTip(#BtnScanUrlIndexDat, "Analyser et afficher les fichiers de l'historique")
  ListIconGadget(#ListIconUrlIndexDatFiles,30,200,730,150,"Fichiers Index.Dat trouvés dans les sous-répertoires de l'historique",725)

  
  TextGadget(#Text_LastProcessDatFiles, 5,385,200,15,"Dernière exécution des tâches :")
  SetGadgetColor(#Text_LastProcessDatFiles, #PB_Gadget_FrontColor, RGB(143, 170, 184))
  ContainerGadget(#Container_Resultat, 5,400,470,100,#PB_Container_Single)  
    TextGadget(#TxtResultat_1,10,5,450,15,"")
    TextGadget(#TxtResultat_2,10,25,450,15,"")
    TextGadget(#TxtResultat_3,10,45,450,15,"")
    TextGadget(#TxtResultat_4,10,65,450,15,"")
  CloseGadgetList()
  
  Frame3DGadget(#FrameActivateDatFiles,480,390,300,110,"Activation")
  CheckBoxGadget(#ActivateDeleteIndexDat, 530, 420, 240, 20, "  Activer l'exécution des tâches sélectionnées")
  GadgetToolTip(#ActivateDeleteIndexDat, "Cocher pour activer / Décocher pour désactiver") 
  TextGadget(#Text_ActivateDeleteIndexDat, 500,455,260,30,"( Tant que le processus est activé, celui-ci sera exécuté à chaque démarrage du système. )")
  SetGadgetColor(#Text_ActivateDeleteIndexDat, #PB_Gadget_FrontColor, RGB(143, 170, 184))
  
  ButtonGadget(#BtnReboot,10,510,120,25,"Redémarrer")
   GadgetToolTip(#BtnReboot, "Redémarrer Windows maintenant en appliquant les actions choisies")
  ButtonGadget(#BtnCancel,400,510,120,25,"Annuler")
   GadgetToolTip(#BtnCancel, "Annuler les actions avant de quitter "+#ProgramName)
  ButtonGadget(#BtnQuit,660,510,120,25,"Quitter")
   GadgetToolTip(#BtnQuit, "Quitter "+#ProgramName+". Si l'activation est cochée, le programme s'exécutera au prochain démarrage.")
  
If FileSize(GetSystemDirectory(3)+"Content.IE5\index.dat") <> -1
 TIFDatSize$ = Str(FileSize(GetSystemDirectory(3)+"Content.IE5\index.dat")/1024)
 SetGadgetText(#Text_SizeOf_TIFIE5_INDEXDAT,"Taille :  "+TIFDatSize$+" ko")
EndIf 
If FileSize(GetSystemDirectory(5)+"index.dat") <> -1
 CookiesDatSize$ = Str(FileSize(GetSystemDirectory(5)+"index.dat")/1024)
 SetGadgetText(#Text_SizeOf_COOKIES_INDEXDAT,"Taille :  "+CookiesDatSize$+" ko")
EndIf
If FileSize(GetSystemDirectory(9)+"History.IE5\index.dat") <> -1
 HistoryDatSize$ = Str(FileSize(GetSystemDirectory(9)+"History.IE5\index.dat")/1024) 
 SetGadgetText(#Text_SizeOf_HISTORY_INDEXDAT,"Taille :  "+HistoryDatSize$+" ko")
EndIf 

; si le log existe, créé lors d'un précédent lancement, on charge les données pour les afficher
If FileSize(GetHomeDirectory()+"idatc.ini")<>-1
  If OpenPreferences(GetHomeDirectory()+"idatc.ini")<>0
      Res1$ = ReadPreferenceString("tifiles", "")
      Res2$ = ReadPreferenceString("cookies", "")
      Res3$ = ReadPreferenceString("history", "")
      Res4$ = ReadPreferenceString("Urlhistory", "")
      SetGadgetText(#TxtResultat_1,Res1$)
      SetGadgetText(#TxtResultat_2,Res2$)
      SetGadgetText(#TxtResultat_3,Res3$)
      SetGadgetText(#TxtResultat_4,Res4$)
     ClosePreferences() 
  EndIf
 Else 
  SetGadgetText(#TxtResultat_1,"Aucun nettoyage  n'a encore été effectué")
EndIf 

;Vérification de l'activation, chargement des paramètres
;Lancement du thread de nettoyage si activé
If VerifIndexDatCleanerActivate() = 1
  LoadIndexDatCleaner()
  CreateThread(@CleanIndexDat(),0)
EndIf

;-Event loop

 Repeat 
  Event = WaitWindowEvent()    
   Select Event
     Case #PB_Event_Gadget 
       Select EventGadget()
       
       Case #CHECK_TIF_IE5_INDEXDAT         : ActivateIndexDatCleaner()
       Case #CHECK_COOKIES_INDEXDAT         : ActivateIndexDatCleaner()
       Case #CHECK_HISTORY_IE5_INDEXDAT     : ActivateIndexDatCleaner()
       Case #CHECK_HISTORY_IE5_URL_INDEXDAT : ActivateIndexDatCleaner()
   
       Case #BtnScanUrlIndexDat ; Vérifie et affiche les fichiers index.dat s'il y a dans l'historique
         ClearGadgetItemList(#ListIconUrlIndexDatFiles)
          NbFiles=SearchFilesInit(GetSystemDirectory(9)+"History.IE5\","index.dat",1)
          Text.s=Str(NbFiles)+" Fichiers Index.Dat trouvés dans les sous-répertoires de l'historique"
            Repeat
             File.s=SearchFilesGet()
              If File="" : Break : EndIf
               AddGadgetItem(#ListIconUrlIndexDatFiles, -1, File)
               SetGadgetItemText(#ListIconUrlIndexDatFiles, -1, Text, 0)
            ForEver
          
       Case #ActivateDeleteIndexDat ; Activation par inscription dans le resgistre. lancement au redémarrage 
         If GetGadgetState(#ActivateDeleteIndexDat) = 1
           If RegCreateKeyEx_(#HKEY_LOCAL_MACHINE, "Software\Microsoft\Windows\CurrentVersion\Run", 0, 0, #REG_OPTION_NON_VOLATILE, #KEY_ALL_ACCESS, 0, @NewKey, @KeyInfo) = #ERROR_SUCCESS  
              StringBuffer$ = REP$+"IndexDatCleaner.exe" 
              RegSetValueEx_(NewKey, "IndexDatCleaner", 0, #REG_SZ,  StringBuffer$, Len(StringBuffer$)+1)
              RegCloseKey_(NewKey)  
           EndIf               
         Else
           DeleteRegValue(#HKEY_LOCAL_MACHINE, "Software\Microsoft\Windows\CurrentVersion\Run", "IndexDatCleaner")  
         EndIf    
         ActivateIndexDatCleaner()
      
      Case #BtnReboot : ComputerShutDown(3) ; redémarrer de suite

      Case #BtnCancel ; annule les checkbox et l'activation avant de fermer
       SetGadgetState(#CHECK_TIF_IE5_INDEXDAT,0)
       SetGadgetState(#CHECK_COOKIES_INDEXDAT,0)
       SetGadgetState(#CHECK_HISTORY_IE5_INDEXDAT,0)
       SetGadgetState(#CHECK_HISTORY_IE5_URL_INDEXDAT,0)
       SetGadgetState(#ActivateDeleteIndexDat,0)
       DeleteRegValue(#HKEY_LOCAL_MACHINE, "Software\Microsoft\Windows\CurrentVersion\Run", "IndexDatCleaner")
       ActivateIndexDatCleaner()
       Event = #PB_Event_CloseWindow


      Case #BtnQuit
       Event = #PB_Event_CloseWindow 
       
;- END                      
              
       EndSelect 
   EndSelect  
Until Event = #PB_Event_CloseWindow    
End       
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Message par Jacobus »

Je viens de modifier le code du 1er post car j'avais commis une erreur dans la fonction GetSystemDirectory() erreur de clé :?
l'affichage des tailles de fichiers index.dat ne fonctionnait pas, donc c'est corrigé. A retester pour ceux qui ont déjà essayé. :lol:

Pour tester sans compiler en exe, commenter le Thread. Vous aurez l'aperçu de la fenêtre avant test.
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Message par Jacobus »

Bah, personne n'a une petite idée? :roll: tant pis... merci quand même.
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Ben je comprend même pas à quoi ça sert. Je risque pas d'avoir des idées. :lol:
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Message par Jacobus »

Les fichier index.dat que l'on trouve dans le cache de IE et windows stockent toutes les infos de ce que fait l'utilisateur, qu'il s'agisse de l'utilisation de programmes ou encore des sites internet visités. Ces fichiers sont utilisés par le système et notamment explorer.exe, ils ne peuvent donc être supprimés ou recréés pendant une session. pour cela il faut tuer le process explorer.exe ou supprimer le dossier du niveau supérieur (j'ai essayé les deux mais sans résultat)

Normalement en redémarrant le système, si les fichiers en questions ne sont pas encore utilisés par windows, tu peux en faire ce que tu veux. Problème cela ne marche pas à tout les coups :?:
Sachant qu'en les supprimant, si windows ne les trouve pas en démarrant il en crée de nouveaux, vierges. Voilà le but du jeu, effacer les traces se trouvant dans ces index.dat.
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Message par Droopy »

J'ai modifié un code de flype permettant de nettoyer le cache de IE

Code : Tout sélectionner

;/ Flype

Structure INTERNET_CACHE_ENTRY_INFO 
  dwStructSize.l 
  lpszSourceUrlName.s 
  lpszLocalFileName.s 
  CacheEntryType.l 
  dwUseCount.l 
  dwHitRate.l 
  dwSizeLow.l 
  dwSizeHigh.l 
  LastModifiedTime.FILETIME 
  ExpireTime.FILETIME 
  LastAccessTime.FILETIME 
  LastSyncTime.FILETIME 
  lpHeaderInfo.l 
  dwHeaderInfoSize.l 
  lpszFileExtension.s 
  StructureUnion 
    dwReserved.l 
    dwExemptDelta.l 
  EndStructureUnion 
  Buffer.b[4096] 
EndStructure 

Structure CacheEntry
  Type.s
  Name.s
  Url.s
EndStructure

Procedure IE6CacheEntry()
  Static Init
  If Init=0
    Global NewList IE6CacheEntry_LList.CacheEntry()
    Init=1
  Else
    ClearList(IE6CacheEntry_LList())
  EndIf
  
  info.INTERNET_CACHE_ENTRY_INFO 
  Size.l = SizeOf(INTERNET_CACHE_ENTRY_INFO) 
  info\dwStructSize = SizeOf(INTERNET_CACHE_ENTRY_INFO) 
  hFile = FindFirstUrlCacheEntry_(EntryType, @info, @Size) 
  
  If hFile
    
    Repeat
      AddElement(IE6CacheEntry_LList())
      If info\CacheEntryType & $00100000        ; #COOKIE_CACHE_ENTRY
        IE6CacheEntry_LList()\Type="Cookie"
      ElseIf info\CacheEntryType & $00200000    ; #URLHISTORY_CACHE_ENTRY
        IE6CacheEntry_LList()\Type="History"
      Else
        IE6CacheEntry_LList()\Type="Other"
      EndIf
      
      IE6CacheEntry_LList()\Name=info\lpszLocalFileName 
      IE6CacheEntry_LList()\Url=info\lpszSourceUrlName 
      
    Until FindNextUrlCacheEntry_(hFile, @info, @Size) = -1 Or GetLastError_() = #ERROR_NO_MORE_ITEMS 
    FindCloseUrlCache_(hFile) 
  EndIf 
  
  ProcedureReturn CountList(IE6CacheEntry_LList())
EndProcedure

Procedure DeleteIE6CacheEntryType(Type.s) ; Cookie / History / Other / All
  ForEach IE6CacheEntry_LList()
    If UCase(IE6CacheEntry_LList()\Type)=UCase(Type) Or UCase(Type)="ALL"
      DeleteUrlCacheEntry_(IE6CacheEntry_LList()\Url)
      DeleteElement(IE6CacheEntry_LList())
    EndIf
  Next
EndProcedure

Entrees=IE6CacheEntry()
If Entrees
  ForEach IE6CacheEntry_LList()
    DeleteIE6CacheEntryType("All")
  Next
EndIf
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Message par Jacobus »

Sympa, mais ne marche pas pour les fichiers index.dat, ni l'historique des urls visitées. (je passe par le registre pour ces dernières et c'est plus rapide. Ton code fonctionne uniquement pour les fichiers internet temporaires, et pour une simple suppression c'est vrai que c'est rapide. Mais ce n'est pas ce que je recherche.

J'ai demandé à Oridan (il a trouvé la soluce pour son prog) en mp il y a une quinzaine, d'où l'anglais dans le code du premier post (j'ai pas tout réécris) mais il doit être en vacance ou bien il est mort...
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

Teste avec démarrage de l'OS, câble internet branché et puis câble débranché. Peut-être que selon ce paramètre, il ouvre ou pas ces fichiers au démarrage d'où le fonctionnement irrégulier.
Anonyme

Message par Anonyme »

http://www.delphifr.com/codes/VERROUILE ... 12742.aspx

je ne sais pas si cela peut t'aider ^^
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

oui! il existe un utilitaire qui permet de dévérouiller un fichier systeme de windows, (j'ai oublié le nom) donc ce doit bien etre possible a faire par code (API ?) :)
Anonyme

Message par Anonyme »

c'est unlocker le nom :D
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Message par Jacobus »

J'ai testé en fonction de vos suggestions mais hélas sans succès. En récupérant le handle du fichier et en le fermant avec l'api CloseHandle_(hfile) il semble que les fichiers soient en cours d'utilisation dès le démarrage, internet débranché aussi. :?

Si vous avez d'autres idées n'hésitez pas, merci encore. Arriverais bien à trouver :twisted:
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
KarLKoX
Messages : 1191
Inscription : jeu. 26/févr./2004 15:36
Localisation : France
Contact :

Message par KarLKoX »

Code : Tout sélectionner

Procedure.l       clsOpenedHandles_CloseProcessLocalHandle(*context.clsOpenedHandles_Context, dwProcessID.l, hHandle.l)
Protected hMod, lpProc, hThread, hProcess
Protected ret.l = 0
    
  ; on récupère le pointeur vers CloseHandle (kernel32.dll) (chargée dans tous les processus)
  hMod    = GetModuleHandle_("kernel32.dll");
  lpProc  = GetProcAddress_(hMod, "CloseHandle")
	
	; ouvre le processus pour y créer un thread
  hProcess = OpenProcess_(#PROCESS_CREATE_THREAD | #PROCESS_VM_OPERATION | #PROCESS_VM_WRITE | #PROCESS_VM_READ, 0, dwProcessID)
  If hProcess
    ; on lance le thread pour fermer le handle
    hThread = CreateRemoteThread_(hProcess, #Null, 0, lpProc, hHandle, 0, #Null)
    If hThread
      ; on attend la fin du thread
      WaitForSingleObject_(hThread, #INFINITE)
			; pour pouvoir obtenir son état de sortie
      GetExitCodeThread_(hThread, @ret)
      CloseHandle_(hThread)
    EndIf
    ; fermeture du handle du processus ouvert
    CloseHandle_(hProcess)
  EndIf
  
	ProcedureReturn ret
EndProcedure
Fait pas gaffe au premier param, le second est le handle du fichier (retourné par une tentative d'ouverture) et le pid du process qui l'a ouvert.
"Qui baise trop bouffe un poil." P. Desproges
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

P..., s'il réussit à toucher son fichier, je mange une de mes 2 c...
:D
KarLKoX
Messages : 1191
Inscription : jeu. 26/févr./2004 15:36
Localisation : France
Contact :

Message par KarLKoX »

C'est une partie du code de mon unlocker qui fonctionne sur TOUS les fichiers y a donc pas de raison que ça ne fonctionne pas pour Jacobus :wink:
"Qui baise trop bouffe un poil." P. Desproges
Répondre