shmuz / LuaFAR

A library for writing Far Manager plugins in Lua.
11 stars 3 forks source link

По следам баг-репортов на forum.ru-board.com - падение с кодом 0xC0000001D #1

Closed VictorVG closed 12 years ago

VictorVG commented 12 years ago

Получил на руборде баг-репорт (http://forum.ru-board.com/topic.cgi?forum=5&topic=31718&start=2360#7 ) на свою сборку, стал смотреть в чём дело и нарвался на стенде с AMD Athlon XP (ядро Barton, система каманд i686) на код ошибки 0х1D - не поддерживаемая машинная команда. А раз Pentium E5400 связку кода LuaFar 3.0.5 + LuaSearch 3.0.2 + Luasearch-addons 1.4 + Lua4Edit 3.0.3 выполняет без ошибок, значит процессор подходит. И потому я бы в документации обязательно указал под какой ЦПУ и с каким набором команд программа откомпилирована, и если возможно, то стоит её пересобрать под систему команд i686 - это обеспечит универсальность кода и его применимость на всех эксплуатируемых сегодня системах, в т.ч. и на бюджетных машинах с интегрированными в платы ЦП VIA C3 - C7 (можем считать что у них система команд i686) благо этого добра в фирмах и госссекторе предостаточно, и лет на десять ещё точно хватит - сроки амортизации оборудования не вышли, и его просто никто не спишет под замену. Тормозом выступят ведомственные/корпоративные инструкции и деньги. Нарушил - оплати из своего кармана все убытки конторы. Просто и надёжно.:)

shmuz commented 12 years ago

код ошибки 0х1D - не поддерживаемая машинная команда

У меня нет машины с AMD Athlon, поэтому проверить не могу. Желательно было бы получить более точный репорт:

VictorVG commented 12 years ago

Посмотрел по исходникам, особенно по мэйкам где может возникнуть не контролируемая привязка к процессору. Нашёл только одно место - GCC. Он при сборке подстраивается под установленный в машине процессор если явно не укажем в опциях g++ - в строке "CCFLAGS=$(CCPCFG) -march=i686 или "CCFLAGS=$(CCPCFG) -mtype=i686 нужный нам целевой ЦП. Сам этой его автоподстройкой активно пользуюсь при обновлении демонёнка из портов - зачем мне ставить код который может быть собран под ЦП с другой системой команд, коли я могу при компиляции подстроить программу под свой?

shmuz commented 12 years ago

Мне бы всё же хотелось получить ответы на свои 5 вопросов, если можно.

VictorVG commented 12 years ago

Тестовый стенд AMD Athlox XP3000+ (х86, набор команд Intel Pentium !!! с расширениями AMD 3D!New (MMX) и AMD 3D!New Pro (SSE и управление питанием)), ОС Windows 7 SP 1 х86 MSDN без каких либо самодепальных изменений - только оригинальный код с официальными обновлениями (проблем со стендом по вине самодельной "операционной системы" мне ещё не хватало.:)), UAC отключён как явление, группа weel, права - root (пардон, привык на UNIX - Админ), т.е. по идее выше уровень привилегий только Local System....

По аппаратным причинам проверить AMD64 код не возможно - гранаты не той системы.:)

Условия тестирования:

1) серия тестов Far 3.0.2534 x86, чистый профиль, только стандартные плагины собираемые из репозитория вместе с Far 3 без MacroView, сборка Far в MS VC++ 11 (MS VS 2010 SP1) без изменений в исходном коде, дополнительно установлены отсюда (взял со страницы загрузки) - LuaFAR for Editor 3.0.3 х86, LuaFar Search 3.0.2 x86, Luasearch-addons 1.4 x86, LuaFar 3.0.5 x86

Да, повторяется, повторяемость 100% - контроль показывает возникновенеие NMI в кодом 0х0000001D - "Попытка выполнить не поддерживаемую машинную команду".

Ошибка повторяется для:

LuaFAR for Editor 3.0.3 х86 + LuaFar Search 3.0.2 x86 + Luasearch-addons 1.4 x86 + LuaFar 3.0.5 x86 всегда, если на старом ЦПУ попытаться создать в редакторе новй файл, то при любой операции Far падает.

Убираем LuaFar for Editor - редактор работает, но если вызвать LuaFar Search то, при использовании LuaFar 3.0.5 х86 падаем сразу, именно с кодом NMI 0х1D.

