Advertisement
AZJIO

ChkDskGui

Jan 25th, 2013
715
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
AutoIt 10.96 KB | None | 0 0
  1. #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
  2. #AutoIt3Wrapper_OutFile=ChkDskGui.exe
  3. ; #AutoIt3Wrapper_Compile_Both=y
  4. #AutoIt3Wrapper_OutFile_X64=ChkDskGuiX64.exe
  5. #AutoIt3Wrapper_UseX64=n
  6. #AutoIt3Wrapper_icon=ChkDskGui.ico
  7. #AutoIt3Wrapper_UseUpx=n
  8. ; #AutoIt3Wrapper_Compression=4
  9. #AutoIt3Wrapper_Res_Comment=-
  10. #AutoIt3Wrapper_Res_Description=ChkDskGui.exe
  11. #AutoIt3Wrapper_Res_Fileversion=0.2.0.0
  12. #AutoIt3Wrapper_Res_Fileversion_AutoIncrement=n
  13. #AutoIt3Wrapper_Res_LegalCopyright=AZJIO
  14. #AutoIt3Wrapper_Res_Language=1033
  15. #AutoIt3Wrapper_Run_AU3Check=n
  16. #AutoIt3Wrapper_Res_Field=Version|0.2
  17. #AutoIt3Wrapper_Res_Field=Build|2013.09.20
  18. #AutoIt3Wrapper_Res_Field=Coded by|AZJIO
  19. #AutoIt3Wrapper_Res_Field=CompanyName|AZJIO_Soft
  20. #AutoIt3Wrapper_Res_Field=Compile date|%longdate% %time%
  21. #AutoIt3Wrapper_Res_Field=AutoIt Version|%AutoItVer%
  22. #AutoIt3Wrapper_Run_Obfuscator=y
  23. #Obfuscator_Parameters=/sf /sv /om /cs=0 /cn=0
  24. ; #Obfuscator_Parameters=/SO
  25. #AutoIt3Wrapper_Run_After=del /f /q "%scriptdir%\%scriptfile%_Obfuscated.au3"
  26. #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
  27.  
  28. ;  @AZJIO 2013.09.20 AutoIt3_v3.3.8.1
  29.  
  30. #NoTrayIcon
  31. #include <ComboConstants.au3>
  32. #include <Constants.au3>
  33. #include <GUIConstantsEx.au3>
  34. #include <WindowsConstants.au3>
  35. #include <Encoding.au3>
  36. #include <UserGUI.au3>
  37.  
  38. Local $Lng[9]
  39. $Lng[0] = 'Check Disk'
  40. $Lng[1] = '\F - Fix disk errors'
  41. $Lng[2] = '\R - Recovering bad sectors'
  42. $Lng[3] = '\X - Forced dismount volume'
  43. $Lng[4] = 'Start'
  44. $Lng[5] = 'Viewing'
  45. $Lng[6] = 'Error'
  46. $Lng[7] = 'Not found any disk' & @LF & 'Completion of the program'
  47. $Lng[8] = 'Gb'
  48.  
  49. If @OSLang = 0419 Then
  50.     $Lng[0] = 'ChkDskGui - проверка дисков на ошибки'
  51.     $Lng[1] = '\F - Исправление ошибок на диске'
  52.     $Lng[2] = '\R - Восстановление поврежденных секторов'
  53.     $Lng[3] = '\X - Принудительное отключение тома'
  54.     $Lng[4] = 'Старт'
  55.     $Lng[5] = 'Просмотр'
  56.     $Lng[6] = 'Ошибка'
  57.     $Lng[7] = 'Не найдено ни одного диска' & @LF & 'Завершение программы'
  58.     $Lng[8] = 'Гб'
  59. EndIf
  60. If StringLen($Lng[8]) > 2 Then $Lng[8] = StringLeft($Lng[8], 2)
  61.  
  62. FileChangeDir(@ScriptDir)
  63.  
  64. _GetPath('chkdsk.exe') ; Возможно не нужно, но проверяет и предупреждает в случае, если не найден chkdsk.exe
  65. If @error Then Exit MsgBox(16 + 262144, $sTitle, $Lng[1] & @LF & $Lng[2])
  66.  
  67. Opt("GUIOnEventMode", 1)
  68. $sp = Chr(1)
  69. Opt("GUIDataSeparatorChar", $sp)
  70.  
  71. $sList = _GetDrv()
  72. If Not $sList Then Exit MsgBox(4096, $sTitle, $Lng[7])
  73.  
  74. $hGUI = GUICreate($Lng[0], 440, 130)
  75. ; GUISetIcon(@ScriptDir & '\ChkDskGui.ico')
  76. If Not @Compiled Then GUISetIcon(@ScriptDir & '\ChkDskGui.ico')
  77. GUISetOnEvent($GUI_EVENT_CLOSE, "_Form1Close")
  78.  
  79. $Current=StringRegExp($sList, '(?:\A|\001)([C-Z]: Fixed.*?)(?=\001)', 1)
  80. If @error Then
  81.     $Current = StringLeft($sList, StringInStr($sList & $sp, $sp) - 1)
  82. Else
  83.     $Current = $Current[0]
  84. EndIf
  85. $iCombo = GUICtrlCreateCombo("", 20, 16, 400, 25, $WS_VSCROLL + $CBS_DROPDOWNLIST)
  86. GUICtrlSetFont(-1, -1, -1, 0, "Courier New")
  87. GUICtrlSetData(-1, $sList, $Current)
  88. GUICtrlSetOnEvent(-1, "_Combo")
  89.  
  90. $iCh_ArgF = GUICtrlCreateCheckbox($Lng[1], 20, 45, 280, -1)
  91. GUICtrlSetState(-1, $GUI_CHECKED)
  92. GUICtrlSetOnEvent(-1, "_Ch_ArgF")
  93. $iCh_ArgR = GUICtrlCreateCheckbox($Lng[2], 20, 65, 280, -1)
  94. GUICtrlSetOnEvent(-1, "_Ch_ArgR")
  95. $iCh_ArgX = GUICtrlCreateCheckbox($Lng[3], 20, 85, 280, -1)
  96. GUICtrlSetOnEvent(-1, "_Ch_ArgX")
  97. GUICtrlSetState(-1, $GUI_CHECKED)
  98.  
  99. $iBtnHelp = GUICtrlCreateButton('?', 300, 77, 27, 32)
  100. ; $iBtnHelp = GUICtrlCreateButton('?', 305, 82, 22, 22)
  101. GUICtrlSetOnEvent(-1, "_Help")
  102. GUICtrlSetState(-1, $GUI_FOCUS + $GUI_DEFBUTTON)
  103.  
  104. $iBtnStart = GUICtrlCreateButton($Lng[4], 330, 77, 90, 32)
  105. GUICtrlSetOnEvent(-1, "_Start")
  106.  
  107. $iStatusBar = GUICtrlCreateLabel('chkdsk.exe' & _GetComString(), 20, 110, 420, 17)
  108.  
  109. GUISetState()
  110.  
  111. While 1
  112.     Sleep(10000)
  113. WEnd
  114.  
  115. Func _Combo()
  116.     GUICtrlSetData($iStatusBar, 'chkdsk.exe' & _GetComString())
  117. EndFunc
  118.  
  119. Func _Ch_ArgF()
  120.     If GUICtrlRead($iCh_ArgF) = $GUI_UNCHECKED Then
  121.         GUICtrlSetState($iCh_ArgX, $GUI_UNCHECKED)
  122.         GUICtrlSetState($iCh_ArgR, $GUI_UNCHECKED)
  123.     EndIf
  124.     GUICtrlSetData($iStatusBar, 'chkdsk.exe' & _GetComString())
  125. EndFunc
  126.  
  127. Func _Ch_ArgR()
  128.     GUICtrlSetState($iCh_ArgF, $GUI_CHECKED)
  129.     GUICtrlSetData($iStatusBar, 'chkdsk.exe' & _GetComString())
  130. EndFunc
  131.  
  132. Func _Ch_ArgX()
  133.     If GUICtrlRead($iCh_ArgX) = $GUI_CHECKED Then GUICtrlSetState($iCh_ArgF, $GUI_CHECKED)
  134.     GUICtrlSetData($iStatusBar, 'chkdsk.exe' & _GetComString())
  135. EndFunc
  136.  
  137. Func _Form1Close()
  138.     Exit
  139. EndFunc
  140.  
  141. Func _GetComString()
  142.     Local $sComString, $tmp
  143.     $tmp = StringRegExp(GUICtrlRead($iCombo), '(?i)^.{6}([a-z]:).+', 1)
  144.     If @error Then
  145.         Return SetError(1, 0, $Lng[6])
  146.     Else
  147.         $sComString &= ' ' & $tmp[0]
  148.     EndIf
  149.     If GUICtrlRead($iCh_ArgF) = $GUI_CHECKED Then $sComString &= " /F"
  150.     If GUICtrlRead($iCh_ArgR) = $GUI_CHECKED Then $sComString &= " /R"
  151.     If GUICtrlRead($iCh_ArgX) = $GUI_CHECKED Then $sComString &= " /X"
  152.     Return $sComString
  153. EndFunc   ;==>_GetComString
  154.  
  155. Func _Start()
  156.     Local $sComString = _GetComString()
  157.     If @error Then
  158.         GUICtrlSetData($iStatusBar, $Lng[6])
  159.         Return SetError(1, 0, $Lng[6])
  160.     EndIf
  161.  
  162.     _BtnDisable()
  163.     ; Color 3b
  164.     RunWait(@ComSpec & ' /c (Title Check Disk & @Echo off & Color 1e & cls & chkdsk.exe' & $sComString & ' & set /p Ok=^>^>)')
  165.     _BtnDisable($GUI_ENABLE)
  166. EndFunc
  167.  
  168. Func _Help() ; coded by AZJIO (2013.09.20)
  169.     Local $iPID, $sOut, $tmp
  170.     $iPID = Run('chkdsk.exe /?', @ScriptDir, @SW_HIDE, $STDOUT_CHILD)
  171.     While 1
  172.         $tmp = StdoutRead($iPID)
  173.         If @error Then ExitLoop
  174.         If $tmp Then $sOut &= @CRLF & $tmp
  175.     WEnd
  176.     If $sOut Then
  177.         _Viewing($hGUI, _Encoding_866To1251($sOut))
  178.     EndIf
  179. EndFunc   ;==>_Help
  180.  
  181. ; Func _Help()
  182.     ; _BtnDisable()
  183.     ; RunWait(@ComSpec & ' /c (Title Check Disk & @Echo off & Color 1e & cls & chkdsk.exe /? & set /p Ok=^>^>)')
  184.     ; _BtnDisable($GUI_ENABLE)
  185. ; EndFunc   ;==>_Help
  186.  
  187. Func _BtnDisable($iState = $GUI_DISABLE)
  188.     GUICtrlSetState($iBtnHelp, $iState)
  189.     GUICtrlSetState($iBtnStart, $iState)
  190. EndFunc   ;==>_Help
  191.  
  192. Func _Viewing($hGUI, $sLog) ; coded by AZJIO (2013.09.20)
  193.     Local $hGuiLog, $aRect, $iEdit
  194.     $aRect = _GetChildCoor($hGUI, 560, 330)
  195.     GUISetState(@SW_DISABLE, $hGUI)
  196.  
  197.     $hGuiLog = GUICreate($Lng[5], $aRect[0], $aRect[1], $aRect[2], $aRect[3], BitOR($WS_OVERLAPPEDWINDOW, $WS_POPUP), -1, $hGUI)
  198.     If Not @Compiled Then GUISetIcon(@ScriptDir & '\ChkDskGui.ico')
  199.  
  200.     $iEdit = GUICtrlCreateEdit('', 0, 0, $aRect[0], $aRect[1])
  201.  
  202.     GUISetState(@SW_SHOW, $hGuiLog)
  203.  
  204.     GUICtrlSetData($iEdit, $sLog)
  205.  
  206.     Opt("GUIOnEventMode", 0)
  207.     Do
  208.     Until GUIGetMsg() = $GUI_EVENT_CLOSE
  209.     Opt("GUIOnEventMode", 1)
  210.     GUISetState(@SW_ENABLE, $hGUI)
  211.     GUIDelete($hGuiLog)
  212. EndFunc   ;==>_Viewing
  213.  
  214. Func _GetDrv()
  215.     Local $sInfo = _ComboListDrive('Fixed')
  216.     $sInfo &= _ComboListDrive('Removable')
  217.     Return StringTrimLeft($sInfo, 1)
  218. EndFunc
  219.  
  220. Func _ComboListDrive($Type) ; coded by AZJIO (2013.01.26)
  221.     Local $aDrive = DriveGetDrive($Type), $list = '', $sString, $sLabel, $aDisc_Partition
  222.     If @error Then Return ''
  223.     If $Type = 'Removable' Then $Type = 'Rem'
  224.     For $i = 1 To $aDrive[0]
  225.         If $aDrive[$i] = 'A:' Then ContinueLoop
  226.         $sLabel = DriveGetLabel($aDrive[$i])
  227.         If StringLen($sLabel) > 15 Then $sLabel = StringLeft($sLabel, 12) & '...'
  228.         $aDisc_Partition = _GetDiskNimberForDrive($aDrive[$i])
  229.         ; If @error Then Local $aDisc_Partition[2] = ['?', '?']
  230.         $sString = StringFormat('%2s:%-2s %-2s %-5s %-15s %-5s ', $aDisc_Partition[0], $aDisc_Partition[1], StringUpper($aDrive[$i]), $Type, $sLabel, _
  231.                 DriveGetFileSystem($aDrive[$i])) & _GetSize(DriveSpaceTotal($aDrive[$i])) & ' ' & $Lng[8]
  232.         $list &= $sp & $sString
  233.     Next
  234.     Return $list
  235. EndFunc   ;==>_ComboListDrive
  236.  
  237. Func _GetSize($s)
  238.     $s = StringFormat('%.03f', $s / 1024)
  239.     If StringLen($s) > 7 Then $s = StringRegExpReplace(StringTrimRight($s, 4), '(\A\d{1,3}(?=(\d{3})+\z)|\d{3}(?=\d))', '\1 ') & StringRight($s, 4)
  240.     Return StringFormat('%9s', $s) ; 9 терабайт
  241. EndFunc
  242.  
  243.  
  244. ; http://www.autoitscript.com/forum/topic/91598-get-disk-number-from-drive-letter/?p=659721
  245. ; Описание ........: Возвращает номер диска и номер раздела в формате n:n (<номер диска>:<номер раздела>)
  246. ; Параметры:
  247. ;       $sDriveLetter - Буква диска с двоеточием, например C:
  248. ;                   Неудачно , возвращает -1, @error:
  249. ;                  |1 - Ошибка CreateFile, ваша система очень старая
  250. ;                  |2 - Диск не существует
  251. ;                  |3 - Неудачный вызов DeviceIoControl
  252. ;                  |4 - Не раздела диска
  253. Func _GetDiskNimberForDrive($sDriveLetter) ; Буква диска
  254.  
  255.     Local $aDrive[2] = ['?', '?']
  256.  
  257.     Local $a_hCall = DllCall("kernel32.dll", "hwnd", "CreateFile", _
  258.             "str", "\\.\" & $sDriveLetter, _; Буква диска
  259.             "dword", 0, _
  260.             "dword", 0, _
  261.             "ptr", 0, _
  262.             "dword", 3, _; OPEN_EXISTING
  263.             "dword", 128, _; FILE_ATTRIBUTE_NORMAL
  264.             "ptr", 0)
  265.  
  266.     If @error Then
  267.         Return SetError(1, 0, $aDrive); Ваша система очень старая. Сделайте что-нибудь.
  268.     EndIf
  269.  
  270.     If $a_hCall[0] = -1 Then
  271.         Return SetError(2, 0, $aDrive) ; Диск не существует
  272.     EndIf
  273.  
  274.     Local $hDevice = $a_hCall[0]
  275.  
  276.     Local $tIOCTL_STORAGE_GET_DEVICE_NUMBER = DllStructCreate("dword DeviceType;" & _
  277.             "dword DeviceNumber;" & _
  278.             "int PartitionNumber")
  279.  
  280.     Local $a_iCall = DllCall("kernel32.dll", "int", "DeviceIoControl", _
  281.             "hwnd", $hDevice, _
  282.             "dword", 0x2D1080, _; IOCTL_STORAGE_GET_DEVICE_NUMBER
  283.             "ptr", 0, _
  284.             "dword", 0, _
  285.             "ptr", DllStructGetPtr($tIOCTL_STORAGE_GET_DEVICE_NUMBER), _
  286.             "dword", DllStructGetSize($tIOCTL_STORAGE_GET_DEVICE_NUMBER), _
  287.             "dword*", 0, _
  288.             "ptr", 0)
  289.  
  290.     If @error Or Not $a_hCall[0] Then
  291.         DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hDevice)
  292.         Return SetError(3, 0, $aDrive); неудачный вызов DeviceIoControl
  293.     EndIf
  294.  
  295.     DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hDevice)
  296.  
  297.     If DllStructGetData($tIOCTL_STORAGE_GET_DEVICE_NUMBER, "DeviceType") = 7 Then; FILE_DEVICE_DISK
  298.         $aDrive[0] = DllStructGetData($tIOCTL_STORAGE_GET_DEVICE_NUMBER, "DeviceNumber")
  299.         $aDrive[1] = DllStructGetData($tIOCTL_STORAGE_GET_DEVICE_NUMBER, "PartitionNumber")
  300.         Return SetError(0, 0, $aDrive)
  301.     EndIf
  302.  
  303.     Return SetError(4, 0, $aDrive); Не раздела диска
  304.  
  305. EndFunc   ;==>_GetDiskNimberForDrive
  306.  
  307. Func _GetPath($sFile)
  308.     Local $tmp = _WinAPI_PathFindOnPath($sFile, @ScriptDir)
  309.     If Not @error Then Return $tmp
  310.     ; Теоритически эти пути уже есть в %PATH%, но проверим ещё раз
  311.     If FileExists(@SystemDir & '\' & $sFile) Then
  312.         Return @SystemDir & '\' & $sFile
  313.     ElseIf FileExists(@WindowsDir & '\' & $sFile) Then
  314.         Return @WindowsDir & '\' & $sFile
  315.     EndIf
  316.     Return SetError(1)
  317. EndFunc   ;==>_GetPath
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement