Родни де Маниак
18:54 25-03-2007
Night Nord (NightNord@gmail.com). Исследовательская работа - "Выполняемые приложения в среде ОС Виндовс семейства NT"

Прочитав неоднократно про bugoga в exe-шнике на bash.org.ru и попробывав сам, я задумался - а фигли? Первая идея - символы bu в hex-кодах (В одной из цитат - достаточно "bu" для достижения такого же эффекта) являются неким необходимым хеадером для формата exe. Однако эксперименты показали - достаточно символа b для подвисания консольки и рандомного перемещения курсора. Да и формат exe похитрее. + почему запускается консолька? Тут я вспомнил, что в винде ваще много выполняемых форматов - bat, wsc, vbs, и... досовский com. Вспомнив это, я опять же вспомнил, что эксперементируя со строками, я наткнулся на то, что если написать "Бугага" (по-русски, без кавычек, с болькой буквы), то винда выдает ошибку с сообщзением что процесср нашел неправильный код операции и проч, но! в заголовке - "16-битная система MS-DOS"! ЭТО ФОРМАТ COM. Т.е. винда запуская exe видит, что оный exe не соответствует формату и, в отличие от wine, просто доунгрейдит его до com, которому, видимо, никакой формат не нужен. Ком - это просто набор инструкций процессора, без излишеств. Однако нормальное поведение com'а - это дойти до конца и завершится, а не гадить на принтер, а тут оно зацикливается. От одной буквы! От hex-кода 62.

Рассмотрев повнимательнее "рандомно скачующий курсор" и поведение моего матричного принтера я понял - прога выкидывает ВО ВСЕ ВЫХОДНЫЕ ПОТОКИ пустые строки в случае с "b", а в случае с "bu" что-то типа tab'ов. А в винде есть поток принтера! И курсор скачет просто от того, что виндовая консоль поддтормаживает от такого кол-ва инфы и посему двигает курсор рывками. А принтера, ибо умные, пробелы не печатают, а просто двигают головку. Т.е. в случае с b - двигают понемногу, поэтому, бумага ездит медленно, а с bu - помногу. Вот оно!

Возникает справедливый вопрос "почему от одной буквы такой эффект"? Подозреваю от бага в ms-dos'е винды. Комманда 62 (кто знает ассемблер, что за комманда?), подозреваю, вызывает какую-то системную фичу (прерывание?) передавая ей что-либо (указатель на строку), которая кадает эту (строку?) во все существующие выходные потоки. Однако если переданно ничего не было или переданно что-то не то, фичу глючит и она циклется, а прога честно ждет окончания ее работы. Почему нельзя удаить файл? Это как раз просто - com программы должны заканчиватся на специальную комманду возврата управления (ret?), аки return в Си. А этой комманды нет. В результате, из-за очередного бага в ms-dos'e, даже после убиения процесса, прога остается в памяти. Или эксплорер не разлочивает файл.

За сим очередь любителей ассемблера и дебаггеров - пусть они попробуют запихать это дело в SoftICE (у мну он не встанет - Daemon Tools, а винду переставлять неохота) и посмотреть че там происходит конкретно. И незабудте сообщить о результатах на новый форум психов-программистов - bash.org.ru - Взгляд в Безду!