Ситуация несколько улучшается если ставить LuaFar 3.0.4 - пару секунд до трапа имеем, хватает чтобы семёрка закрыла задачу.

На всякий случай я сделал дам памяти процесса - http://narod.ru/disk/43201579001.2fa7f3d552cfbe1e6ad57a681198141e/Far.exe.dmp.7z.html

и скриншот ошибки:

http://s019.radikal.ru/i617/1203/95/1de4e72f50fa.png

а так же списал системное сообщение со стенда с указанием на ошибку:

Версия модуля с ошибкой: 3.0.5.0 Отметка времени модуля с ошибкой: 4f51c5da Код исключения: c000001d Смещение исключения: 0001990f Версия ОС: 6.1.7601.2.1.0.256.1 Код языка: 1049 Дополнительные сведения 1: 0a9e Дополнительные сведения 2: 0a9e372d3b4ad19135b953a78882e789 Дополнительные сведения 3: 0a9e Дополнительные сведения 4: 0a9e372d3b4ad19135b953a78882e789

В эксперименте использовались: ночная сборка Far 3.0.2534 x86 и плагины загруженные с офсайтов, дополнительным плагином был NetBox для Far 3.0 v2.0.14 x86, но его в ОЗУ по идее быть не должно - он специально не вызывался, а сам он не грузится, просто распакован для другой серии тестов.

Именно код исключения - c000001d и сказал мне в чём причина - машинная команда не реализованная в микрокоде стендового ЦПУ. Ранее мы с таким оба сталкивались на Пашиной RESearch 7.50 beta 6 - если мы вспомним, то Паша предположил, что код для Core 2 Duo будет работать несколько быстрее чем generic i686 код и выбрал эту платформу при сборке (. В итоге на старых ЦПУ возникало это исключение.

Второй раз я уже сам с ним столкнулся на одной из машине у себя в локалке - Corel Paint Shop Pro X4 собран так же под Core 2 Duo и на старом CPU у художницы возникла такая же проблема. Я тогда диассемблером установил что система команд содержит команды SSE3, которых старый Athlon XP 2100+ конечно не имеет. Даже первые AMD64 не имели поддержки SSE2 - только в Mobile Athlon64 её добавили (лежит у меня такой - Nobile Athlon64 3400+ @1600 MHz :Socket 754 - только радиатора под него нет штатного - сам доделывал, и платы его в упор не понимают, а жаль - греется слабо, кэш 2 Мб, SSE, SSE2:))

shmuz commented 12 years ago

Большое спасибо за детальное описание! И всё-таки попрошу проверить плагины lfsearch и/или lf4ed совершенно отдельно, а именно, запуская Фар с ключом /p<папка плагина> , например:

"C:\Program Files\Far3\Far.exe" /p"C:\Program Files\Far3\Plugins\lfsearch"

Естественно, надо подставить реальные пути к Фару и плагину, а не те, что в моём примере.

VictorVG commented 12 years ago

Сделаю..Проверю их поодиночке и дам отчёт о результатах.

VictorVG commented 12 years ago

Проверка под Win7. Far 3.0.2534 x86,

Стенд:

