[Цитировать]

    avalat
  • 222
  • Стаж: 9 лет 2 месяца
  • Сообщений: 450
  • Репутация:127

    [+] [-]
66941Здравствуйте.Есть программа для лечения жёсткого диска.Может кто написать GUI для этой проги.С возможностью выбора диска.
Undeground, BadNTFS_GUI.
.
.

О программе

BadNTFS v1.10 Freeware (c) Copyright D.Kuznetsov.
Программа работает исключительно с NTFS разделами.
Программа способна находить и помечать ВСЕ нестабильные и дефектные кластера на NTFS разделе, в том числе и те которые игнорируются функцией "Self-Healing" NTFS,
системой S.M.A.R.T. самого диска (не выполняется realloc) и конечно же не обнаруживаются с помощью chkdsk, что есть нередкое явление результатом которого становится необходимость приобретать новый жесткий диск, даже если речь идет об одном битом секторе.
К примеру если при чтении секторов возвращается ошибка 1117 (ERROR_IO_DEVICE) или подобные ошибки отличные от 23 ERROR_CRC.
Чем вызван такой тотальный игнор проблемы, существующей с момента появления NTFS, я не знаю, но проблема
в очередной раз постигла один из моих дисков и в результате появилась данная программа, которая ее успешно решает.
Функции:
1. Автоматическое удаление файлов попавших на дефектные кластера.
2. Автоматический перенос файлов и каталогов, попавших на нестабильный кластер с сохранением данных.
3. Возможность работы в среде RE.
4. (!) После внесения изменений в $BadClust необходимо запустить chkdsk с ключом /f для коррекции карты занятых кластеров и выявления возможных ошибок.
5. Бесполезна для SSD по очевидным причинам.
Формат badlog.txt
Файл представляет собой текстовый UNICODE файл, первые 2 байта FEFF, далее строки из 2-3 параметров разделенных 1 пробелом вида:
XXXXXX YYY filename
где, XXXXXX - номер кластера, YYY - номер записи соответствующего файла в MFT, filename - полный путь до файла (необязательный параметр)
YYY может принимать специальные значения -2 и -1,
-2 - кластер уже есть в $BadClust,
-1 - требуется найти соответствующий кластеру файл.
Ограничения:
- Раздел должен быть доступен для блокировки/размонтирования.
- Дефектный/нестабильный кластер должен быть свободным. В случае если кластер занят, программа произведет поиск файла/директории и при возможности его передвинет,
если же это невозможно или кластер принадлежит загрузочной области или метафайлу, то вам придется освободить его самостоятельно.

Дополнительная информация

В случае неправильного определения HDD ( по TRIM ) в настройках имеется пункт для разблокировки и продолжении работы


Последний раз редактировалось: avalat (2023-01-03 10:23), всего редактировалось 22 раз(а)

[Цитировать]

    nikzzzz
  • 215
  • Стаж: 9 лет 2 месяца
  • Сообщений: 3114
  • Репутация:127

    [+] [-]
avalat,
67103
А путаницы с буквами не получиться (если много чего понатыкано) ?
Да так вроде как-то наглядней и понятнее.
Поддерживаю, лучше выводить все разделы для выбора, легче будет в них сориентироваться, но как нибудь пометить не поддерживаемые и запретить их выбор.

[Цитировать]

    avalat
  • 222
  • Стаж: 9 лет 2 месяца
  • Сообщений: 450
  • Репутация:127

    [+] [-]
Сделаю скрытие кнопки "Старт" (при не NTFS)
Сделал неактивную кнопки "Старт" (при не NTFS)


Последний раз редактировалось: avalat (2019-05-16 20:16), всего редактировалось 2 раз(а)

[Цитировать]

    nikzzzz
  • 215
  • Стаж: 9 лет 2 месяца
  • Сообщений: 3114
  • Репутация:127

    [+] [-]
avalat,
67111Сделаю скрытие кнопки "Старт" (при не NTFS)
Может лучше не скрывать, а сделать не активной?
Да, и еще, SSD диски тоже лучше не трогать.
В строку запуска можно еще добавить chkdsk /f по рекомендации автора.
cmd.exe /c title BadNTFS - scan drive f:& BadNTFS_x86.exe f:&chkdsk.exe f: /f&pause

