[Quote]

    avalat
  • 222
  • Longevity: 6 years 8 months
  • Posts: 223
  • REPUTATION:67

    [+] [-]
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 ) в настройках имеется пункт для разблокировки и продолжении работы


Last edited by avalat on 2021-08-22 20:57; edited 21 times in total

[Quote]

    nikzzzz
  • 215
  • Longevity: 6 years 8 months
  • Posts: 3225
  • REPUTATION:127

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

[Quote]

    avalat
  • 222
  • Longevity: 6 years 8 months
  • Posts: 223
  • REPUTATION:67

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


Last edited by avalat on 2019-05-16 20:16; edited 2 times in total

[Quote]

    nikzzzz
  • 215
  • Longevity: 6 years 8 months
  • Posts: 3225
  • REPUTATION:127

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

[Quote]

    vovan1982
  • 214
  • Longevity: 6 years 9 months
  • Posts: 1045
  • REPUTATION:69

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

[Quote]

    avalat
  • 222
  • Longevity: 6 years 8 months
  • Posts: 223
  • REPUTATION:67

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

[Quote]

    vovan1982
  • 214
  • Longevity: 6 years 9 months
  • Posts: 1045
  • REPUTATION:69

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


Last edited by vovan1982 on 2019-05-16 11:03; edited 1 time in total

[Quote]

    Adler
  • 1708
  • Longevity: 6 years
  • Posts: 1132
  • REPUTATION:60

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

[Quote]

    nikzzzz
  • 215
  • Longevity: 6 years 8 months
  • Posts: 3225
  • REPUTATION:127

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

[Quote]

    AZJIO
  • 17953
  • Longevity: 3 years 7 months
  • Posts: 670
  • REPUTATION:88

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

[Quote]

    nikzzzz
  • 215
  • Longevity: 6 years 8 months
  • Posts: 3225
  • REPUTATION: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

[Quote]

    gera_serg
  • 1171
  • Longevity: 6 years 3 months
  • Posts: 1491
  • REPUTATION:9

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

[Quote]

    Undeground
  • 19485
  • Longevity: 2 years 11 months
  • Posts: 18
  • REPUTATION:0

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

[Quote]

    avalat
  • 222
  • Longevity: 6 years 8 months
  • Posts: 223
  • REPUTATION:67

    [+] [-]
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 надо запускать отдельно (?!)

[Quote]

    Ander_73
  • 15549
  • Longevity: 4 years 8 months
  • Posts: 2518
  • REPUTATION:127

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

[Quote]

    nikzzzz
  • 215
  • Longevity: 6 years 8 months
  • Posts: 3225
  • REPUTATION:127

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

Page 2 of 5


Display posts:    

Current time is: 24-Oct 07:22

All times are UTC + 3


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum
You cannot attach files in this forum
You can download files in this forum