avalat
- Стаж: 9 лет
- Сообщений: 468
- Репутация: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 раз(а)
|
avalat
- Стаж: 9 лет
- Сообщений: 468
- Репутация:127[+] [-]
|
Сделаю скрытие кнопки "Старт" (при не NTFS) Сделал неактивную кнопки "Старт" (при не NTFS)
Последний раз редактировалось: avalat (2019-05-16 20:16), всего редактировалось 2 раз(а)
|
nikzzzz
- Стаж: 9 лет
- Сообщений: 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
- Стаж: 9 лет
- Сообщений: 1132
- Репутация:77[+] [-]
- Откуда: Ростов-на-Дону
|
avalat, примерно так
|
vovan1982
- Стаж: 9 лет
- Сообщений: 1132
- Репутация:77[+] [-]
- Откуда: Ростов-на-Дону
|
avalat, нет. Это консоль прям в окне программы.
Последний раз редактировалось: vovan1982 (2019-05-16 11:03), всего редактировалось 1 раз
|
Adler
- Стаж: 9 лет 2 месяца
- Сообщений: 1214
- Репутация:65[+] [-]
- Откуда: Луганск
|
avalat, это перехват вывода консольного приложения. Для PB что-то похожее тут написано. P.S. Ох я с таким перехватом намучился на C# пока научил его синхронно выводить сообщения...
|
nikzzzz
- Стаж: 9 лет
- Сообщений: 3114
- Репутация:127[+] [-]
|
67122Ох я с таким перехватом намучился на C# пока научил его синхронно выводить сообщения... Это уж точно, синхронный перехват обсуждался здесь.
|
nikzzzz
- Стаж: 9 лет
- Сообщений: 3114
- Репутация:127[+] [-]
|
AZJIO, 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
|
Отправлено: 18-Май-2019 11:19
(спустя 1 день 18 часов)
avalat
- Стаж: 9 лет
- Сообщений: 468
- Репутация:127[+] [-]
|
nikzzzz67113avalat, 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
- Стаж: 7 лет 10 месяцев
- Сообщений: 3839
- Репутация:127[+] [-]
|
avalat, вангую, что запуск произошёл в среде SysWOW64, а там как раз нет утилиты chkdsk. То есть нужен перезапуск в "родной" х64 среде.
|
nikzzzz
- Стаж: 9 лет
- Сообщений: 3114
- Репутация:127[+] [-]
|
avalat,67178пишет " chkdsk.exe не является внешней и внутренней командой ... Скомпилированное приложение x32 , поэтому chkdsk.exe ищется в SysWOW64, а не в System32 для x64 системы. Для его корректной работы нужно проверить разрядность OS и в зависимости от нее запускать %SystemRoot%\SysNative\chkdsk.exe для x64 системы %SystemRoot%\System32\chkdsk.exe для x86 системы
|
nikzzzz
- Стаж: 9 лет
- Сообщений: 3114
- Репутация:127[+] [-]
|
avalat Примерно как-то так, не проверял.cmd.exe /c title BadNTFS - scan drive f:& BadNTFS_x86.exe f:&if defined PROCESSOR_ARCHITEW6432 (%SystemRoot%\SysNative\chkdsk.exe f: /f&pause&exit) else (%SystemRoot%\System32\chkdsk.exe f: /f&pause&exit) Или в самом приложении проверять разрядность, и формировать в зависимости от нее строку запуска. Исправил ошибку.
|
AZJIO
- Стаж: 6 лет 9 месяцев
- Сообщений: 1324
- Репутация:127[+] [-]
|
nikzzzz, лучше заранее проверять чтобы не столкнуться с ограничением длины строки, а то мало ли что ещё захочется добавить, типа форматирование вывода. avalat, посмотри у меня в теме, мы эту проблему уже обсуждали, gera_serg может тебе кучу советов дать что нигде не работает.
|
Страница 2 из 5
Текущее время: 12-Дек 05:35
Часовой пояс: UTC + 3
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете прикреплять файлы к сообщениям Вы можете скачивать файлы
|
|