процессор AMD Athlon XP 3000+ работает в штатных режимах без разгона, m/b ASUS A7V600 (чипсет VIA KT600 (северный мост VIA KT600, южный мост VIA VT8237R), ОЗУ 2x512 MB DDR400 Samsung 3-3-3-8, видеоплата ASUS GF9560 Ultra/128 Mb, IEEE-1394A VIA VT6306 PHY, подключённая периферия: USB Card Rider CIR-100, BlueTooch CSW BTM01C2AC, иная периферия - PS/2 мышь и клавиатура, сенсоры системной платы и контрольно-измерительные приборы подтверждают штатные режимы узлов (т.е. влияние нештатных временных режимов ("разгона") приводящих к сбою цифровых схем можно исключить полностью:

Sensors:

[System] Virtual Memory Commited 1555.000 MB Virtual Memory Available 511.000 MB Virtual Memory Load 75.000 % Physical Memory Used 717.000 MB Physical Memory Available 305.000 MB Physical Memory Load 70.000 % [CPU #0] Core #0 Clock 2100.1 MHz Core #0 Usage 42.5 % Total CPU Usage 42.5 %

[ITE IT8712F] CPU 44.0 °C Motherboard 42.0 °C Vcore 1.696 V +3.3V 3.280 V +5V 4.892 V +12V 12.096 V 5VSB 5.000 V CPU 5192 RPM

[HDD Temperature.] WDC WD2500JB-19GVA 38.0 °C Seagate ST3160811AS 34,0 °C Seagate ST3160811AS 34,0 °C WDC WD400BB-60DGA0 37,0 °C

[nVidia GPU[#0] nVIDIA GeForce FX 5600 Ultra (NV31)] GPU Clock 399.0 MHz GPU Memory Clock 399.0 MHz [NVAPI @ GPU[#0] nVIDIA GeForce FX 5600 Ultra (NV31)] GPU Temperature 42.0 °C GPU Ambient Temperature 37.0 °C GPU Memory Load 100.0 % GPU Fan 100.000 % GPU Memory Allocated 128.000 MB [Maxim @ GPU[#0] nVIDIA GeForce FX 5600 Ultra (NV31)] GPU Temperature 42.0 °C GPU Ambient Temperature 37.0 °C

все плагины удалены, в каталоге Far имеем только сам Far.exe и языковые файлы, все БД профиля стёрты, в Far.exe.ini стоят значения (во всех тестах используется хранение профиля в каталоге $FARHOME):

[General] UseSystemProfiles=0 UserProfileDir=%FARHOME%\Profile GlobalUserMenuDir=%FARHOME% DefaultLanguage=Russian

запуск производим батником в новой копии консоли:

@echo off del /f/s/q Profile\plugincache. D:\Work\far\Far.exe /p"D:\Work\far\plugins\lfs" del /s/f/q Profile\plugincache.

Проверяем LuaFar 3.0.5, luafar-addons 1.4, LuaFar Search 3.0.2. Вызываем поиск в панелях - падаем.

Стек:

Треды:

4572, 0,13, 2 738 682, Far.exe+0x19c60a, Normal 3856, , , Far.exe+0x19a6df, Normal

TID=4572

0, ntoskrnl.exe!KiDeliverApc+0x111 1, ntoskrnl.exe!KeRemoveQueueEx+0x990 2, ntoskrnl.exe!KeDelayExecutionThread+0x5cc 3, ntoskrnl.exe!KeDelayExecutionThread+0x2aa 4, ntoskrnl.exe!IoSetIoCompletionEx+0x98f 5, ntoskrnl.exe!ZwYieldExecution+0xb62 6, ntdll.dll!KiFastSystemCallRet 7, KernelBase.dll!Sleep+0xf 8, Far.exe+0x10cee4 9, Far.exe+0x128796 10, Far.exe+0x12892d 11, Far.exe+0x90a6e 12, Far.exe+0xb51e7 13, Far.exe+0xb5a11 14, Far.exe+0xb5bca 15, Far.exe+0x13dd90 16, Far.exe+0x156bc7 17, Far.exe+0x12763e 18, Far.exe+0x12830e 19, Far.exe+0x128805 20, Far.exe+0x128980 21, Far.exe+0x1254d6 22, Far.exe+0x1264ad 23, Far.exe+0x19c5b4 24, kernel32.dll!BaseThreadInitThunk+0x12 25, ntdll.dll!RtlInitializeExceptionChain+0xef 26, ntdll.dll!RtlInitializeExceptionChain+0xc2

TID=3856

0, ntoskrnl.exe!KiDeliverApc+0x111 1, ntoskrnl.exe!KeRemoveQueueEx+0x990 2, ntoskrnl.exe!KeDelayExecutionThread+0x5cc 3, ntoskrnl.exe!KeWaitForSingleObject+0x393 4, win32k.sys!EngUnlockSurface+0x15db 5, win32k.sys!EngUnlockSurface+0x13e8 6, win32k.sys!EngLockSurface+0x620 7, win32k.sys!EngUnlockSurface+0x19a7 8, ntoskrnl.exe!ZwYieldExecution+0xb62 9, ntdll.dll!KiFastSystemCallRet 10, Far.exe+0x196f48 11, Far.exe+0x19a6b9 12, Far.exe+0x19a743 13, kernel32.dll!BaseThreadInitThunk+0x12 14, ntdll.dll!RtlInitializeExceptionChain+0xef 15, ntdll.dll!RtlInitializeExceptionChain+0xc2

Скриншот исключения:

╔═════════════════════ Исключительная ситуация ══ ║ Исключение: Недопустимая инструкция
║ Адрес: 0x6831990F
║ Функция: OpenW
║ Модуль: D:\Work\Far\plugins\lfs\lfsearch_e.dll
╟───────────────────────────────────────── ║ { Выгрузить плагин } [ Отладка ]
╚═════════════════════════════════════════

Сообщение системы:

Сигнатура проблемы:

Имя события проблемы: APPCRASH Имя приложения: Far.exe Версия приложения: 3.0.2534.0 Отметка времени приложения: 4f593a40 Имя модуля с ошибкой: luafar3.dll Версия модуля с ошибкой: 3.0.5.0 Отметка времени модуля с ошибкой: 4f51c5da Код исключения: c000001d Смещение исключения: 0001990f Версия ОС: 6.1.7601.2.1.0.256.1 Код языка: 1049 Дополнительные сведения 1: 0a9e Дополнительные сведения 2: 0a9e372d3b4ad19135b953a78882e789 Дополнительные сведения 3: 0a9e Дополнительные сведения 4: 0a9e372d3b4ad19135b953a78882e789

убираем luafar-addons и оставляем только LFS + LuaFar, повторяем проверку, получаем то же исключение с сообщением системы:

Сигнатура проблемы: Имя события проблемы: APPCRASH Имя приложения: Far.exe Версия приложения: 3.0.2534.0 Отметка времени приложения: 4f593a40 Имя модуля с ошибкой: luafar3.dll Версия модуля с ошибкой: 3.0.5.0 Отметка времени модуля с ошибкой: 4f51c5da Код исключения: c000001d Смещение исключения: 0001990f Версия ОС: 6.1.7601.2.1.0.256.1 Код языка: 1049 Дополнительные сведения 1: 0a9e Дополнительные сведения 2: 0a9e372d3b4ad19135b953a78882e789 Дополнительные сведения 3: 0a9e Дополнительные сведения 4: 0a9e372d3b4ad19135b953a78882e789

Проверяем связку LuaFar 3.0.5 + LuaFar for Editor 3.0.3 + luafar-addons 1.4.. Используем чистый профиль: Пытаемся создать новый файл в редакторе и вставить в него содержимое клирборда - вновь падаем:

Скриншот падения:

╔═════════════════════ Исключительная ситуация ═════ ║ Исключение: Недопустимая инструкция ║ Адрес: 0x683134FE ║ Функция: ProcessEditorInputW ║ Модуль: D:\Work\Far\plugins\lfe\lf4ed_e.dll ╟───────────────────────────────────────────── ║ { Выгрузить плагин } [ Отладка ] ╚═════════════════════════════════════════════

Стек вызовов:

Треды:

4144, 0,10, 2 179 588, Far.exe+0x19c60a, Normal 3312, , , Far.exe+0x19a6df, Normal

TID=4144

0, ntoskrnl.exe!KiDeliverApc+0x111 1, ntoskrnl.exe!KeRemoveQueueEx+0x990 2, ntoskrnl.exe!KeDelayExecutionThread+0x5cc 3, ntoskrnl.exe!KeDelayExecutionThread+0x2aa 4, ntoskrnl.exe!IoSetIoCompletionEx+0x98f 5, ntoskrnl.exe!ZwYieldExecution+0xb62 6, ntdll.dll!KiFastSystemCallRet 7, KernelBase.dll!Sleep+0xf 8, Far.exe+0x10cee4 9, Far.exe+0x128796 10, Far.exe+0x12892d 11, Far.exe+0x90a6e 12, Far.exe+0xb51e7 13, Far.exe+0xb5a11 14, Far.exe+0xb5bca 15, Far.exe+0x13def7 16, Far.exe+0x150475 17, Far.exe+0xbff1b 18, Far.exe+0xc14fe 19, Far.exe+0x1282ca 20, Far.exe+0x128805 21, Far.exe+0x128980 22, Far.exe+0x1254d6 23, Far.exe+0x1264ad 24, Far.exe+0x19c5b4 25, kernel32.dll!BaseThreadInitThunk+0x12 26, ntdll.dll!RtlInitializeExceptionChain+0xef 27, ntdll.dll!RtlInitializeExceptionChain+0xc2

TID=3312

0, ntoskrnl.exe!KiDeliverApc+0x111 1, ntoskrnl.exe!KeRemoveQueueEx+0x990 2, ntoskrnl.exe!KeDelayExecutionThread+0x5cc 3, ntoskrnl.exe!KeDelayExecutionThread+0x2aa 4, ntoskrnl.exe!IoSetIoCompletionEx+0x98f 5, ntoskrnl.exe!ZwYieldExecution+0xb62 6, ntdll.dll!KiFastSystemCallRet 7, KernelBase.dll!Sleep+0xf 8, Far.exe+0x10cee4 9, Far.exe+0x128796 10, Far.exe+0x12892d 11, Far.exe+0x90a6e 12, Far.exe+0xb51e7 13, Far.exe+0xb5a11 14, Far.exe+0xb5bca 15, Far.exe+0x13def7 16, Far.exe+0x150475 17, Far.exe+0xbff1b 18, Far.exe+0xc14fe 19, Far.exe+0x1282ca 20, Far.exe+0x128805 21, Far.exe+0x128980 22, Far.exe+0x1254d6 23, Far.exe+0x1264ad 24, Far.exe+0x19c5b4 25, kernel32.dll!BaseThreadInitThunk+0x12 26, ntdll.dll!RtlInitializeExceptionChain+0xef 27, ntdll.dll!RtlInitializeExceptionChain+0xc2

Сообщение системы:

Сигнатура проблемы: Имя события проблемы: APPCRASH Имя приложения: Far.exe Версия приложения: 3.0.2534.0 Отметка времени приложения: 4f593a40 Имя модуля с ошибкой: luafar3.dll Версия модуля с ошибкой: 3.0.5.0 Отметка времени модуля с ошибкой: 4f51c5da Код исключения: c000001d Смещение исключения: 000134fe Версия ОС: 6.1.7601.2.1.0.256.1 Код языка: 1049 Дополнительные сведения 1: 0a9e Дополнительные сведения 2: 0a9e372d3b4ad19135b953a78882e789 Дополнительные сведения 3: 0a9e Дополнительные сведения 4: 0a9e372d3b4ad19135b953a78882e789

Проверяем связку LuaFar 3.0.5 + LuaFar for Editor 3.0.3.. Используем чистый профиль: Пытаемся создать новый файл в редакторе и вставить в него содержимое клирборда - вновь падаем с сообщением системы:

Сигнатура проблемы: Имя события проблемы: APPCRASH Имя приложения: Far.exe Версия приложения: 3.0.2534.0 Отметка времени приложения: 4f593a40 Имя модуля с ошибкой: luafar3.dll Версия модуля с ошибкой: 3.0.5.0 Отметка времени модуля с ошибкой: 4f51c5da Код исключения: c000001d Смещение исключения: 000134fe Версия ОС: 6.1.7601.2.1.0.256.1 Код языка: 1049 Дополнительные сведения 1: 0a9e Дополнительные сведения 2: 0a9e372d3b4ad19135b953a78882e789 Дополнительные сведения 3: 0a9e Дополнительные сведения 4: 0a9e372d3b4ad19135b953a78882e789

картина стека подобна предыдущему тесту.

VictorVG commented 12 years ago

Пока я такое решение придумал:

... cpudesc::tell Pop $R0 ; получаем в стек NSIS список декодированных системой возможностей ЦПУ из Реестра StrCpy $1 $R0 1, 41 ; смотрим поддерживает ли ЦПУ команды SSE2.и если да, то переходим дальше, нет удаляем LuaFar от греха подальше :) StrCmp $1 1 m1 Delete "$EXEDIR\lua5.1.dll" Delete "$EXEDIR\luafar3.dll" Delete "$EXEDIR\onig.dll" Delete "$EXEDIR\pcre.dll" RMDir /r "$EXEDIR\plugins\lfs" RMDir /r "$EXEDIR\plugins\luaedt" m1: ....

и за счёт него я надеюсь выиграть нам время для устранения причины ошибки - закоментить ( - синтаксис комментариев такой же как в С/C++ - "/* */" или для одиночной строки ";" ) этот блок дело секундное. А после перекомпилировал прямо из консоли (makensis .nsi) и готово.:)

shmuz commented 12 years ago

Ещё раз большое спасибо! Проблема существует, повторяемость 100%, следовательно нет причин, чтобы её не устранить. Накоплено достаточно данных для анализа, надеюсь, что в ближайшие дни мне удастся найти оптимальное решение.

shmuz commented 12 years ago

Ну, и пока я "ищу", просьба выполнить такой опыт. По адресам, приведенным ниже, находятся luafar3.dll версии 3.0.5, собранные с применением других флагов или другого компилятора.

Каждую из них нужно испытать по очереди, переименовав сначала в luafar3.dll, поставив её вместо той, что идёт в дистрибутиве и перезапустив Фар. Да, и не надо подробного отчёта, всё что меня сейчас интересует, это работает или не работает.

Заранее благодарен!

VictorVG commented 12 years ago

Сделаю, как проверю напишу. Думаю в течении часа - полутора дойду до стенда и там посмотрю.

VictorVG commented 12 years ago

Файл i686 скачался сразу, а на..mingw32 в первый раз столкнулся с такой ошибкой сервиса что даже SRWare Iron 17.0.1000.0 в итоге неё упал:):

На этой странице обнаружена циклическая переадресация Веб-страница http://www.fayloobmennik.net//////////////////////files/go/21247636.html?check=5cb751ecdaca3e0690898216e81cf10c&file=1640927 привела к избыточному количеству переадресаций. Чтобы устранить эту проблему, можно удалить файлы cookie для этого сайта или разрешить файлы cookie независимых поставщиков. Если проблема сохранится, возможно, она связана с конфигурацией сервера, а не с вашим компьютером. Вот несколько советов и рекомендаций: Обновите эту страницу позже. Подробнее об этой неполадке. Ошибка 310 (net::ERR_TOO_MANY_REDIRECTS): Обнаружено слишком много переадресаций.

Зато SeaMonkey взял его с первой попытки:). Пойду смотреть что у нас вышло.

VictorVG commented 12 years ago

Результаты:

1) вариант .686 - работает без замечаний, ошибка устранена 2) вариант .mingw32 - работает без замечаний, ошибка устранена