[Цитировать]

    vovan1982
  • 214
  • Стаж: 9 лет 2 месяца
  • Сообщений: 1098
  • Репутация:76

    [+] [-]
  • Откуда: Ростов-на-Дону
avalat, примерно так

[Цитировать]

    avalat
  • 222
  • Стаж: 9 лет 2 месяца
  • Сообщений: 450
  • Репутация:127

    [+] [-]
vovan1982,
Понял так, что сделать выбор по окончании работы cmd
-закрыть программу
-открыть log.txt
-и еще что-нибудь
Так ?

[Цитировать]

    vovan1982
  • 214
  • Стаж: 9 лет 2 месяца
  • Сообщений: 1098
  • Репутация:76

    [+] [-]
  • Откуда: Ростов-на-Дону
avalat, нет. Это консоль прям в окне программы.


Последний раз редактировалось: vovan1982 (2019-05-16 11:03), всего редактировалось 1 раз

[Цитировать]

    Adler
  • 1708
  • Стаж: 8 лет 5 месяцев
  • Сообщений: 1196
  • Репутация:65

    [+] [-]
  • Откуда: Луганск
avalat, это перехват вывода консольного приложения. Для PB что-то похожее тут написано.
P.S. Ох я с таким перехватом намучился на C# пока научил его синхронно выводить сообщения...

[Цитировать]

    nikzzzz
  • 215
  • Стаж: 9 лет 2 месяца
  • Сообщений: 3114
  • Репутация:127

    [+] [-]
67122Ох я с таким перехватом намучился на C# пока научил его синхронно выводить сообщения...
Это уж точно, синхронный перехват обсуждался здесь.

[Цитировать]

    AZJIO
  • 17953
  • Стаж: 6 лет 1 месяц
  • Сообщений: 1264
  • Репутация:127

    [+] [-]
В принципе GUI по захвату дисков уже есть, остаётся только менять команды. Комбо похоже не может сделать пункт недоступным, хотя можно поискать вариант через структуры, а листвью может.

[Цитировать]

    nikzzzz
  • 215
  • Стаж: 9 лет 2 месяца
  • Сообщений: 3114
  • Репутация:127

    [+] [-]
AZJIO, aa
67128Комбо похоже не может сделать пункт недоступным
Ну, почему не может.
Structure MyCB
  oldProc.i
  prevItm.i
  lastKey.i
EndStructure
wc.WNDCLASSEX\cbSize = SizeOf(WNDCLASSEX)
GetClassInfoEx_(GetModuleHandle_(0), @"ComboBox", @wc)
Global *TmpCB.MyCB, *Text=AllocateMemory(128), CBCB = wc\lpfnWndProc
Procedure ComboProc(hWnd, uMsg, wParam, lParam)
  *TmpCB = GetProp_(hWnd, "MyCB")
  If *TmpCB
    oldProc = *TmpCB\oldProc
  Else
    oldProc = CBCB;#WM_DELETEITEM
  EndIf
  Select uMsg
    Case #WM_KEYDOWN
      *TmpCB\lastKey = wParam
    Case #WM_NCDESTROY
      RemoveProp_(hWnd, "MyCB")
      FreeMemory(*TmpCB)
  EndSelect
  ProcedureReturn CallWindowProc_(oldProc, hWnd, uMsg, wParam, lParam)
EndProcedure
Procedure WinCallback(hWnd, uMsg, wParam, lParam)
  Select uMsg
    Case #WM_DRAWITEM
      *lpdis.DRAWITEMSTRUCT = lParam
      SetBkMode_(*lpdis\hDC, #TRANSPARENT)
      If *lpdis\CtlType = #ODT_COMBOBOX
        If *lpdis\itemState & #ODS_SELECTED
          If CallWindowProc_(CBCB, *lpdis\hwndItem, #CB_GETITEMDATA, *lpdis\itemID, 0) And *lpdis\itemID > -1
            *lpdis\CtlType = GetSysColorBrush_(#COLOR_BTNFACE)
          Else
            *lpdis\CtlType = GetSysColorBrush_(#COLOR_HIGHLIGHT)
          EndIf
        Else
          *lpdis\CtlType = GetSysColorBrush_(#COLOR_WINDOW)
        EndIf
        FillRect_(*lpdis\hDC, *lpdis\rcItem, *lpdis\CtlType)
        *lpdis\rcItem\left+4
        If CallWindowProc_(CBCB, *lpdis\hwndItem, #CB_GETLBTEXT, *lpdis\itemID, *Text) > -1
          If CallWindowProc_(CBCB, *lpdis\hwndItem, #CB_GETITEMDATA, *lpdis\itemID, 0);SendMessage_()
            SetTextColor_(*lpdis\hDC, #Gray);GetSysColor_(#COLOR_GRAYTEXT)
          EndIf
          DrawText_(*lpdis\hDC, *Text, -1, *lpdis\rcItem, #DT_NOCLIP|#DT_VCENTER|#DT_SINGLELINE)
          SetTextColor_(*lpdis\hDC, GetSysColor_(#COLOR_WINDOWTEXT))
        EndIf
      EndIf
    Case #WM_COMMAND
      *TmpCB = GetProp_(lParam, "MyCB"); it should be checked if pointer isn't NULL (too lazy for that)
      Select (wParam>>16) & $FFFF;HIWORD
        Case #CBN_SELCHANGE
          Var = CallWindowProc_(CBCB, lParam, #CB_GETCURSEL, 0, 0);SendMessage_()
          If Var <> *TmpCB\prevItm
            If CallWindowProc_(CBCB, lParam, #CB_GETITEMDATA, Var, 0);SendMessage_()
              If *TmpCB\lastKey = 38 Or *TmpCB\lastKey = 37;Up
                For i=Var-1 To 0 Step -1
                  If CallWindowProc_(CBCB, lParam, #CB_GETITEMDATA, i, 0) = #False
                    *TmpCB\prevItm = i : Break
                  EndIf
                Next
              ElseIf *TmpCB\lastKey = 40 Or *TmpCB\lastKey = 39;Down
                For i=Var+1 To CallWindowProc_(CBCB, lParam, #CB_GETCOUNT, 0, 0)-1
                  If CallWindowProc_(CBCB, lParam, #CB_GETITEMDATA, i, 0) = #False
                    *TmpCB\prevItm = i : Break
                  EndIf
                Next
              ElseIf *TmpCB\lastKey = 33;PgUp
                For i=0 To CallWindowProc_(CBCB, lParam, #CB_GETCOUNT, 0, 0)-1
                  If CallWindowProc_(CBCB, lParam, #CB_GETITEMDATA, i, 0) = #False
                    *TmpCB\prevItm = i : Break
                  EndIf
                Next
              ElseIf *TmpCB\lastKey = 34;PgDn
                For i=CallWindowProc_(CBCB, lParam, #CB_GETCOUNT, 0, 0)-1 To 0 Step -1
                  If CallWindowProc_(CBCB, lParam, #CB_GETITEMDATA, i, 0) = #False
                    *TmpCB\prevItm = i : Break
                  EndIf
                Next
              EndIf
              CallWindowProc_(CBCB, lParam, #CB_SETCURSEL, *TmpCB\prevItm, 0);SendMessage_()
            Else
              *TmpCB\prevItm = Var
            EndIf
          EndIf
        Case #CBN_DROPDOWN
          *TmpCB\lastKey = 0
      EndSelect
  EndSelect
  ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
Procedure MakeMyCB(ID)
  *TmpCB = AllocateMemory(SizeOf(MyCB))
  *TmpCB\prevItm = SendMessage_(GadgetID(ID), #CB_GETCURSEL, 0, 0)
  *TmpCB\oldProc = SetWindowLongPtr_(GadgetID(ID), #GWL_WNDPROC, @ComboProc())
  SetProp_(GadgetID(ID), "MyCB", *TmpCB)
EndProcedure
OpenWindow(0, 0, 0, 270, 140, "ComboBoxGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ComboBoxGadget(1, 10, 40, 250, 21, #CBS_OWNERDRAWFIXED|#CBS_HASSTRINGS)
For i = 1 To 10
  AddGadgetItem(1, -1, "ComboBox A Item " + Str(i))
Next
MakeMyCB(1)
SendMessage_(GadgetID(1), #CB_SETITEMDATA, 3, #True);DISABLE ITEM
SendMessage_(GadgetID(1), #CB_SETITEMDATA, 4, #True);DISABLE ITEM
SendMessage_(GadgetID(1), #CB_SETITEMDATA, 9, #True);DISABLE ITEM
SetWindowCallback(@WinCallback(), 0)
Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      Break
  EndSelect
ForEver
Более примитивный вариант, без подсветки
OpenWindow(0, 0, 0, 270, 180, "ComboBoxGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ComboBoxGadget(77, 10, 70, 250, 21)
For a = 0 To 4
  AddGadgetItem(77, -1,"ComboBox item " + Str(a))
Next
SetGadgetState(77, 0)
OldGadgetState=GetGadgetState(77)
While 1
  event=WaitWindowEvent()
  Select event
    Case #PB_Event_CloseWindow
      End
    Case #PB_Event_Gadget
      Select EventGadget()
        Case 77
;Запрещаем выбор item=2
          If GetGadgetState(77)=2
            SetGadgetState(77,OldGadgetState)
          Else
            OldGadgetState=GetGadgetState(77)
          EndIf
      EndSelect
  EndSelect
Wend

[Цитировать]

    gera_serg
  • 1171
  • Стаж: 8 лет 8 месяцев
  • Сообщений: 1421
  • Репутация:9

    [+] [-]
67070Есть программа для лечения жёсткого диска
А есть факты о способности программы "вылечить" жесткий диск ?
Запустил, раздел - OK (я и не понял или то ли раздел вылечила именно она, или и так конкретный раздел диска не плох был)

[Цитировать]

    Undeground
  • 19485
  • Стаж: 5 лет 5 месяцев
  • Сообщений: 31
  • Репутация:-6

    [+] [-]
Был у меня на локальном диске "D" один BAD сектор (где то в первой трети диска).Никакими прогами я его исправить не мог точнее они писАли,что всё исправлено). Когда система считывала информацию из этого сектора,то начинались жуткие тормоза. Случайно наткнулся на эту прогу в консольном варианте. Сабж нашёл этот BAD и благополучно его изолировал (как именно не знаю).Теперь весь софт из этой части диска работает без тормозов.Причём прога запоминает результат своей работы.Если сейчас запускаю повторное сканирование диска,то в консоли сразу отображается один помеченный BAD.
Меня результат работы программы устроил, поэтому попросил написать GUI. Спасибо avalat.

[Цитировать]

    avalat
  • 222
  • Стаж: 9 лет 2 месяца
  • Сообщений: 450
  • Репутация:127

    [+] [-]
nikzzzz
67113avalat, 67111
В строку запуска можно еще добавить chkdsk /f по рекомендации автора.
cmd.exe /c title BadNTFS - scan drive f:& BadNTFS_x86.exe f:&chkdsk.exe f: /f&pause
Запустил на одном компе в пешке(WiindowsPE7x64) 2k10 эту команду - пишет " chkdsk.exe не является внешней и внутренней командой ..." и.т.д. Почему то не получилось...
Может chkdsk.exe <disk> /f надо запускать отдельно (?!)

[Цитировать]

    Ander_73
  • 15549
  • Стаж: 7 лет 1 месяц
  • Сообщений: 3586
  • Репутация:127

    [+] [-]
avalat, вангую, что запуск произошёл в среде SysWOW64, а там как раз нет утилиты chkdsk.
То есть нужен перезапуск в "родной" х64 среде.

[Цитировать]

    nikzzzz
  • 215
  • Стаж: 9 лет 2 месяца
  • Сообщений: 3114
  • Репутация:127

    [+] [-]
avalat,
67178пишет " chkdsk.exe не является внешней и внутренней командой ...
Скомпилированное приложение x32 , поэтому chkdsk.exe ищется в SysWOW64, а не в System32 для x64 системы.
Для его корректной работы нужно проверить разрядность OS и в зависимости от нее запускать
%SystemRoot%\SysNative\chkdsk.exe для x64 системы
%SystemRoot%\System32\chkdsk.exe для x86 системы

Страница 2 из 5


Показать сообщения:    

Текущее время: 28-Мар 20:51

Часовой пояс: UTC + 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы можете скачивать файлы