смело можем использовать ключ -о3 в MinGW/TDM-GCC при сборке и как мы думали:

CCFLAGS=$(CCPCFG) -march=i686 -o3 или "CCFLAGS=$(CCPCFG) -mtype=i686 -o3 - выиграем и во времени выполнения и не столь правда сильно как для -о2 в размере бинарника.

shmuz commented 12 years ago

Огромное спасибо, вроде как проблема, получается, разрешилась!

В следующей версии уже буду пользоваться, видимо, вариантом -march=i686, так как вариант с MinGW32 не позволяет собирать 64-битные бинарники. Насчёт -o3 я не уверен, можно нарваться ещё на какой-то баг. Кстати, проблема, которой мы занимались, это явно баг TDM MinGW64, поскольку в случае, когда CPU явно не указан, GCC должен производить бинарники, совместимые даже с 386 процессором. Вот цитата из мануала GCC:

While picking a specific cpu-type will schedule things appropriately for that particular chip, the compiler will not generate any code that does not run on the i386 without the ‘-march=cpu-type’ option being used.

VictorVG commented 12 years ago

А, если TDM64, то всё ясно - когда мы командуем configure он динамически детектит тип ЦП и подстраивается под него устанавливая в мэйке переменную ARCH=$(ARCH) в тот тип ЦП который выдаёт ему система и его собственный детектор. Достаточно было в майке вместо $(ARCH) задать явно -march=i686 и тогда он будет собирать бинарник с нужной нам системой команд i686. Можем простоперевыложить luafar-3.0.5 с luafar3.dll.i686 и проблема испарится.

Баг закрываем как решённый? На борде я уже написал что сделать, парни кто захочет сами пересоберут. А с -о3 да, могут вылезти подземные стуки, согласен и нарывался. Лучше оставим -о2 от греха подальше.

shmuz commented 12 years ago

Да, конечно, баг сегодня закрою. Перевыкладывать LuaFAR не буду, сейчас и так временные промежутки между версиями невелики. Если кто-то в ближайшее время пожалуется, то решение имеется. Спасибо за сотрудничество!

VictorVG commented 12 years ago

Ну и отлично. Я с нашего общего согласия попробую сейчас его закрыть.

P.S.

Проклятый Online Armor пора сносить - более глючной программы я не видел.... Блокирует сдуру всё подряд, на правила эта стенка ноль внимания - смотрит только на список платных программ от своих горе-авторов и их друзей...:(